2013-08-30 6 views
0

Ceci est un format fixe et c'est ce que vous voyez lorsque je ouvre dans le bloc-notes ou ultraedit. Ceci est juste quelques exemples de données, mais mon fichier texte a environ 200 000 lignes et plusieurs répertoires comme vous le voyez dans l'exemple. Donc, fondamentalement, j'essaie d'ajouter le chemin que vous voyez où il est dit "Directory of V: ​​\ word" et ajouter "V: \ word" à la fin de la ligne et de le copier jusqu'à ce qu'il voit le nouveau "Directory of V: \ word \ excels "et ajoute" V: \ word \ excels "après le fait et ainsi de suite et ainsi de suite. Seriez-vous capable de m'aider et de jeter un os à un chien? Merci et très apprécié!Perl Programme pour lire un fichier texte, Rechercher du texte dans le fichier et copier le texte dans un nouveau fichier

Directory of V:\word 
04/30/2007 11:49 AM  938,458 BUILTIN\Admin  Filename.pdf 
04/06/2012 01:13 PM   3,801 AMERICAS\DoeJ  Filename3.pdf 
01/11/2007 12:05 PM   26,624 BUILTIN\Admin  Filename2.doc 
08/01/2007 11:57 AM   18,432 BUILTIN\Admin  Filename5.xls 
Directory of V:\word\excels 
03/03/2010 10:42 AM   35,840 AMERICAS\DavisF  Billing3-3.xls 
02/24/2010 10:31 AM   34,380 AMERICAS\StewartF Allie2-24.xls 

C'est ce que je suis en train d'accomplir

Directory of V:\word 
04/30/2007 11:49 AM  938,458 BUILTIN\Admin  Filename.pdf  V:\word 
04/06/2012 01:13 PM   3,801 AMERICAS\DoeJ  Filename3.pdf V:\word 
01/11/2007 12:05 PM   26,624 BUILTIN\Admin  Filename2.doc V:\word 
08/01/2007 11:57 AM   18,432 BUILTIN\Admin  Filename5.xls V:\word 
Directory of V:\word\excels 
03/03/2010 10:42 AM   35,840 AMERICAS\DavisF  Billing3-3.xls V:\word\excels 
02/24/2010 10:31 AM   34,380 AMERICAS\StewartF Allie.xls  V:\word\excels 



C'est ce que j'ai en perl: Je suis toujours coincé, mais je pense que je fais un peu le progrès.

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

    open (MYFILE, 'List.txt'); 
    my $str = " Directory of V:\word"; 
    while (<MYFILE>) 
    { 
     chomp; 
     ($Date, $Time, $Size, $User, $Filename) = split("\t"); 
     print $Date, $Time, $Size, $User, $Filename, substr $str,14; 

     print "$_\n"; 
    } 
    close (MYFILE); 
+1

Qu'avez-vous jusqu'à présent? – iCanHasFay

+1

'perldoc perlintro' – toolic

+0

@toolic - Quel sujet suffirait le mieux pour mon problème sur perlintro? –

Répondre

0

Pourquoi ne pas se tromper?

awk '/ Directory of /{at=$3;print;next}{print $0""FS""at}' your_file 

Perl:

perl -lne 'if(/ Directory of (.*)/){$a=$1;print}else{$_.="\t".$a;print}' your_file 

si vous voulez faire un remplacement en ligne:

perl -i -lne 'if(/ Directory of (.*)/){$a=$1;print}else{$_.="\t".$a;print}' your_file 
0

Si vous voulez le faire en utilisant un script Perl (bonne occasion d'en apprendre davantage à ce sujet) :

Tout d'abord, afin d'écrire dans un nouveau fichier, vous devez ouvrir deux fichiers: FILE1 serait celui où vous avez le informations à lire, FILE2 celui où vous allez écrire. Ainsi, ouvrez le premier avec les options "reading" ('<') et le second avec les options "writing" ('>'). Plus d'informations. environ 'openfile' here.

Ensuite, lorsque vous utilisez « alors que » je vous recommande de prendre chaque phrase dans une variable ...

while ($line =<$file1>) 
{ ... 
    ... 
} 

... et en fonction (info. about 'if statement') le début de la phrase ('regular expressions') faire une action/impression ou autre.

Pour imprimer le répertoire à la fin de la phrase, conservez également les lignes contenant les informations d'annuaire ('if') dans une variable. Vous pouvez également éliminer la partie de la phrase qui ne vous intéresse pas en utilisant les 'expressions régulières' utiles (alias 'regex').

facile ... ;-)

0

court et simple:

perl -lpe'/ Directory of (.*)/?$a=$1:($_.="\t$a")' 
+0

Je ne comprends pas très bien votre réponse. –

+0

Désolé, il y avait un bug. Je l'ai réparé. Vous pouvez l'utiliser en plaçant le nom du fichier après cette commande ou en sortant la pipe d'une autre commande. –

1

@Pichi's one-liner fera ce que vous voulez si votre fichier est donné sur stdin ou passé comme argument. Comme il est un peu opaque, voici ce qu'il fait de manière explicite:

# What's this doing? perl -lpe'/ Directory of (.*)/?$a=$1:($_.="\t$a")' 

my $suffix;        # Pichi uses $a, a quietly special var I usually avoid 

while (defined(my $line = <ARGV>)) {  # Magic ARGV filehandle - stdin or arguments 
    chomp($line);       # Remove newline (-l switch) 

    if ($line =~/Directory of (.*)/) { # This is the ?: clause 
    $suffix = $1; 
    } else { 
    $line .= "\t$suffix"; 
    } 

    print "$line\n";      # Print (-p) with newline (-l, again) 
} 

Perl pratique de one-liners font en fait un peu plus que cela (par exemple, $/ et $\ sont explicitement définis, et le print est vérifié par erreur), mais c'est essentiellement l'approche.

Questions connexes