2009-11-25 64 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));