Ldif vers Csv

Le
Georges Kosto
Bonsoir,
Je voudrais comprendre le comportement d'un script qui permet d'extraire
les entrées d'un fichier ldif (filtré) pour les formater en csv.

Donc, j'ai un fichier en entrée contenant ce type de données :
--

cn: toto
sn: toto
mail: toto1
mail: toto2

cn: titi
sn: titi
mail: titi1
mail: titi2

cn: tata
sn: tata
mail: tata1


--

Et je souhaite obtenir :

cn;sn;mail
toto;toto;toto1;toto2
titi;titi;titi1;titi2
tata;tata;tata1

Avec ceci ( sans trop de contrôle !!! ):

#!/usr/bin/perl -w

my $ldif_file = "$ARGV[0]";

open(LDAP, "<$ldif_file");

while (<LDAP>) {
# On initialise le séparateur d'enregistrement
local $/ = "";
$bloc = <LDAP>;
# On supp les sauts de ligne pour être en mesure de lire ligne à #
ligne et on stock le résultat dans un tableau
@res = split (//, $bloc);
foreach $i (@res) {
if ($i =~ /^cn: (.*)$/i) { $cn=$1; }
if ($i =~ /^sn: (.*)$/i) { $sn=$1; }
if ($i =~ /^mail: (.*)$/i) { push(@mail,$1); }
}
print "$cn;$sn;;@mail";
undef ($cn);
undef ($sn);
undef (@mail);
}
close(LDAP);

Alors le comportement est simple, la première entrée est bien formatée
mais ensuite, la ligne cn est supprimée !!!

Je voudrais simplement savoir pourquoi et éventuellement adapter mon parser.

Merci,
Georges.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Stéphane Müller
Le #145177
Je n'ai pas débuggé votre programme, mais qq chose comme cela
(sans trop de contôles également ;-) ) me semble plus simple:

use strict;
use English;

($RS,$OFS,$ORS) = ("",';',"n");

print 'cn;sn;mail';
open LDAP,'<',$ARGV[0];
while ( <LDAP> ) {
my ($cn,$sn) = $_ =~ /cn: (.+)nsn: (.+)n/;
my @mail = $_ =~ /mail: (.+)n/g;
print $cn,$sn,@mail;
}
close LDAP;

Cordialement
Stéphane


"Georges Kosto" message de news:
4651e9c4$0$3878$
Bonsoir,
Je voudrais comprendre le comportement d'un script qui permet
d'extraire les entrées d'un fichier ldif (filtré) pour les
formater en csv.

Donc, j'ai un fichier en entrée contenant ce type de données :
--------------------------------------------------------------

cn: toto
sn: toto
mail: toto1
mail: toto2

cn: titi
sn: titi
mail: titi1
mail: titi2

cn: tata
sn: tata
mail: tata1


--------------------------------------------------------------

Et je souhaite obtenir :

cn;sn;mail
toto;toto;toto1;toto2
titi;titi;titi1;titi2
tata;tata;tata1

Avec ceci ( sans trop de contrôle !!! ):

#!/usr/bin/perl -w

my $ldif_file = "$ARGV[0]";

open(LDAP, "<$ldif_file");

while (<LDAP>) {
# On initialise le séparateur d'enregistrement
local $/ = "";
$bloc = <LDAP>;
# On supp les sauts de ligne pour être en mesure de lire ligne
à # ligne et on stock le résultat dans un tableau
@res = split (/n/, $bloc);
foreach $i (@res) {
if ($i =~ /^cn: (.*)$/i) { $cn=$1; }
if ($i =~ /^sn: (.*)$/i) { $sn=$1; }
if ($i =~ /^mail: (.*)$/i) { push(@mail,$1); }
}
print "$cn;$sn;;@mailn";
undef ($cn);
undef ($sn);
undef (@mail);
}
close(LDAP);

Alors le comportement est simple, la première entrée est bien
formatée mais ensuite, la ligne cn est supprimée !!!

Je voudrais simplement savoir pourquoi et éventuellement
adapter mon parser.

Merci,
Georges.


kurtz le pirate
Le #145173
In article Georges Kosto
Bonsoir,
Je voudrais comprendre le comportement d'un script qui permet d'extraire
les entrées d'un fichier ldif (filtré) pour les formater en csv.

Donc, j'ai un fichier en entrée contenant ce type de données :
--------------------------------------------------------------

cn: toto
sn: toto
mail: toto1
mail: toto2

cn: titi
sn: titi
mail: titi1
mail: titi2

cn: tata
sn: tata
mail: tata1


--------------------------------------------------------------

Et je souhaite obtenir :

cn;sn;mail
toto;toto;toto1;toto2
titi;titi;titi1;titi2
tata;tata;tata1


un truc du genre :
- mettre les 'mail' dans un tableau @mails
- mettre le tableau dans un hash => $hash{cn}{sn}=[@mails]

...heu, c'est juste une idée :))

--
klp

Stéphane Müller
Le #145172
Je n'ai pas débuggé votre programme, mais qq chose comme cela
(sans trop de contôles également ;-) ) me semble plus simple:

use strict;
use English;

($RS,$OFS,$ORS) = ("",';',"n");

print 'cn;sn;mail';
open LDAP,'<',$ARGV[0];
while ( <LDAP> ) {
my ($cn,$sn) = $_ =~ /cn: (.+)nsn: (.+)n/;
my @mail = $_ =~ /mail: (.+)n/g;
print $cn,$sn,@mail;
}
close LDAP;

Cordialement
Stéphane


"Georges Kosto" message de news:
4651e9c4$0$3878$
Bonsoir,
Je voudrais comprendre le comportement d'un script qui permet
d'extraire les entrées d'un fichier ldif (filtré) pour les
formater en csv.

Donc, j'ai un fichier en entrée contenant ce type de données :
--------------------------------------------------------------

cn: toto
sn: toto
mail: toto1
mail: toto2

cn: titi
sn: titi
mail: titi1
mail: titi2

cn: tata
sn: tata
mail: tata1


--------------------------------------------------------------

Et je souhaite obtenir :

cn;sn;mail
toto;toto;toto1;toto2
titi;titi;titi1;titi2
tata;tata;tata1

Avec ceci ( sans trop de contrôle !!! ):

#!/usr/bin/perl -w

my $ldif_file = "$ARGV[0]";

open(LDAP, "<$ldif_file");

while (<LDAP>) {
# On initialise le séparateur d'enregistrement
local $/ = "";
$bloc = <LDAP>;
# On supp les sauts de ligne pour être en mesure de lire ligne
à # ligne et on stock le résultat dans un tableau
@res = split (/n/, $bloc);
foreach $i (@res) {
if ($i =~ /^cn: (.*)$/i) { $cn=$1; }
if ($i =~ /^sn: (.*)$/i) { $sn=$1; }
if ($i =~ /^mail: (.*)$/i) { push(@mail,$1); }
}
print "$cn;$sn;;@mailn";
undef ($cn);
undef ($sn);
undef (@mail);
}
close(LDAP);

Alors le comportement est simple, la première entrée est bien
formatée mais ensuite, la ligne cn est supprimée !!!

Je voudrais simplement savoir pourquoi et éventuellement
adapter mon parser.

Merci,
Georges.


giganet
Le #145064
Je n'ai pas débuggé votre programme, mais qq chose comme cela
(sans trop de contôles également ;-) ) me semble plus simple:

use strict;
use English;

($RS,$OFS,$ORS) = ("",';',"n");

print 'cn;sn;mail';
open LDAP,'<',$ARGV[0];
while ( <LDAP> ) {
my ($cn,$sn) = $_ =~ /cn: (.+)nsn: (.+)n/;
my @mail = $_ =~ /mail: (.+)n/g;
print $cn,$sn,@mail;
}
close LDAP;

Cordialement
Stéphane


"Georges Kosto" message de news:
4651e9c4$0$3878$
Bonsoir,
Je voudrais comprendre le comportement d'un script qui permet
d'extraire les entrées d'un fichier ldif (filtré) pour les
formater en csv.

Donc, j'ai un fichier en entrée contenant ce type de données :
--------------------------------------------------------------

cn: toto
sn: toto
mail: toto1
mail: toto2

cn: titi
sn: titi
mail: titi1
mail: titi2

cn: tata
sn: tata
mail: tata1


--------------------------------------------------------------

Et je souhaite obtenir :

cn;sn;mail
toto;toto;toto1;toto2
titi;titi;titi1;titi2
tata;tata;tata1

Avec ceci ( sans trop de contrôle !!! ):

#!/usr/bin/perl -w

my $ldif_file = "$ARGV[0]";

open(LDAP, "<$ldif_file");

while (<LDAP>) {
# On initialise le séparateur d'enregistrement
local $/ = "";
$bloc = <LDAP>;
# On supp les sauts de ligne pour être en mesure de lire ligne
à # ligne et on stock le résultat dans un tableau
@res = split (/n/, $bloc);
foreach $i (@res) {
if ($i =~ /^cn: (.*)$/i) { $cn=$1; }
if ($i =~ /^sn: (.*)$/i) { $sn=$1; }
if ($i =~ /^mail: (.*)$/i) { push(@mail,$1); }
}
print "$cn;$sn;;@mailn";
undef ($cn);
undef ($sn);
undef (@mail);
}
close(LDAP);

