Как очистить файл данных от двоичного мусора? - PullRequest
0 голосов
/ 10 июня 2011

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

  y mon d  h XX11 XX22 XX33 XX44 XX55 XX66^@
2011  6 6 10 14.0 15.5 14.3 11.3 16.2 16.1

grep также говорит, что это двоичный файл: Binary file data.dat matches

Это вызывает некоторые проблемы в моемскрипт разбора.Я разделяю каждую строку и помещаю их в массив.Последний элемент (XX66) в первом массиве как-то поврежден из-за мусора, и я не могу сопоставить его.

Как очистить эту строку или массив?Я попытался dos2unix для файла и замены членов массива s/\s+$//.Что это за хлам в любом случае?К сожалению, я не могу контролировать данные, это данные третьих лиц.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 10 июня 2011

Grep пытается быть умным и, когда видит непечатаемый символ, переключается в «двоичный» режим.Добавьте «-a» или «--text», чтобы заставить grep оставаться в «текстовом» режиме.

Что касается sed, попробуйте sed -e 's/\([^ -~]*\)//g', который говорит: «измените все, не находясь между пробелом и тильда (символы 0x20 и 0x7E соответственно) в ничто ".Это также уберет вкладки, но вы можете вставить символ табуляции перед пробелом, чтобы включить их (или любой другой специальный символ).

«^ @» - это один из способов представления NUL (иначе)ascii (0) "или" \ 0 ").Некоторые программы могут также видеть это как конец файла, если они были реализованы наивным способом.

0 голосов
/ 24 августа 2017

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

#!/usr/bin/perl
use strict;
use warnings;

my $filename = $ARGV[0];
open my $fh, '<', $filename or die "File not found: $!";
open my $fh2, '>', 'report.txt' ;
binmode($fh);

my ($xdr, $buffer) = "";

# read 1 byte at a time until end of file ...
while (read ($fh, $buffer, 1) != 0) {   
    # append the buffer value to xdr variable
    $xdr .= $buffer; 
    if (!($xdr =~ /[\0-\11]/) and (!($xdr =~ /[\13-\14]/))and (!($xdr =~ /[\16-\37]/)) and (!($xdr =~ /[\41-\55]/)) and (!($xdr =~ /[\176-\177]/))) {
        print $fh2 $xdr;
    }
    $xdr = "";
} 
# finaly, clean all the characters that are not ASCII.
system("perl -plne 's/[^[:ascii:]]//g' report.txt > $filename.clean.txt");
0 голосов
/ 10 июня 2011

^ @ выглядит как контрольный персонаж.Я не могу понять, какой это должен быть символ, но, думаю, это не важно.

Вы можете использовать s / ^ @ // g, чтобы избавиться от них, но вы должны на самом деле скопировать персонажа,просто сложить ^ и @ вместе не получится.

e: f; b.

0 голосов
/ 10 июня 2011

Если это всегда одни и те же коды (например, ^ @ или похожие), вы можете найти / заменить их.

Например, в Vim:

:%s/^@//g в режиме редактирования очиститлюбой из этих символов.

Чтобы ввести такой символ, как ^@, нажмите и удерживайте кнопку Ctrl, нажмите «v», а затем нажмите нужный вам символ - в указанном выше случае не забывайте удерживать клавишу Shiftвниз, чтобы получить ключ @.Клавиша Ctrl должна удерживаться до конца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...