基于字符串拆分二进制文件



我有170个1GB的二进制文件,每次找到特定的ASCII字符串时,我都想将它们拆分。其中一些字符串也有换行符。

csplit类似于用于此任务的完美工具,但它对二进制文件不起作用。

问题

如果我将搜索字符串转换为十六进制/二进制,这是否会使问题更容易解决,那么这就是二进制数据中的二进制搜索?

如果没有,我如何分割基于ASCII字符串的二进制文件,其中一些文件有换行符?

二进制文件没有什么特别之处,只是它们通常包含不会出现在文本文件中的数据,而且打印时看起来不好看。它们仍然是一个必须理解的八位字节序列,而大多数像样的语言都允许你这样做。

举个例子可能会有所帮助。

您没有描述要用作分隔符的字符串,也没有说明读取每个块后要对其做什么,因此这里有一个Perl程序,它以specific ASCII string结尾的块读取1GB的原始文件,并一次一个地将其写入新文件。因此,它相当笨拙地复制了文件。

use strict;
use warnings;
open my $fh, '<:raw', '1GBfile' or die $!;
local $/ = 'specific ASCII string';
open my $out_fh, '>:raw', 'new1GBfile' or die $!;
select $out_fh;
print while <$fh>;
close $out_fh or die $!;

根据您对文件中的数据所做的操作,您可能会发现File::Map有用的

您可以将输入记录分隔符$/更改为要拆分的特定搜索字符串(默认情况下,它是换行符)。然后,当您读取输入文件时,将每条记录打印到一个新的唯一文件:

#!/usr/bin/perl
use strict;
use warnings;
# change the input record separator to whatever string you want
$/ = "SOME STRING";
my $file_num = 0;
while (my $data = <>) {
  chomp $data; # remove input record separator
  my $file = "file." . ++$file_num;
  open my $fh, '>', $file or die "can't open file: $file: $!n";
  print $fh $data;
  close $fh;
}

最新更新