2012-10-16 31 views
3

我有一個超過2.5GB的非常大的CSV文件,當導入到SQL Server 2005時,它在特定的行(82,449)上給出錯誤消息「Column delimiter not found」。在VIM中保存整個文件

問題出在該列的文本中使用雙引號,在這種情況下,它是有人寫下「Transferred money to ""MIKE"", Thnks」的註釋字段。

由於文件太大,我無法在Notepad ++中打開它並進行更改,這使我找到了VIM。

我很新的VIM和我回顧這教會了我如何更改使用82,449 G找到線,l到現場,x雙引號的文件教程文件。

當我使用:saveas c:\Test VIM\Test.csv保存文件時,它似乎是文件的一部分。原始文件爲2.6GB,新保存的文件爲1.1GB。原始文件有9,389,222行,新保存的有3,751,878行。我嘗試使用G命令在保存之前到達文件底部,這增加了相當大的尺寸,但仍然沒有保存整個文件;在使用G之前,該文件僅爲230 MB。

爲什麼我不保存整個文件的任何想法?

回答

4

您確實需要使用「流編輯器」,類似於Linux上的sed,它允許您通過它傳輸文本,而不會嘗試將整個文件保留在內存中。在sed我會這樣做:

sed 's/""MIKE""/"MIKE"/' <source_file_to_read> cleaned_file_to_write 

有一個sed for Windows

作爲第二選擇,您可以使用像Perl,Python或Ruby這樣的編程語言從文件逐行處理文本,在搜索雙引號時編寫文本,然後更改相關行,並繼續寫,直到文件被完全處理。

如果您的機器有足夠的可用RAM,VIM可能能夠加載文件,但這將是一個緩慢的過程。如果是這樣,你可以使用從直接模式搜索:

:/""MIKE""/ 

,並手動刪除了一倍引號,或具有VIM進行更改會自動使用:

:%s/""MIKE""/"MIKE"/g 

在這兩種情況下,寫,然後收盤時,文件中使用:

:wq 

在VIM,直接模式是編輯器的正常狀態,你可以使用你的ESC鍵得到它。

+0

感謝您的回覆! 我想我對你的回答有點困惑。 VIM打開文件沒有問題。我去了特定的線路,並將「MIKE」改爲MIKE。當我保存文件時(使用兩種方法,:saveas和:wq)它只是原始文件的一部分。 有沒有辦法讓它打開整個事情? 通過文本翻譯的問題是,我不知道所有問題都在哪裏,直到SQL Server告訴我在X行有問題。然後我去看看X行,解決問題並繼續前進。這一次它是「」MIKE「」下一次它可能是任何事情。 – Swizanson

+0

我可以告訴你在Windows上,但是哪個版本的操作系統?另外,請參閱[sed for Windows]的鏈接(http://gnuwin32.sourceforge.net/packages/sed.htm)。 –

+0

Windows 7,64位 – Swizanson

0

您也可以將文件分割成更小的更易於管理的塊,然後將其合併回去。下面是在bash腳本,可以將文件分成等份:

#!/bin/bash 

fspec=the_big_file.csv 
num_files=10 # how many mini-files you want 

total_lines=$(cat ${fspec} | wc -l) 
((lines_per_file = (total_lines+num_files-1)/num_files)) 
split --lines=${lines_per_file} ${fspec} part. 
echo "Total Lines = ${total_lines}" 
echo "Lines per file = ${lines_per_file}" 
wc -l part.* 

我只是61151570線測試了1GB的文件,並且每個生成的文件幾乎是100 MB

編輯:

我剛剛意識到你在Windows上,所以以上可能不適用。你可以使用一個像Windows程序一樣的工具,它可以做同樣的事情。

+0

這聽起來像一個不錯的選擇,謝謝!我從來沒有用過bash。我正在運行Windows 7,64位,有什麼我可以下載來運行此? – Swizanson

+0

如果bash可用,那麼'split'將會'將文件拆分成塊',並且是將文件分解爲塊的基本部分。編輯完成後,使用'cat'將它們放在一起。 –

+0

對不起,我對此很新... split是VIM或bash中的命令嗎?如果它在VIM中,我不需要加載整個文件,這是問題的一部分嗎? – Swizanson

0

如果您能夠打開文件而沒有像E342: Out of memory!這樣的錯誤,那麼您應該也可以保存整個文件。有至少應該在:w錯誤,完成了部分保存沒有錯誤是數據的嚴重損失,應報告爲一個bug,要麼vim_dev郵件列表或http://code.google.com/p/vim/issues/list

即Vim的準確版本是你使用?在Windows 7/x64上使用GVIM 7.3.600(32位),如果沒有內存不足,我無法打開1.9 GB的文件。我能夠成功打開,編輯和保存(完全)3.9 GB的文件,其中包含從here開始的64位版本7.3.000。如果您還沒有使用該本機64位版本,請嘗試一下。