2009-03-16 17 views
32

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?

+0

Verwenden 'binmode (STDIN ": crlf")' oder 'PerlIO =: Unix: crlf' (siehe [http://stackoverflow.com/a/21320709/424632]). – musiphil

Antwort

14

Sie fanden heraus, dass Sie als auch o dies tun:

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

Das hat perfekt für mich funktioniert! – onaclov2000

+1

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

44

^M ist Wagenrücklauf. Sie können dies tun:

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

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$//; 
} 
+0

würde das nicht auch die Zeilenumbrüche entfernen? –

+0

Ich schätze, das hängt von deinem Ziel ab. Ich habe bearbeitet, um beide Strategien zu zeigen. – spoulson

23

Or ein 1-Liner:

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

Es ist so einfach, sich daran als Perl Pie zu erinnern. – dreamlax

+0

@dreamlax: haha ​​perl pie! – Frank

+0

Auf Windows-Passing * .txt mit diesem Befehl funktioniert nicht. Es gibt Folgendes: Kann nicht geöffnet werden * .txt: Ungültiges Argument. Jemand? – mgouin

-1

Im vi Treffer :.

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

Control-VControl-M sind offensichtlich diese Schlüssel. Schreib es nicht aus.

+1

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. –

7

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 
2

Dieser Liner ersetzt die alle^M Zeichen:

dos2unix <file-name> 

Sie können dies nennen von innen Perl oder direkt auf Ihrer Unix-Eingabeaufforderung.

6

Ich bevorzuge eine allgemeinere Lösung, die mit DOS oder Unix-Eingabe funktioniert. Angenommen, die Eingabe stammt von STDIN:

1

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$/); 
} 
+0

Entfernt das^M aus einer CSV-Datei? Ändern der Eingabedatei? Erstellt es eine Ausgabedatei, die sie nicht haben wird? –

0

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;