Script sh pour création de fichier .ldif(csv)

Bonjour,

J'aimerais ecrire un script ayant pour paramètre un fichier CSV me permettant de créer un fichier LDIF (pour import dans un annuaire LDAP).

Mon fichier csv (user.csv) est le suivant :

Identifiant;nom;prenom;adresse:mail
id1:nom1:prenom1:adresse1:mail1
id2:nom2:prenom2:adresse2:mail2
.
.
.
idN:nomN:prenomN:adresseN:mailN
_____________________________________________________________________________________________

En sortie je voudrais avoir ceci:

dn: uid=id1, ou=People
objectClass:Top
cn: nom1
sn: prenom1
address: adresse1
mail: mail1

dn: uid=id1, ou=People
objectClass:Top
cn: nom2
sn: prenom2
address: adresse2
mail: mail2

.
.
.

dn: uid=idN, ou=People
objectClass:Top
cn: nomN
sn: prenomN
address: adresseN
mail: mailN

____________________________________________________________________________________________

J'ai creé un fichier test.awk :

{printf "dn: uid=%s, ou=People\nobjectClass: Top\ncn: %s\sn: %s\naddress: %s\nmail: %s\n\n",$1, $2, $3, $4, $5}

et j'ai taper la commande qui suit:

> nawk -F";" -f test.awk user.csv > user.ldif

Je n'ai aucun message d'erreur , la commande passe normalement, par contre y'a rien sur le fichier user.ldif à part nawk : commande not found (je suis sur Linux)

Quelqu'un pourrait il m'aider à resoudre le probléme s'il vous plait? Je vous remercie d'avance.

17 réponses

Résumé de la discussion

Conversion CSV vers LDIF avec awk pose des problèmes de délimiteurs, de guillemets et de synchronisation des champs pour un import LDAP fiable et reproductible. Plusieurs échanges recommandent d’utiliser -F ';' et printf sur chaque champ pour générer dn:, objectClass:, cn:, sn:, address et mail, tout en ajustant les guillemets et les retours à la ligne. D'autres discussions montrent qu'il faut aligner le nombre de variables awk avec le nombre de champs du CSV, faute de quoi des erreurs de syntaxe ou des sorties vides apparaissent. En pratique, la solution finale réside dans l’adaptation du script et du nombre de champs traités (7 ou 8 selon le fichier) pour générer le LDIF sans message d’erreur.

