2011-07-19 57 views
1

我有一個「壞」選項卡分開的文件,我需要清理。問題在於田地可能有換行。我認爲解決這個問題最簡單的方法就是用一些替換字符替換錯誤的換行符,比如空格。現在我能想象的方式來做到這一點,如果有應該是在第n行的字段將是(僞)解析錯誤的CSV

var line = read n-1 fields ending in a tab, and then until the end of line 
line.replace("\n", " ") 
line.replace("\r", " ") 
write line to output 

現在,這些文件是巨大的,他們啜是不是一種選擇。這是一個合理的方法嗎? (我知道這將在最後一個領域的線性突破中脫穎而出,但我願意忍受這一點) 什麼是讀取足夠數據的好方法?我不在乎它使用哪種語言,但更喜歡.net,perl或python2,因爲我有可用的運行時。

+0

如果文件不是*可怕*大,我只是在Vim的做。如果是這樣,那麼我個人會用Python來做。你的方法對我來說似乎很好。 –

+0

以千兆字節爲單位。我不寒而慄。 – Martijn

回答

1

你可以在一個非常快的awk腳本做到這一點:

awk -F\t '{while(NF < (numberoffields) { line=$0; getline; $0 = line $0;} print}' 
0

我不確定這是否是合適的論壇來問這個問題,但您需要TextWrangler(Mac OSX)等文本編輯器程序。這可以處理大型數據集並執行一些非常複雜的搜索和替換。

我猜想必須有一個與PC相當的程序。

CSV文件基本上是一天結束時的文本文件,所以這就是你需要驢子工作的問題。

+0

我不明白爲什麼使用具有正則表達式搜索功能的全文本編輯器/ IDE具有編程方式讀取它的優勢。 TextWrangler可能會在大文件上掙扎(請參閱http://faq.barebones.com/do_getanswer.php?record_id=36) – Martijn

+0

我每天處理的數據上傳數百萬條記錄,相信我這不是在處理平面文件時不常見。但是,差異非常明顯。您已經編寫,運行並檢查程序的結果,並在文件中找不到錯誤所在的位置。文本編輯器(簡單或複雜)可以加快分析過程,因爲搜索功能完全是爲了完成這項任務 - 而且您無需進行測試。它只是工作。在某些情況下,您可能只會談論一兩行或錯誤記錄。 – T9b

+0

顯然我不知道數據集的實際大小,或者CSV文件的創建方式。也許這是一個糟糕的腳本,從數據庫中選擇了一個?你不能修復提取腳本嗎? – T9b

1

一個Python的解決方案:

csv_filename = 'foo.csv' 
new_csv_filename = 'foo.fixed.csv' 
num_fields = 10 

with open(csv_filename, 'rU') as reader and open(new_csv_filename, 'w') as writer: 
    while True: 
     line = '' 
     while len(line.split('\t')) < num_fields: 
      line += reader.readline().replace('\n', ' ') 
     writer.write(line + '\n') # Or '\r\n' if you prefer 

我不會使文件自動更換;確保你保留原文。

+0

我不知道你打算如何處理這個文件,但是如果你打算進一步處理它,你可以用Python做,那麼就不需要編寫它。你可以使它成爲一個生成器(把它放在函數中,而不是'writer.write(...)','yield ...'),並使用'csv'模塊(delimiter ='\ t' )。 –

+0

感謝您的額外信息,但我只是需要發送它。 – Martijn

+0

@Martijn:爲你工作嗎? –