У меня есть скрипт, который добавляет новые поля к существующему CSV, однако ^M символы появляются в конце старых строк, поэтому новые поля оказываются в новой строке вместо той же самой. Как удалить ^M символов из файла CSV с помощью Perl?
^M
^ M - возврат каретки. Вы можете сделать это:
$str =~ s/\r//g
или 1 вкладыш:
perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt
Вы узнали, что вы также можете сделать это:
$line=~ tr/\015//d;
Немного не связано, но чтобы удалить ^ M из командной строки, используя Perl, сделайте это:
perl -p -i -e "s/\r\n/\n/g" file.name
Я предпочитаю более общее решение, которое будет работать с вводом DOS или Unix. Предполагая, что ввод от STDIN:
while (defined(my $ln = <>)) { chomp($ln); chop($ln) if ($ln =~ m/\r$/); # filter and write }
Этот вкладыш заменяет все символы ^ M:
dos2unix <file-name>
Вы можете вызвать это изнутри Perl или непосредственно в приглашении Unix.
Это то, что решило мою проблему. ^ M - это возврат каретки, и его легко избежать в скрипте Perl.
while(<INPUTFILE>) { chomp; chop($_) if ($_ =~ m/\r$/); }
Чтобы преобразовать стиль DOS в окончания строк в стиле UNIX:
for ($line in <FILEHANDLE>) { $line =~ s/\r\n$/\n/; }
Или, чтобы удалить окончания строк в стиле UNIX и / или DOS:
for ($line in <FILEHANDLE>) { $line =~ s/\r?\n$//; }
Небольшой сценарий, который у меня есть для этого. Его модификация помогла отфильтровать некоторые другие непечатаемые символы в кроссплатформенных устаревших файлах.
#!/usr/bin/perl # run this as # convert_dos2unix.pl < input_file > output_file undef $/; $_ = <>; s/\r//ge; print;
В ви хит :.
:
Тогда s/Control-VControl-M//g.
s/Control-VControl-M//g
Control-V Control-M, очевидно, эти ключи. Не разъясняй это.
Control-V
Control-M