2015-03-23 6 views
-1

У меня есть 170 двоичных файлов 1GB, где я хотел бы разделить их каждый раз, когда я нахожу конкретные строки ASCII. Некоторые из этих строк также имеют символы новой строки.Сплит двоичный файл на основе строки

csplit швы, как идеальный инструмент для этой задачи, но он швы, он не работает на двоичных файлах.

Вопрос

Если я преобразовать строки поиска в шестнадцатеричный/двоичный, это делает проблему проще решить, так что бинарный поиск в двоичных данных?

Если нет, как разбить двоичные файлы на основе строк ASCII, где некоторые из них имеют символы новой строки?

+0

Хотите Python, Perl или код оргии? – ForceBru

+0

Я открыт для всех из них =) Тот, который может решить проблему проще всего =) –

+0

Как работает 'csplit'? – augurar

ответ

2

Существует нет ничего особенного кроме того, что они часто содержат данные, которые не будут отображаться в виде текстового файла бинарных файлов, и они не выглядят красивыми, когда вы печатаете их. Они по-прежнему представляют собой последовательность октетов, которые должны быть поняты, и большинство достойных языков позволяют делать именно это.

Приведенный пример может помочь.

Вы не описываете строку, которую хотите использовать в качестве разделителя, и не говорите, что хотите делать с каждым фрагментом после его чтения, так что вот программа Perl, которая читает 1GB исходный файл в кусках, который заканчивается specific ASCII string и записывает их по одному в новый файл. Поэтому он довольно неуклюже копирует файл.

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 полезной

1

Вы можете изменить разделитель входных записей $/, чтобы быть конкретной строкой поиска, которую вы хотите разделить (по умолчанию это новая строка). Тогда, как вы будете читать входной файл, распечатать каждую запись в новый уникальный файл:

#!/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; 
} 
+0

Это не будет работать в Windows, потому что слой Perl I: 'crlf' удалил карету, возвращает символы' '\ x0D" ', прежде чем ваша программа увидит данные. Он также не будет работать на старых Mac-контейнерах, но это менее вероятно. – Borodin

+0

Спасибо @Borodin. Это хорошо знать. В этом случае OP ищет решение для Linux, но лучше стремиться к межплатформенной совместимости. –

+1

Вот почему это * комментарий * :) То, что многие люди не получают, это то, что Stack Overflow не является форумом, где проблема отдельного человека может обсуждаться, чтобы найти их решение, но больше Wikipedia решений проблем программирования , OP должен быть очень низким в вашем списке людей, чтобы удовлетворить, потому что, если это хороший вопрос, будет еще тысяча, которые последуют за ними, чтобы найти решение аналогичной проблемы. Если эти другие сталкиваются с вашим решением, которое выглядит так, как будто оно должно делать то, что им нужно, тогда вы их подведете. – Borodin

Смежные вопросы