【问题标题】:Parsing a CSV - random output解析 CSV - 随机输出
【发布时间】:2013-06-03 22:27:21
【问题描述】:

我有一个如下所示的 CSV 文件(大约有 500 行)

ID,Title,LastName,HouseNo,Street,City,Postcode,Telephone
1209109,Miss,Test,1635,Test Road,Test, AB12 2EF,
1209833,Mrs,Test,3,Test Close,Test,BB12 2EF,
1205839,Miss,Test,1,Test Road,Test,AA12 2EX,

然后我正在使用以下 PHP:

$handle = fopen($csvFile, "r");
$imports = array();

$row = 1;
echo "<table>";
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
{
       // skip headers
       if($row == 1){ $row++; continue; }
       echo "<tr>";
       echo "<td>$data[0]</td>";
       echo "<td>$data[1]</td>";
       echo "<tr>";

} 
echo "</table>";
fclose($handle);`

我希望是这样的:

1209109   Miss
1209833   Mrs

但由于某种原因,它似乎从文件中的一个随机点开始,然后在错误的&lt;td&gt; 中输出一些数据。

provlem 可以是每行的尾随逗号吗?

谢谢

【问题讨论】:

  • 我从未见过每行末尾都带有逗号的 CSV 文件,您是否尝试过删除它们
  • 我认为结尾的逗号只会在输出中添加一个额外的空列......我怀疑这是你的问题
  • @meda,我经常看到他们。当某人没有最后一列的数据,但懒得检查时。 CSV 解析器不应因此而失败。
  • 提供的 PHP 代码和 CSV 在我的本地机器上运行良好。您确定这些是您用于测试的相同文件吗?
  • 您可能想要检查您正在使用的换行符 (EOL) 字符。通常是\n,但有时是\r...这可能会导致一些问题?

标签: php csv fgetcsv


【解决方案1】:

我猜您遇到的问题是行尾 (EOL) 不匹配。基本上,fgetcsv() 函数根据换行符分解文件,但它期望使用与正在使用文件的字符不同的字符(例如,\n\r vs \r vs \n)。结果是该函数只是抓取第一个 1000 字符(根据函数调用)并将其视为第一行,然后它抓取下一个 1000 个字符,依此类推......这将导致一些随机输出。

您也许可以尝试以下方法:

ini_set('auto_detect_line_endings', true);

在您抓取文件之前。或者您可以通过手动修改 CSV 以标准化 EOL 字符/在文件转换中打开电子表格,从而允许您更改 EOL 字符(即 Unix 与 Windows

【讨论】:

    【解决方案2】:

    我无法使用您提供的数据重现您的错误(即使尾随逗号保留或删除),但我确实注意到您没有在代码中关闭表格行已经提供了。

    我认为这不会导致您的显示错误,但您可能希望将代码更改为:

    $row = 1;
    echo "<table>";
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
    {
       // skip headers
       if($row == 1) {
         $row++; 
         continue; 
       }
       echo "<tr>";
       echo "<td>$data[0]</td>";
       echo "<td>$data[1]</td>";
       echo "</tr>\n";
    
    } 
    echo "</table>";
    fclose($handle);
    

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2013-02-06
      • 2017-06-14
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多