在VIM中保存整个文件

3
我有一个非常大的CSV文件,超过2.5GB,当我将其导入到SQL Server 2005中时,会在特定行(82,449)上出现错误消息“未找到列分隔符”。
问题出在该列文本中的双引号,例如这个笔记字段中写了“转账给“MIKE”,谢谢”。
由于文件太大,我无法在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。
您有什么想法,为什么我没有保存整个文件?
3个回答

4
你真的需要使用“流编辑器”,类似于Linux上的sed,让你可以将文本通过管道传输,而不必尝试将整个文件保存在内存中。在sed中,我会这样做:
sed 's/""MIKE""/"MIKE"/' < source_file_to_read > cleaned_file_to_write

有一个Windows下的sed

作为第二选择,你可以使用像Perl、Python或Ruby这样的编程语言,逐行从文件中处理文本,搜索双引号并改变相关行,然后继续写入,直到文件被完全处理。

如果你的计算机有足够的空闲内存,VIM可能能够加载该文件,但这将是一个缓慢的过程。如果可以,你可以使用直接模式进行搜索:

:/""MIKE""/

您可以手动删除一个双引号,或者使用VIM自动进行更改:

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

无论哪种情况,都要使用以下方式编写并关闭文件: ```

```
:wq

在VIM中,直接模式是编辑器的正常状态,您可以使用ESC键进入该模式。

谢谢您的回复! 我想我对你的回答有些困惑。 VIM毫无问题地打开了文件。 我跳转到问题所在的特定行并将"" MIKE ""更改为MIKE。 当我保存文件(使用两种方法::saveas和:wq)时,只剩下原始文件的一部分。 有办法让它打开整个文件吗?通过文本管道传输的问题是我不知道所有问题的位置,直到SQL Server告诉我第X行出现问题。 然后我查看第X行,解决问题并继续前进。 这次是““ MIKE ””,下一次可能是任何事情。 - Swizanson
我可以看出你正在使用Windows,但是操作系统的哪个版本?此外,请参阅sed for Windows的链接。 - the Tin Man

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.*

我刚刚在一份大小为1GB的文件中测试了它,其中包含61151570行,每个生成的文件几乎都有100 MB

编辑:

我刚刚意识到你在使用Windows操作系统,所以上面的可能不适用。你可以使用类似于simple text splitter的实用程序,这是一个在Windows上运行的程序,可以做同样的事情。


听起来是个不错的选择,谢谢!我以前从未使用过bash。我正在运行64位的Windows 7,有什么可以下载来运行它吗? - Swizanson
如果有bash,那么split也应该可用,它可以“将文件分割成多个部分”,是将文件分成块的基本部分。编辑后,使用cat将它们重新组合在一起。 - the Tin Man
抱歉,我对这个很新... split 是在 VIM 或 bash 中的命令吗?如果是在 VIM 中,那么我不需要加载整个文件,这就是问题的一部分了吧? - Swizanson
Split是Bash中的一个命令。你可以使用一些相对轻量级的工具,比如GOW,在Windows 7上运行这些命令。 - Daan Bakker
Split不是Bash中的一个命令,它是一个在命令行可用的单独应用程序。 - the Tin Man

0

当您能够在没有错误的情况下打开文件(如E342: Out of memory!),您也应该能够保存完整的文件。在执行:w命令时至少应该出现一个错误,如果部分保存没有出现错误,则会导致严重的数据损失,并应将其报告为错误,可以通过vim_dev邮件列表或http://code.google.com/p/vim/issues/list进行报告。

您使用的Vim确切版本是多少?在Windows 7/x64上使用GVIM 7.3.600(32位)时,我无法打开一个1.9 GB的文件而出现了out of memory错误。但是,我成功地使用从here下载的64位版本7.3.000打开、编辑和保存(完整!)一个3.9 GB的文件。如果您还没有使用本机64位版本,请尝试一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接