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

时间:2016-01-03 07:55:23

标签: 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","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

3 个答案:

答案 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进行修改。

&#13;
&#13;
$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;
&#13;
&#13;