2013-11-15 56 views
0

我有一個基本的PHP腳本,可以從數組中創建一個csv文件。下面是代碼示例:fputcsv添加一行以最後一個元素結尾

$array = [ 
    [1,2,3], 
    [4,5,6] 
]; 

$handle = fopen('test.csv', 'w'); 

foreach($array as $v) 
    fputcsv($handle, $v); 

fclose($handle); 

生成的文件總是在文件的最後一個空行,因爲fputcsv不知道,這是最後一道防線。任何(簡單)的想法如何防止這種情況?

編輯:

原來的問題是現在無關(給我,但也許有人會需要做到這一點)。 fputcsv應該添加一個新行,即使在文檔的末尾,這也是所有csv文件的預期行爲。

我標記了解決原始問題的答案,儘管它與我無關。因此在我的上下文中,我需要檢查數組的最後一行(或任何行)是否爲NULL(否則PHP將通過一個Warning,fputcsv的第二個參數爲null)。這是我的更新腳本如果有人有興趣:

$array = [ 
    [1,2,3], 
    [4,5,6] 
]; 

$handle = fopen('test.csv', 'w'); 

foreach($array as $v) 
    if($v != NULL) 
     fputcsv($handle, $v); 

fclose($handle); 
+5

所有行應該有一個行後面結束。一個空行將是連續的兩條新行。 – Barmar

+0

在文件末尾有空行有什麼問題?爲什麼這是不需要的?當我打開文件時,我運行了你的代碼並且Excel顯示了2行。 –

+0

該腳本實際上是一個類的一半,它需要一個csv,將其轉換爲一個數組,然後返回一個新的csv(以便您可以使用PHP來更改CSV)。我不希望任何額外的行不在原始文檔中。 – user1564018

回答

6

我發現了另一個問題該解決方案:)https://stackoverflow.com/a/8354413/1564018

$stat = fstat($handle); 
ftruncate($handle, $stat['size']-1); 

我將這兩行fputcsv後(他們最後刪除換行符,刪除文件末尾的空白行。

+1

這在技術上是對原始問題的答案,但問題最終變得毫無意義,因爲我沒有意識到文檔末尾的新行是預期的。查看評論。 – user1564018

+0

這完美地工作。謝謝!我希望我不必處理這個問題,但我正在生成CSV文件,以便通過MS Word的郵件合併功能進行處理......這是一件非常美妙的事情......不幸的是,由於規範不明確,我不能直接責怪MS開發人員關於如何結束CSV文件的最後一行[https://tools.ietf.org/html/rfc4180],但他們的解決方案是在用戶輸入一個錯誤,當「空行」爲空時,最後一條記錄爲空處理。感謝您幫助我解決了這個錯誤信息。 – deadpixel

1

就像@Barmar說的,所有的行都有一行結尾,讓我們說\ n。你在文件末尾看到的空白行是你的編輯做的。一個真正的空白線是連續兩個結束字符。 (\ n \ n例如)

假設你有一個空白文件:

(EOF) 

如果fputcsv這樣的:陣列(0, 「你好」,3323)

(0,hello,3323\nEOF) 

給出PHP文檔:

fputcsv()格式的線(作爲字段數組傳遞)爲CSV並寫入它(以換行符結尾)到指定的文件句柄。

然後您的編輯器中會出現空白行。但在文件中沒有這樣的事情。

1

fputcsv在每行之後添加一個新行,這就是它的工作原理。從docs

​​3210

在文件末尾的新行是不是一個錯誤,或者是你需要擔心。不要試圖刪除它,只要放棄它。

在評論中,你提到你得到了一個錯誤:

Warning: fputcsv() expects parameter 2 to be array, boolean given

這可能是因爲你沒有使用正確fgetcsv。它在到達文件結尾(新行)時返回FALSEdocs告訴你如何正確使用它:

while (($data = fgetcsv($handle)) !== FALSE) { 
} 
相關問題