2009-03-16 12 views
32

Ho uno script che aggiunge nuovi campi a un file CSV esistente, tuttavia i caratteri ^M vengono visualizzati alla fine delle vecchie righe in modo che i nuovi campi finiscano in una nuova riga anziché nella stessa. Come rimuovere i caratteri ^M da un file CSV utilizzando Perl?In Perl, come rimuovere^M da un file?

+0

Usa 'binmode (STDIN, ": crlf")' o 'PERLIO =: unix: crlf' (vedi [http://stackoverflow.com/a/21320709/424632]). – musiphil

risposta

14

Hai scoperto che puoi o fare questo:

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

Questo ha funzionato perfettamente per me! – onaclov2000

+1

non è leggibile come '\ r' - chiunque lo guardi (o te stesso tra un anno) sarebbe contento di un commento affermando che cosa fa – plusplus

44

^M è il ritorno a capo. Si può fare questo:

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

Per convertire in stile DOS a Unix fine riga stile:

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

Oppure, per rimuovere UNIX e/o DOS fine riga stile:

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

non rimuoverebbe anche le newline? –

+0

Suppongo che dipenda dal tuo obiettivo. Ho modificato per mostrare entrambe le strategie. – spoulson

23

Or 1-liner:

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

È così facile da ricordare questo come Perl Pie. – dreamlax

+0

@dreamlax: haha ​​perl pie! – Frank

+0

In Windows che passa * .txt con questo comando non funziona. Dà: Impossibile aprire * .txt: argomento non valido. Chiunque? – mgouin

-1

In vi hit :.

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

Control-VControl-M sono ovviamente quelle chiavi. Non spiegarlo

+1

È una cattiva idea includere caratteri non stampabili come il ritorno a capo del codice sorgente nel codice sorgente come questo.Molto meglio usare la \ r escape che è (a) facile da vedere e (b) non andrà persa se la sorgente viene riformattata. –

7

Un po 'estranei, ma per rimuovere^M dalla riga di comando utilizzando Perl, fare questo:

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

Questo uno di linea sostituisce tutte le^caratteri M:

dos2unix <file-name> 

è possibile chiamare questo dall'interno di Perl o direttamente dal tuo prompt Unix.

6

Preferisco una soluzione più generale che funzioni con input DOS o Unix. Supponendo che l'ingresso è da STDIN:

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

    # filter and write 
    } 
1

Questo è ciò che ha risolto il mio problema.^M è un ritorno a capo e può essere facilmente evitato in uno script Perl.

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

Rimuove^M da un file CSV? Cambiando il file di input? Crea qualche file di output che non li avrà? –

0

Piccola sceneggiatura che ho per quello. Una modifica ha contribuito a filtrare alcuni altri caratteri non stampabili nei file legacy multipiattaforma.

#!/usr/bin/perl 
# run this as 
# convert_dos2unix.pl <input_file> output_file 
undef $/; 
$_ = <>; 
s/\r//ge; 
print; 
Problemi correlati