在VIM中保存整个文件

时间:2012-10-16 16:14:17

标签: windows vim

我有一个非常大的CSV文件,超过2.5GB,当导入SQL Server 2005时,会在特定行(82,449)上显示错误消息“Column delimiter not found”。

问题在于该列文本中的双引号,在这个例子中,它是某个人写下“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。

关于我为什么不保存整个文件的任何想法?

3 个答案:

答案 0 :(得分:4)

你真的需要在Linux上使用类似于sed的“流编辑器”,它允许你通过它传输文本,而不是试图将整个文件保存在内存中。在sed我会做类似的事情:

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

sed for Windows

作为第二种选择,你可以使用像Perl,Python或Ruby这样的编程语言来逐行处理文本,在搜索doubled-quotes时写入,然后更改有问题的行,以及继续写,直到文件完全处理完毕。

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

:/""MIKE""/

并手动删除doubled-quote,或让VIM使用以下命令自动进行更改:

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

在任何一种情况下,使用以下方式编写,然后关闭文件:

:wq

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

答案 1 :(得分: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上,所以上述内容可能不适用。您可以使用像simple text splitter这样的实用程序来执行相同的操作。

答案 2 :(得分: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文件。我能够从here成功打开,编辑和保存(完全!)带有64位版本7.3.000的3.9 GB文件。如果您尚未使用该原生64位版本,请尝试一下。