PHP - 从csv文件读取和写入数据。奇怪的是

时间:2014-02-20 14:25:21

标签: php

所以我制作了测试代码:

$fopen = fopen('./mydata.csv',"r");    
$data = fgetcsv($fopen, 1000, ",");
fclose($fopen);
$fp = fopen('mynewdata.csv','a');
fputcsv($fp,$data,',');
fclose($fp);    

mydata.csv文件的内容:

  

string“some thing”,sec string,next string

mynewdata.csv文件的新内容:

  

“string”“some thing”“”,“sec string”,“next string”

我的问题是:这个'''来自哪里。我做错了,我的输出与输入不同。

几乎没有观察到:

当我测试时,使用附件:'' - >空字符串:

$data = fgetcsv($fopen, 1000,',','');
print_r($data);

打印没有任何内容的数组有2行,这是我从日志得到的错误: “FastCGI发送到stderr:”PHP消息:PHP警告:fgetcsv():附件必须是字符“那么另外一个选项是将附件作为空字符串。

2 个答案:

答案 0 :(得分:3)

正如您所见fputcsv documentation

  

int fputcsv(resource $ handle,array $ fields [,string $ delimiter =','[,string $ enclosure ='“']])

最后一个参数是机箱。由于您尚未定义自己,因此默认为",然后必须通过放置双引号来逃避您的报价。

要摆脱这种情况,只需指定一个空字符串:

$fopen = fopen('./mydata.csv',"r");    
$data = fgetcsv($fopen, 1000, ",");
fclose($fopen);
$fp = fopen('mynewdata.csv','a');
fputcsv($fp,$data,',','');
//                    ^^
fclose($fp); 

为什么默认执行此操作?!

如果您的字符串中有逗号,请避免错误。想象一下:

$data = array('my string', 'is a great string', 'and it is, very nice');

使用机箱会产生以下结果:

"my string","is a great string","and it is, very nice"

如果没有附件,则会产生以下结果:

my string,is a great string,and it is, very nice

哪个被误解为4个值而不是3个。

答案 1 :(得分:0)

谢谢你们重播。但答案是不同的。我踩PHP漏洞: https://bugs.php.net/bug.php?id=51496

如果你们中的一些人知道解决方案,请写下来。 我的php版本5.4.6。

编辑。

所以为了摆脱函数fgetcsv和fputcsv的问题,我解决了这个问题:

$handle = fopen('./mydata.csv','r'); 
$data = fgets($handle);
$data = str_replace(', ','@!#$',$data);
$data = explode(',',$data);
$data = str_replace('@!#$',', ',$data);

$fp = fopen('mynewdata.csv','a');
$data = implode($data,',');
fwrite($fp, $data."\n");
fclose($fp);
fclose($handle);

另一种解决方案。 ins_replace,explode,str_replace的insted你可以这样做:

$handle = fopen('./mydata.csv','r'); 
$data = fgets($handle);
$data = explode('","', preg_replace('/([^ ]),([^ ])/', '$1","$2', $data));
fclose($handle);
...