我正在使用fputcsv
将数据导出到CSV文件。我有正在编写的字符串但是我要求数据用双引号括起来。
foreach ($orderDetails['lines'] as $line) {
fputcsv($orderImportCsv, $line);
}
在编辑器(sublime)中打开时会创建以下内容
L,M3344,100
L,M3356,50
我需要将每个字段都用双引号括起来。
所以我试过这个:
foreach ($lines as &$line) {
foreach ($line as &$column) {
$column = '"' . $column . '"';
}
}
所以基本上这应该遍历每个行字段并将其包装在“”中。但是在运行之后我得到以下输出:
“” “L” “”, “” “M3344”, “”, “” “” “” “” “100” “”
“” “L” “”, “” “M3356”, “”, “” “” “”, “” “50” “”
它现在在变量周围加上两组双引号!
有更好的方法吗?
更新
我知道fputcsv
有两个可选参数。分隔符和外壳。但是我认为机箱默认为“”,但仅当字符串被拆分为单独的单词时。
答案 0 :(得分:4)
由于您自己插入了机箱,因此必须指示PHP不使用它。似乎没有记录的方法,但使用空格似乎有效:
<?php
foreach($orderDetails['lines'] as $line){
foreach ($line as &$column) {
$column = '"' . $column . '"';
}
unset($column);
fputcsv($orderImportCsv, $line, ',', ' ');
}
或者你可以避免fputcsv()并自己撰写一切。
答案 1 :(得分:1)
如果必须在每个字段都有引号,那么fputcsv
就不够好了,我很害怕。它只在它认为需要它们的字段周围加上引号 - 即那些有空格或逗号等的字段。
您尝试通过在执行fputcsv
之前将它们添加到值来强制引用将不起作用,因为PHP将这些引号视为字段值的一部分,因此需要进行转义(通过添加更多引号)
为了强制每个字段引用,您需要手动生成CSV记录。这样的事情可以解决问题:
$quoteCSV = function($field) {
return '"'.$field.'"';
}
foreach ($lines as $line) {
fputs($file, implode(',',array_walk($field, $quoteCSV)));
}
注意: 1.由于使用了lambda函数,此代码需要PHP 5.3或更高版本。 2.我没有尝试处理实际包含引号的字段,因为您没有指定它们应该如何转义。如果任何数据包含引号,则上述代码将生成损坏的CSV文件。我会留给你根据需要解决这个问题。
希望有所帮助。
但是,我会说,为每个字段添加引号的要求非常不寻常;虽然它会被识别为CSV文件,但生成CSV的大多数程序都会执行PHP所做的操作,并且只在必要时添加引号。几乎我遇到的所有读取CSV文件的程序都非常满意这种安排。可能值得仔细检查为什么存在这个要求 - 这听起来像是另一端的软件问题,而不是你应该在最后做的事情。答案 2 :(得分:-1)
这是正常的,如果您使用Excel创建CSV文件并将一个单元格用双重配额封装,那么它会将其他单元格添加到源文件中,例如:
这是CSV在Microsoft Office Excel 2007中的显示方式:
"
""
"""
""""
"""""
源代码:
"""",
"""""",
"""""""",
"""""""""",
"""""""""""",
然后没有出错,因为你可以看到documentation中的第一个例子:
<?php
$list = array (
array('aaa', 'bbb', 'ccc', 'dddd'),
array('123', '456', '789'),
array('"aaa"', '"bbb"')
);
$fp = fopen('file.csv', 'w');
foreach ($list as $fields) {
fputcsv($fp, $fields);
}
fclose($fp);
?>
以上示例将以下内容写入file.csv:
aaa,bbb,ccc,dddd
123,456,789
"""aaa""","""bbb"""