将报价添加到CSV导出

时间:2013-02-28 11:05:47

标签: php csv

我正在使用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有两个可选参数。分隔符和外壳。但是我认为机箱默认为“”,但仅当字符串被拆分为单独的单词时。

3 个答案:

答案 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"""