【问题标题】:CSV not properly being parsed on new linesCSV 未在新行上正确解析
【发布时间】:2013-11-12 14:37:09
【问题描述】:

我有一个 CSV 文件,如下所示:

Header1,Header2,Header3
value1,value2,value3
value11,value12,value13
value21,value22,value23

等等……

当我使用这段代码解析它时:

$csvData = file_get_contents($file_url);
$lines = explode(" ", $csvData);
$array = array();
foreach ($lines as $line) {
    $array[] = str_getcsv($line);
}
dpm($array);

一行的第一个值总是作为最后一个标题末尾的一部分:

编辑:缓存肯定有问题,因为它工作正常。

【问题讨论】:

  • 你为什么要在太空爆炸?
  • @Alma - str_getcsv() 是一个标准的 PHP 函数
  • 为什么不直接使用fgetcsv()呢?如果任何行/字段自然包含空格,explode() 可能会破坏您的输入。
  • @AlmaDo str_getcsv 是 PHP 内置的函数,dpm 是 Drupal 函数,它的打印结果类似于 var_dump。 php.net/manual/en/function.str-getcsv.php
  • dpm() 函数来自 OP 的 other question – @Alma – 它甚至可能在这里发挥作用。

标签: php arrays parsing csv file-get-contents


【解决方案1】:

对于读取 CSV 文件,explode() 和 file_get_contents() 不是正确的选项。去fgetcsv 您可以执行以下操作来读取 CSV 文件:

<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}
?>

【讨论】:

    【解决方案2】:

    使用file 代替file_get_contents。这将返回一个数组,每个索引上都有一行输入文件。这将适用于所有可能的换行符。

    $lines = file($file_url, FILE_IGNORE_NEW_LINES)
    

    【讨论】:

      【解决方案3】:

      您可能希望将换行符换成换行符 ("\n") 而不仅仅是空格 (" ")。更好的是,您可能希望使用file() 将文件行加载到数组中。更好的是,您可能希望使用 SplFileObject 类来做到这一点:

      <?php
      $file = new SplFileObject($file_url);
      $file->setFlags(SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY
          | SplFileObject::DROP_NEW_LINE | SplFileObject::READ_AHEAD);
      $data = array();
      
      foreach ($file as $row) {
          $data[] = $row;
      }
      

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2016-11-25
        • 2012-08-31
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多