PHP CSV字符串到数组

Tom*_*zie 39 php csv parsing

我正在尝试将CS​​V字符串解析为PHP中的数组.CSV字符串具有以下属性:

Delimiter: ,
Enclosure: "
New line: \r\n
Run Code Online (Sandbox Code Playgroud)

示例内容:

"12345","Computers","Acer","4","Varta","5.93","1","0.04","27-05-2013"
"12346","Computers","Acer","5","Decra","5.94","1","0.04","27-05-2013"
Run Code Online (Sandbox Code Playgroud)

当我尝试解析它时:

$url = "http://www.url-to-feed.com";
$csv = file_get_contents($url);
$data = str_getcsv($csv);
var_dump($data);
Run Code Online (Sandbox Code Playgroud)

最后一个元素和一个元素串在一个字符串中:

[0]=> string(5) "12345"
...
[7]=> string(4) "0.04"
[8]=> string(19) "27-05-2013
"12346""
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?任何帮助,将不胜感激.

sar*_*jee 107

做这个:

$csvData = file_get_contents($fileName);
$lines = explode(PHP_EOL, $csvData);
$array = array();
foreach ($lines as $line) {
    $array[] = str_getcsv($line);
}
print_r($array);
Run Code Online (Sandbox Code Playgroud)

它会给你一个像这样的输出:

Array
(
    [0] => Array
        (
            [0] => 12345
            [1] => Computers
            [2] => Acer
            [3] => 4
            [4] => Varta
            [5] => 5.93
            [6] => 1
            [7] => 0.04
            [8] => 27-05-2013
        )

    [1] => Array
        (
            [0] => 12346
            [1] => Computers
            [2] => Acer
            [3] => 5
            [4] => Decra
            [5] => 5.94
            [6] => 1
            [7] => 0.04
            [8] => 27-05-2013
        )

)
Run Code Online (Sandbox Code Playgroud)

我希望这可以提供一些帮助.

  • 对于多行CSV字段,此操作失败 (13认同)
  • 仅使用`fgetcsv()`!因为 `explode(PHP_EOL, $csvData)` 不能正确解析 csv 字符串中的换行符!请参阅下面的正确答案。 (3认同)
  • 我是合法的好奇,但是有一个原因,为什么这比Gaui的简单的单线解决方案更好,或者人们只是赞成这个,因为它是选定的答案? (2认同)
  • 这可能会导致一个罕见的问题,如果你的值中包含换行符,那么`PHP_EOL`会将值拆分为2个不同的数组值. (2认同)

Gau*_*aui 37

方便的oneliner:

$csv = array_map('str_getcsv', file('data.csv'));
Run Code Online (Sandbox Code Playgroud)

  • 多行CSV字段失败,不是吗? (9认同)
  • 将无法处理字段内的新行.接受的答案通过PHP_EOL解决了这个问题.如果你没有我想的新线路,那就太好了.谢谢你的努力. (2认同)
  • 应该归功于这个方便的一个班轮的作者:http://php.net/manual/en/function.str-getcsv.php(见第一条评论) (2认同)
  • @Alex 在方法 https://secure.php.net/manual/en/function.str-getcsv.php 的文档中详细介绍了如何更改分隔符(例如,使用分号而不是逗号),以及围栏和逃生。所以这个方法同样有效,只是你需要多挖掘一点并阅读文档。PHP 文档写得很好,并且有很多例子。 (2认同)

iat*_*nut 22

你应该使用fgetcsv. 由于您无法将文件作为流导入,因为csv是变量,因此您应该使用php://tempphp://memory首先将字符串伪装成文件:

$fp = fopen("php://temp", 'r+');
fputs($fp, $csvText);
rewind($fp);
Run Code Online (Sandbox Code Playgroud)

然后使用fgetcsv就没问题了:

$csv = [];
while ( ($data = fgetcsv($fp) ) !== FALSE ) {
    $csv[] = $data;
}
Run Code Online (Sandbox Code Playgroud)

$data 将是一个单个csv行的数组(可能包括换行符或逗号等),因为它应该是.

  • 这是实际上正确处理字段内新行的少数答案之一..它应该有更多的赞成. (8认同)
  • 这是最好的方法!不要使用`file('data.csv')`或`explode(PHP_EOL,$ csv)`,因为它们不能正确解析csv字符串中的换行符! (3认同)

小智 7

我使用以下函数将csv字符串解析为关联数组

public function csvToArray($file) {
    $rows = array();
    $headers = array();
    if (file_exists($file) && is_readable($file)) {
        $handle = fopen($file, 'r');
        while (!feof($handle)) {
            $row = fgetcsv($handle, 10240, ',', '"');
            if (empty($headers))
                $headers = $row;
            else if (is_array($row)) {
                array_splice($row, count($headers));
                $rows[] = array_combine($headers, $row);
            }
        }
        fclose($handle);
    } else {
        throw new Exception($file . ' doesn`t exist or is not readable.');
    }
    return $rows;
}
Run Code Online (Sandbox Code Playgroud)

如果您的csv文件名是mycsv.csv,那么您将此函数称为:

$dataArray = csvToArray(mycsv.csv);
Run Code Online (Sandbox Code Playgroud)

您也可以在http://www.scriptville.in/parse-csv-data-to-array/中获取此脚本