0

我有一个包含两列(浮点数)的巨大文本文件。我想将它们分成两个文件,每个文件包含大致相同的行数。做这个的最好方式是什么?我正在使用 VS 2012。文件大小约为 2Gb。

4

3 回答 3

1

代码确实需要由您“启动”。无论如何,这是我的想法的集合-我也从其他评论者那里借来了。

我的方法,伪代码:

open I for reading
open O1 for writing
open O2 for writing
while I has input:
   write next line from I into O1
   if I has input:
       write next line from I into O2

请注意,与 Perl 方法不同的是,它不需要先一次性读取文件来读取行数。这将读取 IO 减少了大约一半。但是,与 perl 方法一样,它仍然可以逐行运行,并且需要行扫描/处理。由于该算法是流式传输的(该行仅保留足够长的时间以便写入),因此它应该适用于所有文件大小。缓冲输出流对性能非常重要。

Markus Mikkolainen 建议的方法类似于:

open I for reading
seek to midpoint of I using filesize/2
scan backward to line start
open O1 for writing
write bytes 0..(mid line start + length) from I to O1
open O2 for writing
write bytes (mid line start + length)..filesize from I to O2

如果可以修改输入文件,则只需要完成对 O2 的写入,然后对 I 进行适当的截断。这可能导致我的方法中大约一半的 IO 写入,并且由于它处理纯字节副本,因此避免了中点线起点定位后逐行处理。

只要行具有均匀的长度分布,这种方法将导致两个输出文件中出现的行数大致相同;另一方面,即使行长度以倾斜的方式相差很大,两个输出文件的大小也将大致相同。

现在开始编码。

于 2013-03-20T23:47:11.003 回答
1

有一个免费的工具,称为HJSplit的 Windows 文件拆分器 ,它可以拆分任何类型和大小的文件。或者这个。您也可以在 Windows 上的 cygwin 中使用 grep 或在 powershell 中使用

[这里是用 C++ 完成的:相关问题:](Split a Large File In C++

于 2013-03-20T23:34:52.653 回答
0

在 Unix 中使用“split”命令。Cygwin 如果你在 Windows 上。

于 2013-03-20T23:42:00.313 回答