I have a script that is appending new fields to an existing CSV, however ^M
characters are appearing at the end of the old lines so the new fields end up on a new row instead of the same one. How do I remove ^M
characters from a CSV file using Perl?
You found out you can also do this:
$line=~ tr/\015//d;
\r
- anyone looking at that (or yourself in a year's time) would be glad of a comment stating what it does –
Noli ^M is carriage return. You can do this:
$str =~ s/\r//g
Or a 1-liner:
perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt
You found out you can also do this:
$line=~ tr/\015//d;
\r
- anyone looking at that (or yourself in a year's time) would be glad of a comment stating what it does –
Noli Slightly unrelated, but to remove ^M from the command line using Perl, do this:
perl -p -i -e "s/\r\n/\n/g" file.name
I prefer a more general solution that will work with either DOS or Unix input. Assuming the input is from STDIN:
while (defined(my $ln = <>))
{
chomp($ln);
chop($ln) if ($ln =~ m/\r$/);
# filter and write
}
This one liner replaces all the ^M characters:
dos2unix <file-name>
You can call this from inside Perl or directly on your Unix prompt.
To convert DOS style to UNIX style line endings:
for ($line in <FILEHANDLE>) {
$line =~ s/\r\n$/\n/;
}
Or, to remove UNIX and/or DOS style line endings:
for ($line in <FILEHANDLE>) {
$line =~ s/\r?\n$//;
}
This is what solved my problem. ^M is a carriage return, and it can be easily avoided in a Perl script.
while(<INPUTFILE>)
{
chomp;
chop($_) if ($_ =~ m/\r$/);
}
Little script I have for that. A modification of it helped to filter out some other non-printable characters in cross-platform legacy files.
#!/usr/bin/perl
# run this as
# convert_dos2unix.pl < input_file > output_file
undef $/;
$_ = <>;
s/\r//ge;
print;
perl command to convert dos line ending to unix line ending with backup of the original file:
perl -pi.bak -e 's/\r\n/\n/g' filename
This command generates filename with unix line ending and leaves the original file as filename.bak.
In vi hit :
.
Then s/Control-VControl-M//g
.
Control-V
Control-M
are obviously those keys. Don't spell it out.
© 2022 - 2024 — McMap. All rights reserved.
binmode(STDIN, ":crlf")
orPERLIO=:unix:crlf
(see [https://mcmap.net/q/409039/-properly-detect-line-endings-of-a-file-in-perl]). – Noblenobleman