【问题标题】:How do I export to CSV file with table record value with comma in it properly?如何正确导出到带有逗号的表记录值的 CSV 文件?
【发布时间】:2009-02-17 00:39:36
【问题描述】:

我有一个将值导出到 CSV 文件的函数,但是“cmets”字段中有逗号,当您在电子表格程序中打开它时,它会弄乱列。

有没有办法正确导出它?

//this exports only names and comments into a CSV file
function exportNamesCommentsCSV($table, $columns) {
    $file = "volunteer_comments";
    $csv_output = '';
    $table = 'volunteers_2009';
    $result = mysql_query("select * FROM ".$table."");
    $i = 0;
    if (mysql_num_rows($result) > 0) {
        while ($row = mysql_fetch_assoc($result)) {
            $csv_output .= $row['Field'].", ";
            $i++;
        }
    }
    $csv_output .= "\n";

    $values = mysql_query("SELECT lname, fname, email, comments FROM ".$table."");

    while ($rowr = mysql_fetch_row($values)) {
        for ($j=0;$j<$i;$j++) {
            $csv_output .= $rowr[$j].", ";
        }
        $csv_output .= "\n";
    }

    $filename = $file."_".date("Y-m-d_H-i",time());
    header("Content-type: application/vnd.ms-excel");
    header("Content-disposition: csv" . date("Y-m-d") . ".csv");
    header( "Content-disposition: filename=".$filename.".csv");
    print $csv_output;
    exit;
}

编辑:这将是评论的一个例子......

我更喜欢在门口工作,但我真的可以在任何地方工作。

上面示例注释中的 ,(逗号)会破坏正确的列结构。

【问题讨论】:

    标签: php mysql csv


    【解决方案1】:

    您需要做的是用引号将值括起来,如下所示:

    "value","value","value"
    

    这将正确处理值中的逗号,并且数值也可以正常工作。

    但是,要在值中加上引号,您需要将两个引号放在一起。例如。表示这个字符串:

    Bobby says, "Hi!"
    

    它需要被表示为

    "some value","Bobby says, ""Hi!""","Some other value"
    

    你可以这样做:

    $csv_value = "\"" . eregi_replace("\"", "\"\"", $orig_value) . "\"";
    

    【讨论】:

    • 在哪里将 $csv_value = ... 行代码添加到我当前的函数中?我不确定如何在我当前的代码中实现这一点。
    【解决方案2】:

    PHP 具有处理为您制作逗号分隔文件的功能。

    查看fputcsv 函数。它可以让你做这样的事情:

    <?php
    $list = array (
        array('this has, commas, in it','bbb','ccc','dddd'),
        array('123','456','789', 'this is "like this"'),
        array('1234','124','1242', 'yay, woo"!"')
    );
    
    $fp = fopen('file.csv', 'w');
    
    foreach ($list as $record) {
        fputcsv($fp, $record);
    }
    
    fclose($fp);
    ?>
    

    文件file.csv 将包含以下内容:

    "this has, commas, in it",bbb,ccc,dddd
    123,456,789,"this is ""like this"""
    1234,124,1242,"yay, woo""!"""
    

    稍后当您需要阅读时,如果需要,可以使用fgetcsv

    所以在你的情况下,你需要做的就是创建一个数组,每个数组都有名字和注释,然后把它放到fputcsv 上,你就成功了。

    【讨论】:

      【解决方案3】:

      您需要将条目包装在限定符中;通常是引号。

      "col1", "col2,,,", "col3"
      

      如果条目中包含引号,则需要将它们加倍。

      这是Wikipedia 的文章

      【讨论】:

        【解决方案4】:

        实现您想要的一种方法是在“cmets”字段上进行搜索和替换,假设您确定这是唯一可以包含嵌入逗号的字段。

        您可能还需要检查您的备注字段不能包含 CR 或 LF,它们也会干扰您的 csv 文件导入。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-16
          • 2022-06-13
          • 2021-01-24
          • 1970-01-01
          • 2013-05-15
          • 2012-07-08
          • 2011-07-19
          相关资源
          最近更新 更多