2009-11-25 63 views
32

是否有本地函数或实体类/库,用于将数组作为CSV文件中的一行写入,而不使用附件?如果没有任何内容参数传入机箱参数,则fputcsv将默认为"。谷歌正在让我失望(返回关于fputcsv的大量页面的结果),而PEAR的库与fputcsv差不多。将CSV文件写入没有外壳的文件在PHP中

fputcsv完全相同的东西,但会允许字段保持不加引号。

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

期望:field 1,field 2,field3hasNoSpaces

+6

我认为你需要引号..如果在那里有一个换行符或逗号,并且它们没有引号分隔? – alex 2009-11-25 23:34:35

+1

行情是为您的利益。使用它们是一种很好的做法;这就是为什么他们是默认的。 – 2012-04-07 18:17:07

+5

我不同意;如果您有输入数据的控制权,您可能希望省略机箱,特别是如果您可能将所有数字/过滤的字符串数据导出到陈旧的读取器。另一件事是制表符分隔的文件:不需要附件。 – 2012-06-26 18:33:56

回答

42

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

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

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

不知道为什么我没有先走到这。谢谢! – 2009-12-15 22:23:29

+0

因为CSV库处理简单的implode解决方案的情况,比如scaping分隔符(在你的情况下是'''')。 – jgomo3 2016-02-08 22:43:45

+0

这是在没有外壳的情况下更换fputcsv的最佳方法。我会提出一个小建议来改进这个答案 - 使用[implode]的记录参数顺序(http://php.net/manual/en/function.implode.php):'implode(string $ glue,array $ pieces) '以避免与PHP新手不熟悉的人混淆,并且不知道这个反转参数的PHP“特性”。 – hrvoj3e 2016-12-16 11:25:44

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要输出循环。

2

这不工作?

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

Split将是一个不推荐的功能,这不一定能解决我的问题。至少就这个功能而言,不幸的是空间不被认为是合法的字符。虽然谢谢! – 2009-11-25 23:47:37

+0

假设额外的空间不是问题,他似乎在寻找*无*外壳;然而,使用空间似乎是合乎逻辑的尝试。 – 2009-11-25 23:48:48

0

缺点与CSV文件没有附件意味着在用户输入错误的逗号将冲刺行。因此,在写入CSV行之前,您需要删除逗号。

处理CSV的棘手部分是解析附件,这使得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)); 

?> 
-3

想通了。通过将空字符的ASCII代码传递给car()函数,它似乎工作得很好。

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

感谢您的答案大家!

+3

嗯...你确定它不会在csv文件中放置一堆隐形的空值吗? :s另外,我认为它是'chr(0)' - ! – 2012-06-26 18:35:16

+2

对我而言为NULL。不是理想的解决方案。 – Shadowbob 2013-07-22 13:56:39

1

那么car(0)没有工作,因为NULL值很可能会阻塞大多数csv分析器。

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

8

作品与CHR()函数

fputcsv($f,$array,',',chr(0)); 
+2

-1对我不起作用 – mkk 2013-09-25 10:48:53

+4

看来,在UTF-8文件无法正常工作 – terox 2014-06-12 11:31:20

+3

chr(0)创建空字符谁显示在utf8像^ @ – Mike 2015-02-26 19:27:55

0

chr(0)也为我工作:

fputcsv($fp, $aLine, $sDelimiter, chr(0)); 
+1

我认为这是因为你的编辑没有给你显示空字符,但它仍然存在 – nickel715 2016-09-13 12:37:51

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

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