2009-03-16 3 views
32

У меня есть сценарий, который добавляет новые поля к существующему CSV, однако в конце старых строк появляются символы ^M, поэтому новые поля заканчиваются новой строкой, а не той же. Как удалить ^M символов из файла CSV с помощью Perl?В Perl, как удалить^M из файла?

+0

Используйте 'binmode (STDIN, ": CRLF")' или 'PerlIO =: Unix: crlf' (см [http://stackoverflow.com/a/21320709/424632]). – musiphil

ответ

14

Вы узнали, что можете o сделать это:

$line=~ tr/\015//d; 
+0

Это отлично сработало для меня! – onaclov2000

+1

не так читается, как '\ r' - любой, кто смотрит на это (или сам через год), был бы рад комментарию о том, что он делает – plusplus

44

^M - возврат перевозки. Вы можете сделать это:

$str =~ s/\r//g 
1

Чтобы преобразовать DOS стиль UNIX стиль окончаниях строк:

for ($line in <FILEHANDLE>) { 
    $line =~ s/\r\n$/\n/; 
} 

Или, чтобы удалить UNIX и/или DOS стиль строки окончаний:

for ($line in <FILEHANDLE>) { 
    $line =~ s/\r?\n$//; 
} 
+0

не удастся ли перенести тоже? –

+0

Думаю, это зависит от вашей цели. Я отредактировал, чтобы показать обе стратегии. – spoulson

23

Or a 1-футовый:

perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt 
+2

Это так легко запомнить этот как Perl Pie. – dreamlax

+0

@dreamlax: haha ​​perl pie! – Frank

+0

При прохождении окон * .txt с этой командой не работает. Он дает: Невозможно открыть * .txt: Недопустимый аргумент. Кто угодно? – mgouin

-1

В vi hit :.

Then s/Control-VControl-M//g.

Control-VControl-M, очевидно, эти ключи. Не повторяйте это.

+1

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

7

Слегка связаны между собой, но удалить^M из командной строки с помощью Perl, выполните следующие действия:

perl -p -i -e "s/\r\n/\n/g" file.name 
2

Это один вкладыш заменяет все^символы M:

dos2unix <file-name> 

Вы можете вызвать эту изнутри Perl или непосредственно в приглашении Unix.

6

Я предпочитаю более общее решение, которое будет работать с входами DOS или Unix. Предполагая, что вход от STDIN:

while (defined(my $ln = <>)) 
    { 
    chomp($ln); 
    chop($ln) if ($ln =~ m/\r$/); 

    # filter and write 
    } 
1

Это то, что решило мою проблему.^M - возврат каретки, и его можно легко избежать в сценарии Perl.

while(<INPUTFILE>) 
{ 
    chomp; 
    chop($_) if ($_ =~ m/\r$/); 
} 
+0

Удаляет ли это^M из файла CSV? Изменение входного файла? Создает ли какой-нибудь выходной файл, который их не будет иметь? –

0

Маленький сценарий, который у меня есть для этого. Модификация его помогла отфильтровать некоторые другие непечатаемые символы в кросс-платформенных устаревших файлах.

#!/usr/bin/perl 
# run this as 
# convert_dos2unix.pl <input_file> output_file 
undef $/; 
$_ = <>; 
s/\r//ge; 
print; 
Смежные вопросы