Ich habe ein Skript, das neue Felder an eine vorhandene CSV anfügt, jedoch ^M
Zeichen erscheinen am Ende der alten Zeilen, so dass die neuen Felder in einer neuen Zeile statt der gleichen enden. Wie entferne ich ^M
Zeichen aus einer CSV-Datei mit Perl?In Perl, wie man^M aus einer Datei entfernt?
Antwort
Sie fanden heraus, dass Sie als auch o dies tun:
$line=~ tr/\015//d;
Das hat perfekt für mich funktioniert! – onaclov2000
nicht so leserlich wie '\ r' - jemand, der sich das (oder sich selbst in einem Jahr) ansieht, würde sich über einen Kommentar freuen, der angibt, was es macht – plusplus
^M ist Wagenrücklauf. Sie können dies tun:
$str =~ s/\r//g
Um DOS-Stil zu UNIX-Stil Zeilenumbrüche zu konvertieren:
for ($line in <FILEHANDLE>) {
$line =~ s/\r\n$/\n/;
}
Oder zu entfernen UNIX und/oder DOS-Stil Zeilenende:
for ($line in <FILEHANDLE>) {
$line =~ s/\r?\n$//;
}
würde das nicht auch die Zeilenumbrüche entfernen? –
Ich schätze, das hängt von deinem Ziel ab. Ich habe bearbeitet, um beide Strategien zu zeigen. – spoulson
Or ein 1-Liner:
perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt
Im vi Treffer :
.
Dann s/Control-VControl-M//g
.
Control-V
Control-M
sind offensichtlich diese Schlüssel. Schreib es nicht aus.
Es ist eine schlechte Idee, nicht druckbare Zeichen wie Wagenrücklauf im Quellcode wortwörtlich einzufügen so was.Es ist viel besser, das \ r-Escape zu verwenden, das (a) leicht zu sehen ist und (b) nicht verloren geht, wenn die Quelle neu formatiert wird. –
Etwas nicht verwandten, aber zu entfernen^M von der Kommandozeile Perl verwenden, dies zu tun:
perl -p -i -e "s/\r\n/\n/g" file.name
Dieser Liner ersetzt die alle^M Zeichen:
dos2unix <file-name>
Sie können dies nennen von innen Perl oder direkt auf Ihrer Unix-Eingabeaufforderung.
Ich bevorzuge eine allgemeinere Lösung, die mit DOS oder Unix-Eingabe funktioniert. Angenommen, die Eingabe stammt von STDIN:
Das ist, was mein Problem gelöst hat.^M ist ein Wagenrücklauf, und es kann leicht in einem Perl-Skript vermieden werden.
while(<INPUTFILE>)
{
chomp;
chop($_) if ($_ =~ m/\r$/);
}
Entfernt das^M aus einer CSV-Datei? Ändern der Eingabedatei? Erstellt es eine Ausgabedatei, die sie nicht haben wird? –
Kleines Skript, das ich dafür habe. Eine Änderung daran half, einige andere nicht druckbare Zeichen in plattformübergreifenden Legacy-Dateien herauszufiltern.
#!/usr/bin/perl
# run this as
# convert_dos2unix.pl <input_file> output_file
undef $/;
$_ = <>;
s/\r//ge;
print;
Verwenden 'binmode (STDIN ": crlf")' oder 'PerlIO =: Unix: crlf' (siehe [http://stackoverflow.com/a/21320709/424632]). – musiphil