3

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

问题在于该列文本中的双引号,在这种情况下,它是某人写的注释字段“ Transferred money to ""MIKE"", Thnks”。

因为文件太大,我无法在记事本++中打开它并进行更改,这让我找到了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

3 回答 3

4

您确实需要使用类似于sedLinux 上的“流编辑器”,它可以让您通过管道传输文本,而无需尝试将整个文件保存在内存中。在 sed 我会做类似的事情:

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

有一个用于 Windows 的 sed

作为第二种选择,您可以使用 Perl、Python 或 Ruby 等编程语言逐行处理文件中的文本,在搜索双引号时写入,然后更改相关行,然后继续编写直到文件被完全处理。

如果您的机器有足够的空闲 RAM,VIM 可能能够加载文件,但这将是一个缓慢的过程。如果是这样,您可以使用以下命令从直接模式搜索:

:/""MIKE""/

并手动删除双引号,或让 VIM 使用以下命令自动进行更改:

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

在任何一种情况下,使用以下命令写入然后关闭文件:

:wq

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

于 2012-10-16T16:27:04.347 回答
0

当您能够打开文件而没有出现类似的错误E342: Out of memory!时,您也应该能够保存完整的文件。至少应该有一个错误:w,没有错误的部分保存是严重的数据丢失,并且应该在 vim_dev 邮件列表或http://code.google.com/p/vim上报告为错误/问题/列表

你使用的是哪个版本的 Vim?在 Windows 7/x64 上使用 GVIM 7.3.600(32 位),我无法在没有内存不足的情况下打开 1.9 GB 的文件。我能够从这里成功打开、编辑和保存(完全!)一个 64 位版本 7.3.000 的 3.9 GB 文件。如果您还没有使用本机 64 位版本,请尝试一下。

于 2012-10-17T09:05:56.920 回答
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 上,因此上述内容可能不适用。您可以使用简单的文本拆分器之类的实用程序和执行相同操作的 Windows 程序。

于 2012-10-16T16:38:04.987 回答