我有一个包含两列(浮点数)的巨大文本文件。我想将它们分成两个文件,每个文件包含大致相同的行数。做这个的最好方式是什么?我正在使用 VS 2012。文件大小约为 2Gb。
3 回答
代码确实需要由您“启动”。无论如何,这是我的想法的集合-我也从其他评论者那里借来了。
我的方法,伪代码:
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 写入,并且由于它处理纯字节副本,因此避免了中点线起点定位后逐行处理。
只要行具有均匀的长度分布,这种方法将导致两个输出文件中出现的行数大致相同;另一方面,即使行长度以倾斜的方式相差很大,两个输出文件的大小也将大致相同。
现在开始编码。
有一个免费的工具,称为HJSplit的 Windows 文件拆分器 ,它可以拆分任何类型和大小的文件。或者这个。您也可以在 Windows 上的 cygwin 中使用 grep 或在 powershell 中使用
[这里是用 C++ 完成的:相关问题:](Split a Large File In C++)
在 Unix 中使用“split”命令。Cygwin 如果你在 Windows 上。