簡體   English   中英

用ruby格式化CSV的標題行

[英]formatting header row of a CSV with ruby

我處理許多帶有UTF-8字符的CSV文件-即繁體中文。 我今天遇到一種特殊情況,即CSV文件的標題行太亂了,以至於我需要替換它(我有確切的值要替換)。 其余的CSV數據實際上很好。

我要解決的問題是如何(使用ruby)簡單地打開有問題的CSV文件,刪除現有的標題行,然后用正確的標題行替換它,而不必加載整個文件。 如果我可以做到這一點,而不必處理格式錯誤的標題,則可以節省一些時間!

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繼承下來的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM