j'aimerais pouvoir comparer 2 fichiers en perl
et comparer leur nombre de lignes
merci
j'aimerais pouvoir comparer 2 fichiers en perl
et comparer leur nombre de lignes
merci
Je la fais courte. 8)
je n'ai pas testé, mais l'idée y est ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 open (FIC1 , "fic1.txt") || die "Probleme d'ouverture: $!"; open (FIC2 , "fic2.txt") || die "Probleme d'ouverture: $!"; my @lignes1=<FIC1>; my @lignes2=<FIC2>; close FIC1; close FIC2; die "Nombre de lignes différent" if (@lignes1 != @lignes2); chomp (@lignes1); chomp (@lignes2); for (my $i = 0 ; $i < @lignes1 ; $i++) { if ($lignes1[i] ne $lignes2[i]) { print "Ligne $i < $lignes1[i]\n"; print "Ligne $i > $lignes2[i]\n"; } }
La FAQ Perl est par ici
: La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !
tu ouvres les 2 fichiers
tu met dans un tableau chaque ligne des 2 fichiers
tu compares ces 2 tableaux
si identique alors pas de modif sinon modif
mais il me faudrait le nbr de ligne de chacun des fichiers pour compatrer si nouvelle ligne
pourquoi chomp
et que veut dire ne dans if $ligne ne $ligne2
est ce que le script suivant est correct
open(fic,'Diff fichie_old fichie_new');
my @line_diff=<fic>
foreach(@line_diff)
{
@champ=split(/;/,$_);
et la j'ai tous les champs de ma ligne dans un tableaux
je compare dans ma table si nouvel ligne ou si la cle primaire existe deja et en fonction insert ou update
Jusque la, oui ...Envoyé par pascal.cargouet
Non, je compare leur nombre de lignes ...Envoyé par pascal.cargouet
le nombre d'élément d'un tableau, c'est @nom_tableau (évalué en contexte numérique, c'est à dire quand l'interpreteur Perl s'attend à rencontrer un nombre, en gros).Envoyé par pascal.cargouet
Pourquoi pasEnvoyé par pascal.cargouet
Pour rallonger la réponse que je trouvais trop courte
Pour virer les retours à la ligne récupérés dans le tableau ... C'est un habitude que j'ai quand je récupère des lignes de fichier.
ne = not equalEnvoyé par pascal.cargouet
Comparaison "lexicographique" (eq, ne, lt, gt, le, ge, cmp) par opposition à la comparaison numérique (==, !=, <, >, <=, >=, <=>). Il faut y faire attention, quand on compare des chaines. C'est une cause fréquente de comportement indéfini ...
diff, avec un d minuscule ...Envoyé par pascal.cargouet
La commande lancée par open doit se terminer par un pipe ("|" = barre verticale) si tu veux récupérer sa sortie.
Le lancement de commande par un script rend souvent celui-ci dépendant de l'OS ...
Ensuite, à toi de voir le traitement, en fonction des résultats de diff, qu'il faut analyser finement (présence d'un > ou d'un < pour savoir quel fichier est impacté, nombre de lignes de différences, plages de suppressions de lignes, etc.)
La commande diff est très riche, tu verras
La FAQ Perl est par ici
: La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !
en fait voila l'algo que je veux traduire en perl
j'ai 2fichier csv correspondant a des donnes dans des tables un fichier_old et un fichier_new sachant que les lignes ne sont pas forcement remonter dans le meme ordre
c'est a dire que je peux avoir
tot;tata
azert;trez
et dans fichier new
tot;tata
tertt;nefxdfdf >>> ici nouvelle ligne
azert;trez
la il y a une nouvelle ligne
voila l'algo
si fichier new different fichier old et nbr de ligne different
alors nouvelle element (nouvelle ligne) + eventuel modif dans ligne
donc on lit toutes les lignes
on recuopere la cle primaire
si la cle primaire existe dans ma table alors pas de nouvel element donc modification donc on update la table
si la cle n'existe pas alors nouvel element donc insert dans la table et on historise
si fichier new different de fichier old et nbr ligne identique
alors juste modification
on update
Bonjour,
Tu parles de base de données : si j'étais toi je chargerais tous dans des tables temporaires sur lesquelles je travaillerais avec les requêtes SQL ad hoc pour voir s'il s'agit de nouvel enregistrement, d'enregistrements modifés...
Laly.
In the heart of the truly greats, perfection is never achieved but endlessly pursued.
Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)
la problematique est que je recoit un fichier new donc pour savoir si une nouvelle donne a ete rentre ou s'il y a eu des modif le + simple comme j'ai ce fichier est de le comparer a l'ancien fichier_old
est ce que le script suivant est correct
open(fic,'| diff fichie_old fichie_new');
my @line_diff=<fic>
comment ne prendre que les ligne de fichie_new?
comment distingue les lignes modifie des lignes nouvelles
foreach(@line_diff)
{
@champ=split(/;/,$_);
}
Slt tlm !
Heuuu... pour se contenter de comparer le nb de lignes de 2 fichiers, il peut être intéressant d'utiliser la commande suivante :
my $res1 = `cat fichier1 | wc`;
my $res2 = `cat fichier2 | wc`;
Un petit coup de split pour séparer le contenu des $res et le tour est joué.
@+
Mr6
oui mais comment faire pour comparer 2 fichiers dire s'ils sont identiques ou pas?
open(fic_compare,"| diff $fichier_new $fichier_old");
my @line_fic_compare=<fic_compare>;
print "\n\n compare= $line_fic_compare[0]";
mes fichier sont differents mais $line_fic_compare[0] est vide alors que ma comande diff m'affiche des lignes
?????
merci
Tu n'es pas facile à suivre, quand tu cross-postes ...
J'ai répondu sur ton autre fil ...
La FAQ Perl est par ici
: La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager