Php 在逗号分隔的文件中用引号封装文本

Php 在逗号分隔的文件中用引号封装文本,php,list,csv,encapsulation,Php,List,Csv,Encapsulation,我有一个如下所示的CSV文件: Amebiasis,California,2001,Total,571,34514777,1.654,1.521,1.796 Amebiasis,California,2001,Female,176,17340743,1.015,0.871,1.176 Amebiasis,California,2001,Male,365,17174034,2.125,1.913,2.355 我需要一个脚本来封装所有文本块,使其看起来像: "Amebiasis","Califor

我有一个如下所示的CSV文件:

Amebiasis,California,2001,Total,571,34514777,1.654,1.521,1.796
Amebiasis,California,2001,Female,176,17340743,1.015,0.871,1.176
Amebiasis,California,2001,Male,365,17174034,2.125,1.913,2.355
我需要一个脚本来封装所有文本块,使其看起来像:

"Amebiasis","California",2001,"Total",571,34514777,1.654,1.521,1.796
"Amebiasis","California",2001,"Female",176,17340743,1.015,0.871,1.176
"Amebiasis","California",2001,"Male",365,17174034,2.125,1.913,2.355
我习惯于使用PHP,但欢迎使用其他语言的解决方案

我尝试使用Excel的本机解决方案,但这给了我三个引号:

    """Amebiasis""","""California""",2001,"""Total""",571,34514777,1.654,1.521,1.796
您可以使用regex并修改它

$string='Amebiasis,加利福尼亚州,2001年,总计5713414777,1.654,1.521,1.796';
//“\b”是单词边界
$pattern='/\b/i';
$replacement='”;
$newstring=preg_replace($pattern,$replacement,$string);
//带引号的字符串

echo$newstring;
您可以使用php本机csv编码函数,但必须添加一个小的辅助函数。原因是本机函数符合
csv
标准,如果不需要按其内容结构进行解析,则不需要封闭单元格

这是一个例子:

<?php
function encodeFunc($value) { return "\"$value\""; }

$h_input = fopen('input.csv', 'r');
$h_output = fopen('output.csv', 'w');
while ($input = fgetcsv($h_input)) {
  fputcsv($h_output, array_map('encodeFunc', $input), ',', chr(0));
}
readfile('output.csv');
文件
output.csv
将保存:

"Amebiasis","California","2001","Total","571","34514777","1.654","1.521","1.796"
"Amebiasis","California","2001","Female","176","17340743","1.015","0.871","1.176"
"Amebiasis","California","2001","Male","365","17174034","2.125","1.913","2.355"
顺便说一句:这种方法也适用于大文件,它可以毫无问题地扩展,因为它从不将整个文件加载到内存中,而是一次只加载一行;-)

我想说:如果它没有损坏,就不要修复它。你的csv是完美的

但也许你需要为某些软件报价

一般情况下:在csv中,引号不用于表示某些字段是文本,而是用于转义字段内的分隔符(或换行符),例如:

text1,"text2, some more",1.234,"44,25"
如果使用Excel获得3个引号,这意味着字段已经被引用,用另一个引号转义,然后用引号括起来(正如@norlesh已经提到的)


无论您做什么,都不要使用正则表达式来“修复”csv,因为如果字段中有分隔符或引号,这可能会破坏数据的未来更新。

当Excel使用三个双引号时,通常是因为第一个和第三个引号正在转义第二个引号-使用“Excel本机解决方案”时,您到底在做什么?我在y中没有看到双引号我们的CSV需要转义。请参阅第6点-编辑我需要格式化的单元格-选择格式化单元格-从底部选择自定义-使用公式\“@\”-另存为CSV,逗号分隔。使用\”时将插入神秘的双引号@\“然后在Excel写入CSV文件后进行转义-我猜如果您要用三个引号重新打开修改后的CSV,单元格将显示在Excel中,带有正常引号的字符串,但我使用的文件中确实没有任何引号。否则就不会有任何问题。当我在excel文件中搜索“”时,无论是在excel中搜索还是用文本编辑器打开文件,我都找不到任何东西。@AdamDedanga-是的,这就是我所理解的。但是为什么需要在字段中添加引号?对于excel的本机解决方案,你的意思是什么?一定有一个引号在某个地方才能拿回3。
text1,"text2, some more",1.234,"44,25"
"""Amebiasis""","""California"""