Bobot (l’IA à votre service)
  1. Contributeur
    Salut,

    Remplace "nawk" par "awk", attention à ton séparateur (dans ton fichier ces ":" et non ";") :

     awk -F':' 'NR != 1 { printf "dn: uid=%s, ou=People\nobjectClass: Top\ncn: %s\nsn: %s\naddress: %s\nmail: %s\n\n",$1, $2, $3, $4, $5 }' user.csv > user.ldif 
    1. Contributeur
      Euh... tout le monde aura rectifié le "ces" en "c'est" ;-((
  2. Tout d'abord merci pour ton aide,

    J'ai bien remplacé le nawk par un awk et j'ai rectifié la faute de syntaxe (":");mais
    Je n'ai toujours aucun resultat, le fichier user.ldif est toujours vierge, en plus quand je tape la commande rien ne se passe ,j'ai le prompteur qui clignote sans pour autant etre sur le répertoire ou je lance cette dérniere (la commande) .........
    1. Contributeur
      Perso sur ton exemple de fichier plus haut, chez moi ça marche ;-\

      Il nous faudrait un exemple concret de ton fichier (à mettre sur cjoint si possible) ?

      Il vient d'où ton fichier csv ? C'est un fichier Windows ?
  3. Le fichier users.csv est un fichier texte que j'ai remplis à la main , je suis sur une machine linux(fedora 17).

    users.csv est identitque à l'exemple siter en haut, c'est à dire :

    Identifiant;nom;prenom;adresse:mail
    id1:nom1:prenom1:adresse1:mail1
    id2:nom2:prenom2:adresse2:mail2
    .
    .
    .
    1. Contributeur
      $ cat plop
      Identifiant;nom;prenom;adresse:mail
      id1:nom1:prenom1:adresse1:mail1
      id2:nom2:prenom2:adresse2:mail2
      
      $ awk -F':' 'NR != 1 { printf "dn: uid=%s, ou=People\nobjectClass: Top\ncn: %s\nsn: %s\naddress: %s\nmail: %s\n\n",$1, $2, $3, $4, $5}' plop 
      dn: uid=id1, ou=People
      objectClass: Top
      cn: nom1
      sn: prenom1
      address: adresse1
      mail: mail1
      
      dn: uid=id2, ou=People
      objectClass: Top
      cn: nom2
      sn: prenom2
      address: adresse2
      mail: mail2
      
      
      $

      Je ne peux rien de plus pour toi ;-\
    2. Contributeur
      hello
      l'éditeur ajoute peut-être des ^M
      que répond cat -A users.csv | head -3
    3. Contributeur
      Salut,

      Il me semblait bien que "awk" était insensible au format M$ ;-)

      Je viens d'en refaire l'expérience :

      $ cat -A brol 
      Identifiant;nom;prenom;adresse:mail^M$
      id1:nom1:prenom1:adresse1:mail1^M$
      id2:nom2:prenom2:adresse2:mail2^M$
      
      $ awk -F':' 'NR != 1 { printf "dn: uid=%s, ou=People\nobjectClass: Top\ncn: %s\nsn: %s\naddress: %s\nmail: %s\n\n",$1, $2, $3, $4, $5}' brol 
      dn: uid=id1, ou=People
      objectClass: Top
      cn: nom1
      sn: prenom1
      address: adresse1
      mail: mail1
      
      dn: uid=id2, ou=People
      objectClass: Top
      cn: nom2
      sn: prenom2
      address: adresse2
      mail: mail2
      
      

      ;-\
  4. La reponse au cat -A users.csv | head -3 est l'affichage des trois premier enregistrement c'est à dire :

    Identifiant;nom;prenom;adresse:mail
    id1:nom1:prenom1:adresse1:mail1
    id2:nom2:prenom2:adresse2:mail2

    et l'idée c'est d'importer les données du fichier users.csv afin de creer un users.ldif que je pourrais ajouter à mon .ldif de ma base ldap

    Merci d'avance pour votre aide
    1. Contributeur
      La reponse au cat -A users.csv | head -3 est l'affichage des trois premier enregistrement c'est à dire :

      Identifiant;nom;prenom;adresse:mail
      id1:nom1:prenom1:adresse1:mail1
      id2:nom2:prenom2:adresse2:mail2


      Euh... non ! La réponse devrait être l'une ou l'autre des lignes qui suivent :

      $ cat -A plop | head -3
      Identifiant;nom;prenom;adresse:mail$
      id1:nom1:prenom1:adresse1:mail1$
      id2:nom2:prenom2:adresse2:mail2$
      
      $ cat -A brol | head -3
      Identifiant;nom;prenom;adresse:mail^M$
      id1:nom1:prenom1:adresse1:mail1^M$
      id2:nom2:prenom2:adresse2:mail2^M$
      
      $

      Donc merci de répondre au mieux aux demandes faites, faute de quoi ton sujet n'avancera pas ;-(
  5. Effectivement je me suis un peu précipité :

    $ cat -A plop | head -3
    Identifiant;nom;prenom;adresse:mail$
    id1:nom1:prenom1:adresse1:mail1$
    id2:nom2:prenom2:adresse2:mail2$
    1. Contributeur
      Ok*, et que donne la commande "awk" sur cet exemple ? Elle marche ou pas ?

      * Bien que ce soit un copier/coller de mon exemple ;-((
  6. J'ai biensur taper la commande

    $ cat -A users.csv | head -3 et non avec ton exemple (plop), et pour ce qui est de la commande "awk" ca ne marche tjr pas et je ne comprends vraiment pas ce qui cloche.....
    1. Contributeur
      Difficile de t'aider davantage sans matière à tester ;-((

      Il se peut qu'il y ait des caractères non-imprimables dans ton fichier ;-\
      Ou que la syntaxe employée dans awk ne convienne/corresponde pas tout a fait pour matcher ton fichier...
  7. Pour résumer, j'ai un fichier texte (users.csv) et un autre vierge (users.ldif) et la commanda awk que j'essaye de faire passer.....resultat des courses, c'est que le prompt bloque, si au moins j'avais un message d'erreur ça m'aurais peut etre aider....

    Autre chose : c'est des guillemets (") et non un (') avant le print , sinon j'ai un message d'erreur qui me dit que la chaine est pas refermé, mais comme tu dis que ça a marché chez toi ....

    $ awk -F':' "NR != 1 { printf "dn: uid=%s, ou=People\nobjectClass: Top\ncn: %s\nsn: %s\naddress: %s\nmail: %s\n\n",$1, $2, $3, $4, $5}" users.ldif

    qu'es ce que ten pense???
    1. Contributeur
      Autre chose : c'est des guillemets (") et non un (') avant le print , sinon j'ai un message d'erreur qui me dit que la chaine est pas refermé, mais comme tu dis que ça a marché chez toi

      Non, il faut des quotes simples autour de l'expression de "awk" impérativement !

      Je viens d'essayer au cas ou en rajoutant un nom avec apostrophe dans le fichier csv et ça passe toujours (toujours avec des quotes simples autour).

      Il y a quelque chose dans ton fichier qui interfère avec la syntaxe de awk, mais quoi ?
  8. Dans mon fichier users.csv j'ai des password cryptés qui sont des chaines de caractétes alphanumerique (minuscules et majuscules confondus) , aprés ton post j'ai viré ce champ pour voir si c'etait lui qui posé probléme , mais RIEN !!!!

    Voila le resultat du $ cat -A users.csv | head -3 de tout à l'heure ;

    pbrunel:brunel:50D937CF1083828EAAD3B435B51404EE:3CB8FED01D4E00FF83095D014169698C:e1NTSEF9MmxKbS9IcE0xM2c2ODdlK3MvSWpIUDBHRWo5eFVrUnk=
    qlamy:lamy:FE9352E46615FBB7C2265B23734E0DAC:4C706B2DA6E8624A6F3C7A7F143DE5F9:e1NTSEF9bEpMa0ZlNEg3QmxLdy9WMXBSUlBoZWt5TDZWeGJUTks=
    pdiaz:diaz:AA9658E960287DDAAAD3B435B51404EE:C0F6AE8DE28EAE9EBFE3DE605DBE76C3
    1. Contributeur
      ça ne ressemble pas à un cat -A car les lignes devraient se terminer par un $
    2. Contributeur
      Avec cet extrait de ton fichier et en virant le "NR != 1" qui ne sert plus à rien vu qu'il n'y a pas de ligne de titre, ben chez moi ça marche toujours ;-\

      $ awk -F':' '{ printf "dn: uid=%s, ou=People\nobjectClass: Top\ncn: %s\nsn: %s\naddress: %s\nmail: %s\n\n",$1, $2, $3, $4, $5}' fich 
      dn: uid=pbrunel, ou=People
      objectClass: Top
      cn: brunel
      sn: 50D937CF1083828EAAD3B435B51404EE
      address: 3CB8FED01D4E00FF83095D014169698C
      mail: e1NTSEF9MmxKbS9IcE0xM2c2ODdlK3MvSWpIUDBHRWo5eFVrUnk=
      
      dn: uid=qlamy, ou=People
      objectClass: Top
      cn: lamy
      sn: FE9352E46615FBB7C2265B23734E0DAC
      address: 4C706B2DA6E8624A6F3C7A7F143DE5F9
      mail: e1NTSEF9bEpMa0ZlNEg3QmxLdy9WMXBSUlBoZWt5TDZWeGJUTks=
      
      dn: uid=pdiaz, ou=People
      objectClass: Top
      cn: diaz
      sn: AA9658E960287DDAAAD3B435B51404EE
      address: C0F6AE8DE28EAE9EBFE3DE605DBE76C3
      mail: 
      
      
      $
  9. linux-1dl0:/ # awk -F':' '{print NF}'

    0

    0

    0

    0

    0

    0

    0

    0

    il se passe rien, quand je tape sur entrée j'ai un 0
    1. Contributeur
      Avec le fichier en plus à la fin de la syntaxe, ce serait peut être mieux ;-))
  10. C'est bon ça marche... le probléme venait d'une erreur syntaxique

    Grand MERCI à vous
    1. Contributeur
      le probléme venait d'une erreur syntaxique
      Laquelle histoire qu'on ne meure pas idiot ? ;-\ Merci ;-))
  11. Tu mourras pas idiot l'ami, par contre moi j'ai vécu comme tel pendant trois jours :) ....

    l'erreur c'etait le nombre de variables , j'en avais 8 et je n'en faisais passer que 7