2014-03-04 49 views
0

我使用了很多CSV文件,其中包含UTF-8字符 - 即中文繁體。我今天碰到的一種特殊情況是,我的CSV文件的標題行非常亂,以至於我需要替換它(我有確切的值來做)。其餘的CSV數據實際上很好。使用ruby格式化CSV的標題行

我想要解決的是如何(使用紅寶石)只需打開有問題的CSV文件,刪除現有的標題行,然後用正確的標題行替換它,而無需加載整個文件。如果我可以做到這一點,而不必處理嚴重格式化的頭文件,它會爲我節省一些嚴重的時間!

+0

我們需要看你的努力。對於我們來說,糾正你的代碼比我們寫一些不知道你所做的事情的東西容易得多,然後你試着去修改它。 –

+0

據我所知,在CSV部分寫不可能.. –

回答

0

CSV文件不是由固定長度的記錄組成的,而是它們通常是由可變長度字符串組成的文件。因此,如果不讀取整個文件,則無法刪除或插入一行。

您可以可以只要更改的內容與舊文本的字節大小完全相同即可,但這種情況不太可能。

相反,我會做這樣的事情:

  1. 公開賽在"w"模式的新文件。
  2. 將新標題寫入它。
  3. 使用"r"模式打開舊的(CSV)文件,就好像它是一個文本文件。
  4. 閱讀一行。
  5. 使用$.來查看您是否在第一行。如果是這樣,跳到你的循環結束。
  6. 如果$.大於第一行,請寫下該行。
  7. 循環到#4。
  8. 關閉輸入文件。
  9. 關閉輸出文件。

這裏實現了相同的想法,但沒有測試,在Ruby中:

NEW_HEADER = 'some, csv, header' 

File.open('new_csv_file', 'w') do |fo| 
    File.foreach('old_csv_file') do |li| 
    if $. > 1 
     fo.puts li 
    else 
     fo.puts NEW_HEADER 
    end 
    end 
end 

就像我說的,這不是測試,而是應該讓你開始。


什麼呢$。做?

引述「Ruby編程語言」關於$.

從當前輸入文件讀取的最後一行的數字。相當於ARGF.lineno。英文同義詞:$NR$INPUT_LINE_NUMBER

這是一個Perl主題,如果我沒記錯的話,它可能會從shell繼承它。

+0

哦,我明白了,讓我測試這個,看看它是如何去。我的答案確實有一個問題 - $是什麼。做? – NallaN

+0

查看答案中的附加信息。 –

+0

真棒 - 感謝您的信息!這基本上就是我正在尋找的東西! – NallaN