Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ldif vers Csv

5 réponses
Avatar
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 (/\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;;@mail\n";
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.

5 réponses

Avatar
Stéphane Müller
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" a écrit dans le
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.


Avatar
kurtz le pirate
In article <4651e9c4$0$3878$,
Georges Kosto wrote:

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

Avatar
Stéphane Müller
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" a écrit dans le
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.


Avatar
giganet
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" a écrit dans le
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;


Avatar
Georges Kosto
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" a écrit dans le 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;


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