2012-10-16 29 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位版本,请尝试一下。