rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

[perl] copier coller lignes de texte

Posté par fanchec, le mardi 23 janvier 2007 à 14:50:55
Bonjour,
je travaille sur un fichier au format texte (.txt) qui contient des data organisées en lignes et colonnes avec comme séparateur de champ le point-virgule ;
mais tous les champs utiles pour définir une fiche unique (au sens BDD) sont répartis en 3 lignes successives;
il me faut donc créer un nouveau fichier, dont la première ligne cumule les lignes 1, 2 et 3 du fichier data
et recommencer la procédure avec les lignes 4,5 et 6 et etc;
j'ai un fichier initial de plus de 64 000 lignes;
je cherche depuis un moment un script en Perl (il paraît que c'est le language le plus approprié pour manipuler des chaines de caractères) qui s'approcherait de ma problématique;
inutile de préciser que je suis totalement béotien en programmation (avec moins de 64 000 caractères je peux me débrouiller avec Excell et ses macros... mais au delà bonjour les dégats);
merci d'avance pour toute aide future
Configuration: Windows XP
Internet Explorer 7.0
Répondre à fanchec  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
blux, le mardi 23 janvier 2007 à 16:01:48
Salut,

jette un oeil sur la page suivante :

perlfich?imprim=1

Ensuite, il te suffit de gérer un compteur qui va jusqu'à 3 et qui concatène les lignes avant de les recopier...
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le mardi 23 janvier 2007 à 16:25:42
Salut,

perl -pi.orig -e 's/\n// unless $.%3 == 0' fichier
à savoir que s/\n// fonctionne sur les fichiers type Unix (\n pour la fin de ligne)
si la fin de ligne est de type MAC ou WIN il faut changer en fonction de la structure de fichier. lami20j
Répondre à lami20j

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
nath, le mardi 23 janvier 2007 à 17:06:57
Bon alors si j'ai bien compris tu cherche à concatener toutes les 3 lignes en une seul???
voila ce que je te propose :
1) d'abord installe active perl (c'est un interpreteur de perl sous windows)
2) ouvre un document text avec notpad et tape le code suivant

open (FICIN,$ARGV[0]);  #ouvre le premier fichier en paramettre
open (FICOUT,">$ARGV[2]"); #ouvre le second fichier 
my $c = 0;
while ($ligne = <FICIN>){
     chomp $ligne;
     print FICOUT $ligne;
     print FICOUT ";" # <--------- a enlever si tu ne veux pas de point virgule entre 2 lignes nouvelement assemblée (ex ligne1;ligne2;ligne3;)
     if ($c%3==2){
          print FICOUT "\n";
     }
}
close FICIN;
close FICOUT;


        

3) tu sauve ce script avec un nom finissant par .pl
4) tu ouvre un invte de commande tu change de répertoire jusque là où tu a sauver ton script.
5) tu tape "perl script.pl [lefichierd'entree] [le fichier de sortie]
et voilou
:D
Répondre à nath

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
nath, le mardi 23 janvier 2007 à 17:19:56
oups j'ai oublier de rajouter $c++ dans la boucle while :)
Répondre à nath

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
fanchec, le mardi 30 janvier 2007 à 09:50:21
Merci Nath et merci à tous;
d'abord toutes mes excuses pour ma réponse tardive mais une marée noire non prévue m'a rattrapé (cf. les news);
et oui, en plus de m'essayer à la programmation, je déprogramme les effets dévastateurs du transport maritime...

revenons à mes moutons;

1) où je place le $c++ dans le code ?
2) ne faut-il pas des parenthèses pour close : close(FICIN) par exemple ?

cordialement
Répondre à fanchec

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le mardi 23 janvier 2007 à 20:21:08
Re,

pour windows voilà (je suis un paresseux môa :-))
open F_ECRIRE,">res.dat"
    or die "E/S: $!\n";

while(<>){
  s/\r?\n/;/ unless $.%3 == 0;
  print F_ECRIRE;
}
je n'utilise pas un compteur, en revanche j'utilise la variable $. ($NR ou $INPUT_LINE_NUMBER - le numéro d'enregistrement courant - dans notre cas le numéro de ligne)

Pour l'exécuter

perl script.pl ficher_en_entrée

le résultat sera écrit dans le fichier res.dat, à toi de modifier le nom du fichier en sortie lami20j
Répondre à lami20j

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 fanchec, le mardi 30 janvier 2007 à 15:15:57
Résolution du problème,
grace à Nath :

Pb :
comment passer d'un fichier txt de la forme

aaa
bbb
ccc
ddd
eee
fff
...

en fichier

aaabbbccc
dddeeefff
...

????

code utilisé pour la solution :

#!/usr/bin/perl -w
open (FICIN,$ARGV[0]);
open (FICOUT,">$ARGV[1]");
my $c=0;
while ($ligne=<FICIN>)
{
chomp $ligne;
print FICOUT $ligne;
print FICOUT ";";
if ($c==2)
{
print FICOUT "\n";
$c=0;
}
else
{
$c++;
}
}
close (FICIN);
close (FICOUT);

encore merci à tous (et mention spéciale pour Nath)
Répondre à fanchec
Logiciels pertinents trouvés dans les téléchargements
Télécharger SuperCopier 2 beta 1.9SuperCopier 2 - SuperCopier est un gestionnaire de copie de fichiers libre pour Windows, proposant des fonctionnalités non couvertes par le...Catégorie: Gestion de fichiers
Licence: Freeware/gratuit
Télécharger Amaya 9.54Amaya - Amaya est un éditeur Web, développé conjointement par l'INRIA et le W3C, pour éditer et publier très simplement des pages...Catégorie: Editeurs HTML
Licence: Open Source
Télécharger Hex Workshop 5.0.2.2769Hex Workshop - Hex Workshop est un ensemble d'outils de développement hexadécimaux pour Microsoft Windows. Il combine à la fois...Catégorie: Organisation
Licence: Shareware
Télécharger Audacity 1.2.6Audacity - Audacity® est un logiciel libre et open-source destiné à l'édition et à l'enregistrement sonore. Il est disponible pour Mac...Catégorie: Création musicale
Licence: Open Source
Plus de logiciels gratuits sur « [perl] copier coller lignes de texte »