从csv到带有行尾字符的数组

时间:2014-11-13 15:45:47

标签: php csv

使用此函数解析php im中的CSV文件:

private function _csvToArray($url, $delimiter=',')
{
    $csvData = file_get_contents($url);
    $lines = explode(PHP_EOL, $csvData);
    $array = array();
    foreach ($lines as $line) {
        $array[] = str_getcsv($line, $delimiter);
    }

    return $array;
}

这里的问题是我使用EOL确定一条线的结束位置,如果CSV文件有任何字段,任何行结束字符都会出错。

示例:

Product_Name, "Description"
Product_Name, "Description"
Product_Name, "Description"
Product_Name, "Description"

这没关系,但如果我有这样的事情:

Product_Name, "Description_line_1
Description_line_2"
Product_Name, "Description_line_1
Description_line_2"
Product_Name, "Description_line_1
Description_line_2"

脚本会失败,有没有什么方法可以改进脚本以便考虑这个或者最好在调用sript之前使用正则表达式来修复CSV?

3 个答案:

答案 0 :(得分:0)

这样的事情应该有用(没有正确测试代码):

$csv = array_map('str_getcsv', file($url), ',', '"');

我有一个旧代码,周围为我修复了一次...但请记住......它是从回来的方式;

$url = 'file.csv';
$csv = array();
$csvContents = file_get_contents($url);

$lines = explode('"'."\n", trim($csvContents));
foreach($lines as $lineNumber => $line) {
    $csv[$lineNumber] = array();
    $fields = explode(',', $line);
    foreach($fields as $field) {
        $csv[$lineNumber][] = ltrim(rtrim($field, '"'), '"');
    }
}

答案 1 :(得分:0)

如果您想自己保存写入临时文件,可以使用内存流。

private function _csvToArray($url, $delimiter=',')
{
    $fp = fopen('php://memory', 'r+');
    fwrite($fp, file_get_contents($url));

    fseek($fp, 0);

    $array = array();

    while ($row = fgetcsv($fp, 0, $delimiter)) {
        $array[] = $row;
    }

    fclose($fp);

    return $array;
}

答案 2 :(得分:0)

如果字段数据在机箱字符之间,

fgetcsv可以在字段中处理EOL。

private function _csvToArray($url, $delimiter=',', $enclosure='"')
{
    $handle = fopen($url, 'r');
    $array = array();

    while($row = fgetcsv($handle, 0, $delimiter, $enclosure))
    {
        $array[] = $row;
    }

    fclose($handle);
    return $array;
}