PHP fputcsv和封装字段

9

我正想问与此问题相同的问题...强制fputcsv使用*所有*字段的封闭符号

问题是:

当我使用fputcsv将一行写入到打开的文件句柄时,PHP会添加一个封闭字符以包含它认为需要的任何列,但会使其他列没有封闭。

例如,您可能会得到以下一行:

11,“Bob”,Jenkins,“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文件,并将每个字段都包含在内...什么是最好的解决方案?

提前感谢...


更改PHP源代码是否是一个选项?即在函数参数中添加一些“始终包含”标志,在您的情况下是否可行? - VolkerK
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.

$file_handle,$data_array,$enclosure,$field_sep,$record_sep - 你能否举例说明需要传递哪些值...谢谢您的帮助。 - Anudeep GI
$file_handle这个变量需要传递什么值?@symcbean - Anudeep GI
返回 fputs($file_handle, $enclosure . implode($enclosure . $field_sep . $enclosure, $data_array) . $enclosure . $record_sep); 我在这行代码中遇到了错误:消息:数组转换为字符串。 - Anudeep GI

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);

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), ';');
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接