9

我正要问与此处提出的问题相同的问题....强制 fputcsv 对 *all* 字段使用附件

问题是

当我使用 fputcsv 向打开的文件句柄写出一行时,PHP 会在它认为需要它的任何列中添加一个封闭字符,但会留下没有封闭的其他列。

例如,您可能会得到这样的一行

11、“鲍勃”、詹金斯、“200 main st. USA”等

除了在每个字段的末尾附加一个虚假的空间之外,有没有办法强制 fputcsv 始终将列与附件(默认为“)字符括起来?

答案是:

不,fputcsv() 仅在以下条件下包含该字段

/* enclose a field that contains a delimiter, an enclosure character, or a newline */
if (FPUTCSV_FLD_CHK(delimiter) ||
  FPUTCSV_FLD_CHK(enclosure) ||
  FPUTCSV_FLD_CHK(escape_char) ||
  FPUTCSV_FLD_CHK('\n') ||
  FPUTCSV_FLD_CHK('\r') ||
  FPUTCSV_FLD_CHK('\t') ||
  FPUTCSV_FLD_CHK(' ')
)

没有“始终包含”选项。

我需要创建一个 CSV 文件,将每个字段都包含在内......最好的解决方案是什么?

提前致谢...

4

3 回答 3

9

滚动您自己的功能 - 这并不难:

 function dumbcsv($file_handle, $data_array, $enclosure, $field_sep, $record_sep)
 {
     dumbescape(false, $enclosure);
     $data_array=array_map('dumbescape',$data_array);
     return fputs($file_handle, 
         $enclosure 
         . implode($enclosure . $field_sep . $enclosure, $data_array)
         . $enclosure . $record_sep);
 }
 function dumbescape($in, $enclosure=false)
 {
    static $enc;
    if ($enclosure===false) {
        return str_replace($enc, '\\' . $enc, $in);
    }
    $enc=$enclosure;
 }

(上面是使用unix风格的转义)

C。

于 2010-03-25T13:43:47.613 回答
1

一种解决方法:假设您将数据放在二维数组中,您可以附加一个强制引用的字符串,并且您确定不包含在您的数据中(此处为“#@ @#”),然后将其删除:

    $fp = fopen($filename, 'w');
    foreach ($data as $line => $row) {
        foreach ($row as $key => $value) {
            $row[$key] = $value."#@ @#";
        }           
        fputcsv($fp, $row);
    }

    fclose($fp);
    $contents = file_get_contents($filename);
    $contents = str_replace("#@ @#", "", $contents);
    file_put_contents($filename, $contents);
于 2011-02-11T11:00:27.670 回答
0

我遇到了同样的问题,我已经解决了如下。
我在每个数组值中插入了单引号。
这样当你用excel打开csv文件时,科学计数法E+15就不再显示了。

在这里我和你一样分享。

这对我有用,我希望你也这样做。
问候

        // this function add a single quote for each member of array
         function insertquote($value) {
            return "'$value'";
        }

        # here i send each value of array 
        # to a insertquote function, and returns an array with new values, 
        # with the single quote.

        foreach ($list as $ferow) {
            fputcsv($fp, array_map(insertquote, $ferrow), ';');
        }
于 2019-12-17T21:31:15.767 回答