【问题标题】:PHP file generating CSV, how to correctly output textPHP文件生成CSV,如何正确输出文本
【发布时间】:2010-10-21 20:30:06
【问题描述】:

目前我正在编写一个 PHP 脚本,以从 MySQL 数据库中的条目输出 CSV 文件。我的问题在于如何正确输出值。 MySQL 数据库中的许多条目将包含逗号和引号,如果我只是简单地将它们打印到文件中,它们会破坏 CSV 文件的格式。

我知道我可以用引号将文本括起来,但是包含引号的条目会弄乱文件的格式。

我的问题是,我能做些什么来防止这种情况发生?

另外,换行会影响文件的解释吗?

另外,我宁愿不要在 PHP 中使用 fputcsv 函数。我正在尝试使 PHP 脚本输出文件的内容(带有适当的标题),而不是写入新文件。

提前致谢!

问候, 天体

【问题讨论】:

    标签: php csv format


    【解决方案1】:

    我认为您解雇 fputcsv 可能为时过早。在 fputcsv 手册的 cmets 中有一个示例,他们使用 fputcsv 输出到浏览器而不是文件。 http://php.net/manual/en/function.fputcsv.php

    这是这段代码,加上一些标题,表明它确实会提示用户下载 csv 文件。

    $mydata = array(
     array('data11', 'data12', 'data13'),
     array('data21', 'data22', 'data23'),
     array('data31', 'data32', 'data23'));
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"my-data.csv\"");
    outputCSV($mydata);
    
    function outputCSV($data) {
        $outstream = fopen("php://output", 'w');
        function __outputCSV(&$vals, $key, $filehandler) {
            fputcsv($filehandler, $vals, ';', '"');
        }
        array_walk($data, '__outputCSV', $outstream);
        fclose($outstream);
    }
    

    【讨论】:

    • 谢谢,我一定错过了文档的那部分。这正是我一直在寻找的。 :)
    【解决方案2】:

    我发现制表符分隔值文件在这些情况下很有帮助。 TSV 不太容易受到数据中逗号等问题的影响。

    【讨论】:

      【解决方案3】:

      这个过程称为转义,大多数解析器(包括PHP的)使用反斜杠来转义字符:

      "This string contains literal \"quotes\" denoted by backslashes"
      

      你可以用addcslashes转义字符串中的字符:

      // escape double-quotes
      $string = addcslashes('this string contains "quotes"', '"');
      
      echo $string; // 'this string contains \"quotes\"'
      

      给定一个您想用逗号分隔的数据数组,您可以执行以下操作:

      // Escape all double-quotes
      foreach ($data as $key => $value)
        $data[$key] = addcslashes($value, '"');
      
      // Wrap each element in double quotes
      echo '"' . implode('", "', $data), '"';
      

      【讨论】:

      • 难道 Excel 之类的程序不会意识到这些引号被转义了吗?它会读入“这个字符串包含\”作为值?
      • @cele 在字符串中转义引号的需求是普遍的,Excel 将有一些方法可以做到这一点。它可能允许您指定转义字符,或者在 MS 软件中使用另一种常见的转义引号的方式,将一个引号替换为三个:" 变为 """。
      • @cele 最简单的查找方法是创建一个 Excel 文件,在其中添加一些引号,然后将其导出为 CSV。
      • 我意识到没有 CSV 标准,但 RFC 4180:ietf.org/rfc/rfc4180.txt 建议使用两个双引号作为转义双引号。我确认 Excel 2007 识别两个双引号转义,但将 \" 视为文字文本。因此,字段 - “Super” Bad - 编码为“”“Super”“Bad”。不能保证在任何地方都可以工作,但没有给定没有规范。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多