4

我正在使用fputcsv. 我有正在写入的字符串,但是我要求数据用双引号引起来。

foreach ($orderDetails['lines'] as $line) {
     fputcsv($orderImportCsv, $line);
}

这在编辑器中打开时会创建以下内容(崇高)

L,M3344,,100

L,M3356,,50

我需要将这些字段中的每一个都用双引号括起来。

所以我试过这个:

foreach ($lines as &$line) {
    foreach ($line as &$column) {
        $column = '"' . $column . '"';
    }
}

所以基本上这应该通过每一行字段并将其包装在“”中。但是在运行之后,我得到以下输出:

"""L""","""M3344""","""""","""100"""

"""L""","""M3356""","""""","""50"""

它现在在变量周围放置了 2 组双引号!

有一个更好的方法吗?

更新

我知道fputcsv有两个可选参数。分隔符和外壳。但是我相信附件默认为“”,但仅当字符串被拆分为单独的单词时。

4

3 回答 3

6

由于您自己插入了附件,因此您必须指示 PHP 不使用任何附件。似乎没有记录的方法可以做到这一点,但使用空格似乎有效:

<?php
foreach($orderDetails['lines'] as $line){
    foreach ($line as &$column) {
        $column = '"' . $column . '"';
    }
    unset($column);

    fputcsv($orderImportCsv, $line, ',', ' ');
}

或者您可以避免fputcsv()并自己编写所有内容。

于 2013-02-28T11:24:19.157 回答
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 文件的程序都对这种安排非常满意。可能值得仔细检查为什么存在此要求 - 这听起来像是另一端软件的问题,而不是您应该在端做的任何事情。

于 2013-02-28T11:24:58.427 回答
-1

这很正常,如果您使用 Excel 创建 CSV 文件并用双倍配额包围一个单元格,那么它会将其他单元格添加到源文件中,例如:

这是 CSV 在 Microsoft Office Excel 2007 中的显示方式:

"
""
"""
""""
"""""

源代码:

"""",
"""""",
"""""""",
"""""""""",
"""""""""""",

然后没有任何问题,您可以在文档中看到第一个示例:

<?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"""
于 2013-02-28T11:33:36.797 回答