57

是否有本机函数或实体类/库用于将数组写为 CSV 文件中的一行而没有附件?如果没有为附件参数传递任何内容,则fputcsv默认为。Google 让我失望"了(返回一大堆关于.fputcsvfputcsv

与 完全一样fputcsv的东西,但允许字段不被引用。

目前:"field 1","field 2",field3hasNoSpaces

想要的:field 1,field 2,field3hasNoSpaces

4

13 回答 13

68

关于上述附件的警告是有效的,但您已经说过它们不适用于您的用例。

我想知道为什么你不能只使用这样的东西?

<?php
$fields = array(
    "field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode(',', $fields)."\n");
于 2009-12-15T03:07:18.547 回答
13

chr()函数一起使用:

fputcsv($f,$array,',',chr(0));
于 2012-11-14T10:16:35.473 回答
6

fputcsv($file, $data, ';', chr(127));

于 2017-03-31T09:04:33.383 回答
2

好吧car(0),没有成功,因为该NULL值很可能会阻塞大多数 csv 解析器。

我结束了使用fputcsv()来构建初始文件,然后通过并删除了所有引号。优雅的?也许不是,但它完成了工作:)。

于 2009-12-05T01:19:33.397 回答
1

这不行吗?

fputcsv($fp, split(',', $line),',',' ');
于 2009-11-25T23:41:18.473 回答
1
<?php       
    
$filename = "sample.csv";
$handle = fopen($filename, 'w+');
fputcsv($handle, ['column 1','column 2']);
$data = ['sample','data'];

fputs($handle, implode(',', $data)."\n");

// or

fwrite($handle, implode(',', $data)."\n");

fclose($handle);
$headers = array(
    'Content-Type' => 'text/csv',
);
于 2016-08-04T22:36:02.440 回答
1

我使用棘手的方法来删除双引号,但仅限于 Linux

....
fputcsv($fp, $product_data,"\t");
....
shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');
于 2018-08-23T08:41:18.777 回答
0

这就是我用来将标准 CSV 放入数组的方法......

function csv_explode($delim=',', $str, $enclose='"', $preserve=false){
        $resArr = array();
        $n = 0;
        $expEncArr = explode($enclose, $str);
        foreach($expEncArr as $EncItem){
                if($n++%2){
                        array_push($resArr, array_pop($resArr) . ($preserve?$enclose:'') . $EncItem.($preserve?$enclose:''));
                }else{
                        $expDelArr = explode($delim, $EncItem);
                        array_push($resArr, array_pop($resArr) . array_shift($expDelArr));
                        $resArr = array_merge($resArr, $expDelArr);
                }
        }
        return $resArr;
} 

然后,您可以在 foreach 循环中输出您想要的任何内容。

于 2009-11-25T23:37:54.847 回答
0

没有附件的 CSV 文件的缺点意味着用户输入中的错误逗号会影响该行。因此,您需要在写入 CSV 行之前删除逗号。

处理 CSV 的棘手部分是解析附件,这使得 PHP 和 PEAR CSV 函数很有价值。本质上,您正在寻找一个以逗号分隔的列和以换行符分隔的行的文件。这是一个简单的起点:

<?php
$col_separator= ',';
$row_separator= "\n";

$a= array(
 array('my', 'values', 'are', 'awes,breakit,ome'),
 array('these', 'values', 'also', "rock\nAND\nROLL")
);

function encodeRow(array $a) {
 global $col_separator;
 global $row_separator;
 // Can't have the separators in the column data!
 $a2= array();
 foreach ($a as $v) {
  $a2[]= str_replace(array($col_separator, $row_separator), '', $v);
 }
 return implode($col_separator, $a2);
}

$output= array();
foreach ($a as $row) {
 $output[]= encodeRow($row);
}

echo(implode($row_separator, $output));

?>
于 2009-11-26T00:21:22.213 回答
0

好的旧 fwrite() 有什么问题?

function encloseString($field){
    return ($field) ? '"' . $field . '"' : null;
}

$delimiter = ';';
$data = ["data_field_1", "data_field_2", "data_field_3"];

$fp = fopen("some-file.csv", 'w');

for($i = 0;$i<100000;$i++) {
    fwrite($fp, implode($delimiter, array_map('encloseString', $data) . "\n");
}

fclose($fp);

(显然你需要确保 $data 中的数据首先被转义)

于 2019-07-17T09:02:52.690 回答
0

选择解决方案取决于您的应用程序。在某些情况下,需要自己的 csv 代码。在案例 1(见结果chr0)、案例 2(chr127)和案例 3(chr127)中,数据将被修改(坏事)。而是使用这样的东西,谢谢@oops:

<?php
$fields = array(
    "field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode(',', $fields)."\n");


case 1. `fputcsv($f, $array, $delimiter, car(0))`
See result [chr0][1]
case 2. `fputcsv($f, $array, $delimiter, car(127))`
[chr127][2]
case 3. `fputcsv($f, $array, $delimiter, ' ')`
[onespace][3]
case 4. Own code:
[oops](https://stackoverflow.com/a/1904945)
 or [Ansyori](https://stackoverflow.com/a/51981613)
 or [zeros-and-ones](https://stackoverflow.com/a/38778459)
produces better results.
于 2020-11-17T13:41:51.807 回答
-1

chr(0)也为我工作:

 fputcsv($fp, $aLine, $sDelimiter, chr(0));
于 2015-12-11T13:32:32.367 回答
-3

弄清楚了。通过将 Null 的 ascii 代码传递给car()函数,它似乎工作得很好。

fputcsv($f, $array, $delimiter, car(0))

谢谢大家的解答!!!

于 2009-11-26T00:40:52.397 回答