我有一个看起来像这样的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
答案 0 :(得分:2)
您可以使用php native 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');
档案input.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
文件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"
BTW:这种方法也适用于大型文件,它可以毫无问题地扩展,因为它永远不会将整个文件加载到内存中,而是一次只加载一行; - )
答案 1 :(得分:1)
我会说:如果没有破坏则不修复。你的csv是完美的。
但也许您需要引用某些软件?
通常:在csv中,引号不用于表示某些字段是文本,而是用于表示字段内的分隔符(或换行符),例如:
text1,"text2, some more",1.234,"44,25"
如果使用Excel获得3个引号,这意味着这些字段已经被引用,使用另一个引号进行转义,然后用引号括起来(如@norlesh已经提到的那样)。
"""Amebiasis""","""California"""
无论您做什么,都不要使用正则表达式来“修复”csv,因为如果字段中包含分隔符或引号,则可能会破坏数据的未来更新。
答案 2 :(得分:0)
您可以使用正则表达式和preg_replace进行修改。
$string = 'Amebiasis,California,2001,Total,571,34514777,1.654,1.521,1.796';
// '\b' is a word boundary
$pattern = '/\b/i';
$replacement = '"';
$newstring = preg_replace($pattern, $replacement, $string);
//the string with quotes
echo $newstring;
&#13;