是否有本机函数或实体类/库用于将数组作为一行写入没有附件的CSV文件中?如果没有为机箱参数传递任何内容,fputcsv
将默认为"
。谷歌让我失望(返回关于fputcsv
)的大量网页的结果,而PEAR的库与fputcsv
或多或少完全相同。
与fputcsv
完全相同的东西,但会允许字段保持不加引号。
目前:"field 1","field 2",field3hasNoSpaces
期望:field 1,field 2,field3hasNoSpaces
答案 0 :(得分:56)
有关上述附件的警告是有效的,但您说它们不适用于您的用例。
我想知道为什么你不能只使用这样的东西?
<?php
$fields = array(
"field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode($fields, ',')."\n");
答案 1 :(得分:13)
适用于 chr()功能:
fputcsv($f,$array,',',chr(0));
答案 2 :(得分:4)
fputcsv($file, $data, ';', chr(127));
答案 3 :(得分:2)
这不起作用吗?
fputcsv($fp, split(',', $line),',',' ');
答案 4 :(得分:2)
好car(0)
没有用,因为NULL
值很可能会阻塞大多数csv解析器。
我最后使用fputcsv()
构建初始文件,然后浏览并删除了所有引号。优雅?也许不是,但它完成了工作:)。
答案 5 :(得分: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',
);
答案 6 :(得分: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循环中输出任何内容。
答案 7 :(得分:0)
使用没有附件的CSV文件的缺点意味着用户输入中的错误逗号将使行变得清晰。因此,在编写CSV行之前,您需要删除逗号。
处理CSV的棘手部分是解析外壳,这使PHP&amp; 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));
?>
答案 8 :(得分:0)
chr(0)
也为我效劳:
fputcsv($fp, $aLine, $sDelimiter, chr(0));
答案 9 :(得分:0)
我使用棘手的方法删除双引号,但仅在Linux中
....
fputcsv($fp, $product_data,"\t");
....
shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');
答案 10 :(得分: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中的数据先被转义)
答案 11 :(得分:0)
使用“ chr(0)”将一个字符添加到文件中。经过调查并检查了ASCII Table之后,我最终使用了以下
fputcsv($fp, $aLine, $sDelimiter, chr(127));
多余的字符没有问题。
答案 12 :(得分: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.
答案 13 :(得分:-3)
想出来。通过将Null的ascii代码传递给car()
函数,它似乎工作正常。
fputcsv($f, $array, $delimiter, car(0))
感谢大家的答案!!!