В экспортированном файле TSV есть пробелы между каждым символом при использовании текстового процессора (Perl CSV или find/findstr DOS)

У меня есть файл TSV, экспортированный из приложения (веб-плеер Spotfire с использованием Internet Explorer). При просмотре этого файла в Notepad++ или блокноте все выглядит хорошо (снимок PFA).

Но если я ввожу файл в парсер CSV на основе Perl (фактически TSV) или просто использую команды MS-DOS find/findstr, каждый символ фактически появляется с пробелом.

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

введите здесь описание изображения


person Siva    schedule 27.08.2014    source источник
comment
Текст на этом скриншоте безбожно мелкий. Вместо изображения вырежьте и вставьте в свой вопрос фрагмент фактического текста.   -  person ThisSuitIsBlackNot    schedule 27.08.2014
comment
Файл закодирован в UTF-16 или подобном?   -  person choroba    schedule 27.08.2014


Ответы (1)


Ваш файл имеет кодировку Unicode. (Notepad++ показывает его как "UCS-2 Little Endian" в строке состояния.) Вам нужно сообщить Perl, что такое кодировка, и декодировать данные при чтении из файла.

use Encode qw(decode);
# read from file into $octets...
my $chars = decode('UCS-2LE', $octets, Encode::FB_CROAK);
person Michael Carman    schedule 27.08.2014
comment
Получил эту ошибку: UCS-2BE: символ Unicode fffe является недопустимым в C:/Perl64/site/lib/Text/CSV_PP.pm, строка 679. my $csv = Text::CSV->new({ sep_char => '\t', binary => 1, auto_diag => 1, eol => $/,quote_space => 0 }); open my $in_fh, "<:encoding(UCS-2)", $CSVFile or die $!; open my $out_fh, '>', $tmpCSVFile or die $!; my $cnt=1; while (my $row = $csv->getline($in_fh)) { my $date = $row->[0]; # do checks here.... $csv->print($out_fh, $row); } - person Siva; 27.08.2014
comment
Как преобразовать или сохранить файл из USC-2 в кодировку ANSI? - person Siva; 27.08.2014
comment
@Siva: Вы используете неправильный уровень кодирования. FFFE — это спецификация файла с прямым порядком байтов, но вы используете кодировку с прямым порядком байтов. Измените UCS-2 на UCS-2LE. - person Michael Carman; 28.08.2014