2011-08-24 5 views
4

Mon fichier de test a "n" nombre de lignes et entre chaque ligne il y a un^M, qui à son tour en fait une grande chaîne. Le code que je suis en train d'utiliser ouvre ce fichier et doit analyser un en-tête, puis les lignes suivantes, puis rechercher le chemin du répertoire et le nom du fichier. Mais parce que le fichier se termine juste comme une grande chaîne ne fonctionne pas correctementComment remplacer^M par une nouvelle ligne en perl

#!/usr/bin/perl 
#use strict; 
#use warnings; 

open (DATA, "<file.txt") or die ("Unable to open file"); 

my $search_string = "Directory Path"; 
my $column_search = "Filename"; 
my $header = <DATA>; 
my @header_titles = split /\t/, $header; 
my $extract_col = 0; 
my $col_search = 0; 

for my $header_line (@header_titles) { 
    last if $header_line =~ m/$search_string/; 
    $extract_col++; 
} 
for my $header_line (@header_titles) { 
    last if $header_line =~m/$column_search/; 
    $col_search++; 
} 

print "Extracting column $extract_col $search_string\n"; 

while (my $row = <DATA>) { 
    last unless $row =~ /\S/; 
    chomp $row; 
    my @cells = split /\t/, $row; 
$cells[74]=~s/:/\//g; 
$cells[$extract_col]= $cells[74] . $cells[$col_search]; 
print "$cells[$extract_col] \n"; 

} 

Quand j'ouvre le fichier de test en VI j'ai utilisé

:%s/^M/\r/g 

et qui enlève le M de^mais comment Est-ce que je le fais dans ce programme Perl? Quand j'ai essayé un programme de test et que j'ai inséré le s\^M/\r/g et l'ai fait écrire dans un fichier différent, il est apparu comme beaucoup de caractères chinois.

+1

préfèrent 'ouvrir mon $ DATA , "<", $ filename' pour "ouvrir DATA", <$ filename "'. – flies

Répondre

4

Avant de commencer la lecture du fichier, définissez $/-"\r". Ceci est défini par défaut sur le caractère saut de ligne, ce qui est parfait pour les fins de ligne de type UNIX, et presque OK pour les fins de ligne de style DOS, mais inutile pour les anciennes fins de ligne de type Mac que vous voyez. Vous pouvez également essayer mac2unix sur votre fichier d'entrée si vous l'avez installé.

Pour plus d'informations, recherchez "INPUT_RECORD_SEPARATOR" dans the perlvar manpage.

+0

Cela n'a pas fonctionné non plus. –

+0

en cours d'exécution dos2unix mac2unix Je reçois toujours le message "Ignorer le fichier binaire" –

+0

Avez-vous essayé de modifier le séparateur d'enregistrement d'entrée également? – mkb

0

Ce fichier provient-il d'un système Windows? Si c'est le cas, essayez d'exécuter la commande dos2unix sur le fichier avant de le lire. Vous pouvez le faire avant d'appeler le script perl ou dans le script avant de le lire.

+0

Il s'agit en fait de la fin de la ligne Mac antérieure à Mac OS X. (Maintenant, ils utilisent juste des sauts de ligne) Pour une raison quelconque, Excel exporte toujours des CSV avec '\ r' au lieu de' \ n' à la fin des lignes. Les fichiers DOS ont les deux. – mkb

+0

Quand je cours la commande j'ai reçu "sautant le dossier binaire" .. Je crois l'autorisation de dossier au 644 –

0

Vous pouvez définir \ $ (séparateur d'enregistrement d'entrée) à^M au début de votre script, comme:

$\ = "^M"; 
+0

qui n'a pas fonctionné .. quand je l'ai entré j'ai essayé juste copier coller et faire '$ \ =" (ctrl V + ctrl M) "' –

+0

Votre barre oblique pointe dans le mauvais sens, et "^ M" n'est pas la façon dont vous exprimez un retour chariot en perl. C'est '" \ r "' – mkb

+0

celui-ci a fonctionné aussi bien si vous avez '$/au lieu de' $ \ 'Merci –

4

Si mac2unix ne fonctionne pas pour vous, vous pouvez écrire votre propre mac2unix comme Perl one-liner:

perl -pi -e 'tr/\r/\n/' file.txt 

Cela va probablement échouer si la taille du fichier est plus grand que la mémoire virtuelle si, comme il lit tout le fichier en mémoire.

Pour être complet, nous allons avoir aussi un dos2unix:

perl -pi -e 'tr/\r//d' file.txt 

et un unix2dos:

perl -pi -e 's/\n/\r\n/g' file.txt 
0

perl -MExtUtils :: Commande -e fichier dos2unix

Questions connexes