2009-09-24 48 views
4

我正在用php读取CSV文件。许多行都有一个“复选标记”,它实际上是平方根符号:√并且每次遇到时,php代码都会跳过此字符。PHP中某些字符不会被读取fgetcsv()

这里是我的代码(打印在“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手工替换复选标记。很明显,我想要一个更高效的解决方案:)感谢您的帮助!

+0

我使用''fgetcsv在过去的()有很多的问题。当我遇到这些类型的问题时,我通常会开始手动解析文件。 = \ – pix0r 2009-09-24 16:48:54

+0

已知有fgetcsv()和非ASCII字符的错误,特别是在未加引号的值开头。另请参阅http://stackoverflow.com/questions/2238971/fgetcsv-ignores-special-characters-when-they-are-at-the-beginning-of-line – eswald 2012-01-26 20:13:54

回答

4

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

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

我不得不用绳子重音第一字符类似的问题。我最终放弃了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); 
+0

我对此解决方案有疑问:http:// stackoverflow.com/questions/14836653/php-fgetcsv-not-reading-first-utf-8-caracter-alternatif-using-fgets – StiGMaT 2013-02-12 16:16:24

0

你应该的setlocale AR写在文件

注意: 该功能考虑到语言环境设置。如果LANG是例如en_US.UTF-8,单字节编码的文件被这个函数读错了。

之前fgetcsv附加的setlocale(LC_ALL, '的en_US.UTF-8')。在我的情况下,它是'lt_LT.UTF-8'。

这种行为被报告为php bug