2012-04-21 57 views
4

我生成從紅寶石CSV文件,以及正在接收數據的系統不能接受在底部的空行。Ruby和寫入CSV - 如何避免在最後一個空行?

不過,我已經附加我所有的線(與CRLF爲此)最後一排仍具有CFLF,所以接收系統後,認爲有一個空行鐳石光電。

size = File.size(filename) 
    File.truncate(filename, size-3) 

我丟失的紅寶石CSV一些功能,如果它是最後一行不添加CRLF:

我做這個(的hackish)的代碼來打開並截斷該文件解決它?

我寫的CSV代碼:

csv = CSV.open(filename, "w", {:row_sep => "\r\n"}) 
    .. code to create an array of cols .. 
    csv << cols 

我試着將這個使用字符串,而不是一個文件。但是我沒有成功。我一直使用運算符< <發生錯誤。

更新:原來我有一個錯誤的問題...

這已經有一段時間,但我終於想通了事情的原委。主機系統,我也上傳可以在文件的結尾處理換行符 - 這是Ruby的CSV是把錯誤的換行字符:\ r \ r \ n \ r \ n個instread!如果我把它寫成文本文件,它就是這樣做的。如果我寫作二進制文件,問題就解決了。

萬一別人看到了同樣的問題,這是我的紅寶石:

csv = CSV.open(filename, "w", {:row_sep => "\r\n"}) # actually writes \r\r\n 

二進制模式修復它:

csv = CSV.open(filename, "wb", {:row_sep => "\r\n"}) # correctly writes \r\n 
+2

在我看來接收系統壞了。 – Arkku 2012-04-21 12:30:25

+0

好點。在我的掌握,但..但我會提出針對它的一個bug, – peterept 2012-04-21 12:37:15

+1

什麼是你的代碼來生成CSV?具體來說,你如何將它寫入文件? – Phrogz 2012-04-21 14:27:00

回答

2

如果您在寫入之前將CSV作爲字符串獲取,請你可以使用String#chomp刪除尾隨的換行符。

如果您使用寫入文件:

File.open('my.csv','w'){ |f| f.puts my_csv } 

...那麼你自己添加一個換行符,可以與避免:

File.open('my.csv','w'){ |f| f.write my_csv } 

如果您提供您的實際代碼生成並撰寫CSV,我們可以幫助您進一步更準確。

0

你可以使用sub!在最後去掉所有換行符的文件:

# my_csv_contents contains all of the CSV data 
my_csv_contents.sub!(/(\r?\n)*\z/, "") 
+0

可變'my_csv_contents'是CSV文件的全部內容,而不是一個單一的行的內容。 '$'僅在該字符串的末尾匹配 - 在這種情況下,該文件結束,而不是行結束。 – robbrit 2012-04-21 15:03:19

+1

嘗試:'「a \ n \ nb \ n」.sub/\ n $ /,「」#=>「a \ nb \ n」';你希望'\ z'匹配Ruby正則表達式中字符串的結尾。 – Phrogz 2012-04-21 16:03:41

+0

所以,這段代碼真的應該是:'my_csv_contents.sub!(/(?:\ r?\ n)+ \ z /,「」)' – Phrogz 2012-04-21 21:27:05

相關問題