2010-08-15 57 views
2

我有一個大的csv。我想刪除文件的第一行。這是如何完成的?我不想將每行都複製到一個數組中,並將它們重寫爲先前的索引並刪除第一個。一定會有更好的辦法。如何刪除csv的第一行? (紅寶石)

謝謝

回答

2

嗯,有一些快捷鍵,你可以採取,但也有幾件事情是你無法迴避:

  • 根據不同的編碼,一個字符可能不會映射到文件中的單個字節,因此您必須將其作爲文本讀取。

  • 您必須至少解析文件的第一條記錄。儘管CSV格式使用換行符來分隔記錄,但它不是基於行的。值也可以包含換行符,因此您不能只讀取第一個換行符並理所當然地認爲這是第一條記錄。

  • 沒有辦法刪除文件的一部分,所以無論你做什麼,你仍然需要重寫整個文件。

所以,你可以解析頭(如果有的話),並在第一個記錄,那麼你就可以讀取該文件以純文本的其餘部分。然後,您可以將其餘的部分寫回到第一條記錄開始的位置(或者從文件的開頭寫入幷包含標題)。

+0

僅僅因爲字段包含未轉義的特殊字符,爲什麼這意味着「CSV格式不是基於行」?但是,我同意你永遠不應該假設文件格式正確。 – klynch 2010-08-15 02:35:47

+0

@klynch:這意味着你不能只讀一行,然後將其解析爲記錄,因爲記錄可能會跨越多行。這不是因爲它沒有正確格式化,儘管這是一個好點。例如,Excel可能會在記錄末尾留出值,如果它們爲空,則不能認爲所有記錄都具有相同數量的值。 – Guffa 2010-08-15 09:22:40

3

雖然Guffa是正確的關於有在頭可能換行,這不是通常的,所以如果你確定與忽略了邊緣的情況下,你可以使用:

File.open('new.csv', 'w+') do |outf| 
    File.open('original.csv') do |inf| 
    inf.each_line.with_index do |line, i| 
     outf.write line unless i==0 
    end 
    end 
end 

如果這是太慢你,讓我知道,我們將重寫這個使用塊讀取,而不是實際解析整個文件。