Alors le comportement est simple, la première entrée est bien
formatée mais ensuite, la ligne cn est supprimée !!!

Je voudrais simplement savoir pourquoi et éventuellement
adapter mon parser.

Merci,
Georges.






Moi je ne ferais pas ça car l'ordre d'apparition n'est pas sûr (cn et sn
par exemple).
Moi je ferais plutot :

use strict;
use English;

print 'cn;sn;mail';
open LDAP,'<',$ARGV[0];
my $cn,$sn;
my @mails = ();
while ( my $ligne = <LDAP> ) {
if ($ligne =~ /^ *$/) {
print $cn,$sn,@mail;
} else {
if ($ligne =~ /^(.+): (.*)$/) {
if ($1 eq "mail") {
push @mails, $2;
} elsif ($1 eq "cn") {
$cn = $2;
} elsif ($1 eq "sn") {
$sn = $2;
}
}
}
close LDAP;


Georges Kosto
Le #145063
Je n'ai pas débuggé votre programme, mais qq chose comme cela (sans
trop de contôles également ;-) ) me semble plus simple:

use strict;
use English;

($RS,$OFS,$ORS) = ("",';',"n");

print 'cn;sn;mail';
open LDAP,'<',$ARGV[0];
while ( <LDAP> ) {
my ($cn,$sn) = $_ =~ /cn: (.+)nsn: (.+)n/;
my @mail = $_ =~ /mail: (.+)n/g;
print $cn,$sn,@mail;
}
close LDAP;

Cordialement
Stéphane


"Georges Kosto" news: 4651e9c4$0$3878$
Bonsoir,
Je voudrais comprendre le comportement d'un script qui permet
d'extraire les entrées d'un fichier ldif (filtré) pour les formater
en csv.

Donc, j'ai un fichier en entrée contenant ce type de données :
--------------------------------------------------------------

cn: toto
sn: toto
mail: toto1
mail: toto2

cn: titi
sn: titi
mail: titi1
mail: titi2

cn: tata
sn: tata
mail: tata1


--------------------------------------------------------------

Et je souhaite obtenir :

cn;sn;mail
toto;toto;toto1;toto2
titi;titi;titi1;titi2
tata;tata;tata1

Avec ceci ( sans trop de contrôle !!! ):

#!/usr/bin/perl -w

my $ldif_file = "$ARGV[0]";

open(LDAP, "<$ldif_file");

while (<LDAP>) {
# On initialise le séparateur d'enregistrement
local $/ = "";
$bloc = <LDAP>;
# On supp les sauts de ligne pour être en mesure de lire ligne à #
ligne et on stock le résultat dans un tableau
@res = split (/n/, $bloc);
foreach $i (@res) {
if ($i =~ /^cn: (.*)$/i) { $cn=$1; }
if ($i =~ /^sn: (.*)$/i) { $sn=$1; }
if ($i =~ /^mail: (.*)$/i) { push(@mail,$1); }
}
print "$cn;$sn;;@mailn";
undef ($cn);
undef ($sn);
undef (@mail);
}
close(LDAP);

Alors le comportement est simple, la première entrée est bien
formatée mais ensuite, la ligne cn est supprimée !!!

Je voudrais simplement savoir pourquoi et éventuellement adapter mon
parser.

Merci,
Georges.






Moi je ne ferais pas ça car l'ordre d'apparition n'est pas sûr (cn et sn
par exemple).
Moi je ferais plutot :

use strict;
use English;

print 'cn;sn;mail';
open LDAP,'<',$ARGV[0];
my $cn,$sn;
my @mails = ();
while ( my $ligne = <LDAP> ) {
if ($ligne =~ /^ *$/) {
print $cn,$sn,@mail;
} else {
if ($ligne =~ /^(.+): (.*)$/) {
if ($1 eq "mail") {
push @mails, $2;
} elsif ($1 eq "cn") {
$cn = $2;
} elsif ($1 eq "sn") {
$sn = $2;
}
}
}
close LDAP;


Ok je suis super favorable à ta solution, car en effet les attributs
apparaissent dans un ordre différent d'une entrée à l'autre.
Cependant, dans le cas où l'on obtient la même séquence, la solution de
Stéphane est super également.

Pour ma part j'ai aussi résolut le problème ...

open(LDAP, "<$ldif_file");
local $/ = "";
while ($bloc = <LDAP>) {
@res = split (/n/, $bloc);
....

Bref, Perl c'est cool, on a tous un point de vue "possible".

Merci pour toutes vos réponses.

Georges



Publicité
Poster une réponse
Anonyme