所以我制作了测试代码:
$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():附件必须是字符“那么另外一个选项是将附件作为空字符串。
答案 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);
...