在PHP中将CSV写入不带附件的文件

在PHP中将CSV写入不带附件的文件,php,csv,quotes,quoting,Php,Csv,Quotes,Quoting,是否有本机函数或实体类/库用于将数组作为行写入CSV文件(无附件)fputcsv将默认为“。Google让我失望(返回了一大堆关于fputcsv的页面的结果),PEAR的库所做的事情或多或少与fputcsv相同 与fputcsv工作方式完全相同,但允许字段保持不带引号 当前:“字段1”、“字段2”和“字段3”为空 所需:字段1、字段2、字段3HASNOSPACES这是我用来将标准CSV放入数组中的内容 function csv_explode($delim=',', $str, $enclose

是否有本机函数或实体类/库用于将数组作为行写入CSV文件(无附件)<如果没有为enclosure参数传递任何内容,code>fputcsv将默认为
。Google让我失望(返回了一大堆关于
fputcsv
的页面的结果),PEAR的库所做的事情或多或少与
fputcsv
相同

fputcsv
工作方式完全相同,但允许字段保持不带引号

当前:
“字段1”、“字段2”和“字段3”为空


所需:
字段1、字段2、字段3HASNOSPACES

这是我用来将标准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循环中输出您想要的任何内容。

这不起作用吗

fputcsv($fp, split(',', $line),',',' ');

没有附件的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));

?>

解决了这个问题。通过将Null的ascii码传递给
car()
函数,它似乎工作得很好

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

谢谢大家的回答!!!

car(0)
不起作用,因为
NULL
值很可能会阻塞大多数csv解析器


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

关于前面附件的警告是有效的,但您说过它们不适用于您的用例

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

<?php
$fields = array(
    "field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode(',', $fields)."\n");
chr()配合使用函数:

fputcsv($f,$array,',',chr(0));
chr(0)
也为我工作:

 fputcsv($fp, $aLine, $sDelimiter, chr(0));
fputcsv($file,$data,;”,chr(127));

我使用了一种巧妙的方法来删除双引号,但只在Linux中使用

....
fputcsv($fp, $product_data,"\t");
....
shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');

好老的fwrite()有什么问题吗

函数封闭字符串($field){
返回($field)“.$field.”:空;
}
$delimiter=';';
$data=[“数据字段1”、“数据字段2”、“数据字段3”];
$fp=fopen(“some file.csv”,“w”);

对于($i=0;$i选择的解决方案取决于您的应用程序。对于某些情况,需要自己的csv代码。在情况1(请参见结果)、情况2()和情况3()中,数据将被修改(不好)。请改用类似的方式,谢谢@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.

我认为您需要引号..如果其中有换行符或逗号,而它们不是引号分隔的呢?引号是为了您的利益而存在的。使用它们是一种很好的做法;这就是为什么它们是默认值。我不同意;如果您可以控制输入数据,您可能希望省略附件,尤其是在您可能正在导出的情况下将所有数字/过滤的字符串数据发送到一个古老的阅读器。另一件事是制表符分隔的文件:不需要附件。如果您正在生成CSV以用于将数据上载到一个构建不完善的应用程序,则引号可能会干扰sql。正如我的情况一样,FPUTCSV似乎有一个导致这种情况的错误:3StartsWithNum,“StartsWithAlpha”notherStartsWAlpha”等。附件字符不是问题所在。不一致之处在于。[PHP版本5.6]Split将是一个不推荐使用的函数,但这并不一定能解决我在附件中的问题。不幸的是,至少就这个函数而言,空格不被视为合法字符。不过,谢谢!假设额外的空间不是问题,他似乎不想使用附件;但是,使用空格似乎是合乎逻辑的尝试。不知道为什么我没有先讨论这个。谢谢!因为CSV库处理简单内爆解决方案无法处理的情况,比如跳过分隔符(
)。这是在没有附件的情况下替换fputcsv的最佳方法。我想提出一个小建议来改进这个答案-使用文档化的参数顺序:
内爆(string$glue,array$pieces)
,以避免与PHP新手和不了解此PHP“功能”的人产生混淆“反向参数。嗯……你确定它不会在csv文件中放入一堆隐藏的空字符吗?:s另外,我认为它是'chr(0)'!为我放入空字符。这不是理想的解决方案。chr(0)创建空字符,以utf8显示,如^@我怀疑这是一个好主意。你实际上正在编写一个<代码>“\0”
。在它回来咬你之前,大部分是看不见的。我想这是因为你的编辑器没有显示空字符,但它仍然在那里,这就是我要找的字符。谢谢m8!是的,这是正确的答案。工作得很好。谢谢你,实际上,chr(127)在文件中仍然显示为字符,所以它不理想。该死
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);
<?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.