2014-08-27 2 views
0

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

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

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

enter image description here

+0

Текст на этом скриншоте не имеет большого размера. Вместо изображения вырезаем и вставляем фрагмент фактического текста в ваш вопрос. – ThisSuitIsBlackNot

+1

Является ли файл закодирован в UTF-16 или аналогичный? – choroba

ответ

4

Ваш файл закодирован 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); 
+0

Получил эту ошибку - ** UCS-2BE: символ юникода 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 или die $ !; open my $ out_fh, '>', $ tmpCSVFile или die $ !; my $ cnt = 1; while (my $ row = $ csv-> getline ($ in_fh)) { \t my $ date = $ row -> [0]; \t # делать проверки здесь .... \t $ csv-> print ($ out_fh, $ row); } ' – Siva

+0

Как преобразовать или сохранить файл из USC-2 в кодировку ANSI? – Siva

+0

@Siva: Вы используете неправильный слой кодирования. 'FFFE' является спецификацией для файла little-endian, но вы используете кодировку big-endian. Измените 'UCS-2' на' UCS-2LE'. –