【问题标题】:Some characters in CSV file are not read during PHP fgetcsv()PHP fgetcsv() 期间未读取 CSV 文件中的某些字符
【发布时间】:2009-09-24 16:45:57
【问题描述】:

我正在使用 php.ini 读取 CSV 文件。许多行都有一个“复选标记”,它实际上是平方根符号:√,而 php 代码每次遇到这个字符时都会跳过它。

这是我的代码(以“CSV 样式”格式打印到浏览器窗口,以便我可以检查换行是否在正确的位置:

$file = fopen($uploadfile, 'r');
while (($line = fgetcsv($file)) !== FALSE) {
   foreach ($line as $key => $value) {
    if ($value) {
       echo $value.",";
    }
   }
   echo "<br />";
}
fclose($file);

作为临时解决方案,我只是在 Excel 中手动查找并用 1 替换复选标记。显然我想要一个更有效的解决方案 :) 感谢您的帮助!

【问题讨论】:

  • 过去我在使用fgetcsv() 时遇到过很多问题。当我遇到这些类型的问题时,我通常会开始手动解析文件。 =\
  • fgetcsv() 和非 ASCII 字符存在已知错误,尤其是在未引用值的开头。另见stackoverflow.com/questions/2238971/…

标签: php csv


【解决方案1】:

fgetcsv() 仅适用于标准 ASCII 字符;所以跳过你的平方根符号可能是“正确的”。但是,您可以将文件读入字符串,对这些字符执行 str_replace(),然后使用 fgetcsv() 对其进行解析,而不是手动替换复选标记。因此,您可以将字符串转换为文件指针(对于 fgetcsv):

$fp = fopen('php://memory', 'rw');
fwrite($fp, (string)$string);
rewind($fp);
while (($line = fgetcsv($fp)) !== FALSE)
...

【讨论】:

    【解决方案2】:

    我在字符串的重音第一个字符方面遇到了类似的问题。我最终放弃了 fgetscv 并做了以下事情,改用 fgets()explode() (我猜你的 csv 是逗号分隔的):

    $file = fopen($uploadfile, 'r');
    
    while (($the_line = fgets($file)) !== FALSE)  // <-- fgets
    {
      $line = explode(',', $the_line);            // <-- explode
      foreach ($line as $key => $value) 
      {
        if ($value) 
        {
          echo $value.",";
        }
      }
      echo "<br />";
    }
    
    fclose($file);
    

    【讨论】:

    【解决方案3】:

    你应该setlocale写在文档中

    注意: 此功能考虑了区域设置。如果 LANG 是例如en_US.UTF-8,单字节编码的文件被该函数读取错误。

    fgetcsv 之前添加 setlocale(LC_ALL, 'en_US.UTF-8')。就我而言,它是“lt_LT.UTF-8”。

    此行为被报告为php bug

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-07
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多