PHP CSV 字符串到数组

2022-08-30 09:47:55

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

Delimiter: ,
Enclosure: "
New line: \r\n

示例内容:

"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"

当我尝试像这样解析它时:

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

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

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

我该如何解决这个问题?任何帮助将不胜感激。


答案 1

请执行下列操作:

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

它将为您提供如下输出:

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
        )

)

我希望这可以有所帮助。


答案 2

你应该使用 fgetcsv。由于 csv 是一个变量,因此您无法将文件作为流导入,因此您应该使用 或 首先将字符串作为文件进行欺骗:php://tempphp://memory

$fp = fopen("php://temp", 'r+');
fputs($fp, $csvText);
rewind($fp);

然后,使用 fgetcsv 就不会有问题:

$csv = [];
while ( ($data = fgetcsv($fp) ) !== FALSE ) {
    $csv[] = $data;
}
fclose($fp)

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

警告:php://temp 的内存限制可以通过附加 /maxmemory:NN 来控制,其中 NN 是使用临时文件之前要保留在内存中的最大数据量,以字节为单位。(默认值为 2 MB)http://www.php.net/manual/en/wrappers.php.php


推荐