【问题标题】:Add Quotes to CSV Export向 CSV 导出添加报价
【发布时间】:2023-03-31 00:33:01
【问题描述】:

我正在使用 fputcsv 将数据导出到 CSV 文件。我有正在写入的字符串,但是我要求数据用双引号引起来。

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 有两个可选参数。分隔符和外壳。但是我相信附件默认为 "" 但仅当字符串被拆分为单独的单词时。

【问题讨论】:

    标签: php csv


    【解决方案1】:

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

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

    或者你可以避开fputcsv(),自己编写所有内容。

    【讨论】:

    • 这个变通方法确实可以解决问题,但是,当“”用作 $enclosure 参数时,fputcsv() 在所有内容周围添加额外的空格很烦人,但不允许空字符串作为 $外壳本身。
    【解决方案2】:

    如果您必须在每个字段上都有引号,那么恐怕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 文件的程序都对这种安排非常满意。可能值得仔细检查为什么存在此要求 - 这听起来像是另一端的软件问题,而不是您应该在端做的任何事情。

    【讨论】:

    • 使用 lambda 函数的很好的解决方案,虽然有一个小错误... array_walk 返回一个布尔值,所以 implode 会抛出一个错误。在调用 implode 之前在 $line(不是 $field)上使用 array_walk。此外,lambda 函数应该通过引用传递 $field,所以应该是 &$field。有了这些变化,一切都很好!
    【解决方案3】:

    这很正常,如果你用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"""
    

    【讨论】:

      猜你喜欢
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 2017-01-07
      • 2016-04-25
      • 2014-05-13
      相关资源
      最近更新 更多