Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/06/2012, à 15:31

HacKurx

[résolu] Besoin d'aide pour manipuler du texte

Bonjour à tous, Oh grand développeur ou meilleur ami de bourne shell big_smile

J'ai besoin de convertir un fichier en .csv exploitable, j'ai préalablement réussi à tout faire mais je reste bloquer un point.

Actuellement mon .csv exploitable ressemble à ceci :

bob,
leponge,
bobleponge@delocean,
bob2,
leponge,
bob2leponge@delocean,

Mais il me faut obtenir ce résultat final :

bob,leponge,bobleponge@delocean,
bob2,leponge,bob2leponge@delocean,

Quelqu'un peut me venir en aide s'il vous plait? Car je bloque un peu, merci d'avance.

Dernière modification par HacKurx (Le 12/06/2012, à 15:50)

Hors ligne

#2 Le 12/06/2012, à 15:44

credenhill

Re : [résolu] Besoin d'aide pour manipuler du texte

hello

$ awk '{printf $0} /@/ {print ""}' fichier.csv
bob,leponge,bobleponge@delocean,
bob2,leponge,bob2leponge@delocean,
$

Hors ligne

#3 Le 12/06/2012, à 15:49

HacKurx

Re : [résolu] Besoin d'aide pour manipuler du texte

Yes merci beaucoup smile

Hors ligne

#4 Le 12/06/2012, à 22:20

hayou

Re : [résolu] Besoin d'aide pour manipuler du texte

j'aurai besoin d'un café ... personne ? lol

Hors ligne

#5 Le 13/06/2012, à 08:39

credenhill

Re : [résolu] Besoin d'aide pour manipuler du texte

voila
cafe
on peut simplifier

$ awk '/@/ {$0=$0 "\n"} {printf $0}'  fichier.csv
bob,leponge,bobleponge@delocean,
bob2,leponge,bob2leponge@delocean,
$ 

Dernière modification par credenhill (Le 13/06/2012, à 08:43)

Hors ligne

#6 Le 13/06/2012, à 10:24

HacKurx

Re : [résolu] Besoin d'aide pour manipuler du texte

Ok merci, mon script fonctionne bien mais je rencontre juste un dernière problème avec certaine conversion ^^
En effet lorsque la ligne "InternetAddress: " est vide et ne comporte pas d'arobase mon export est faussé.

Je dois donc créer une condition de sorte que si la ligne ne comporte pas d'arobase alors on lui ajoute "aucune@adresse".

Je penche sur un "sed 's/InternetAddress: /InternetAddress: aucune@adresse/g'" en plus abouti.

Dernière modification par HacKurx (Le 13/06/2012, à 10:33)

Hors ligne

#7 Le 13/06/2012, à 10:32

credenhill

Re : [résolu] Besoin d'aide pour manipuler du texte

montre un exemple de fichier avant et après

Hors ligne

#8 Le 13/06/2012, à 10:39

HacKurx

Re : [résolu] Besoin d'aide pour manipuler du texte

Si sur la ligne InternetAdress on a une adresse mail de renseignée

InternetAddress:  bobleponge@delocean

Alors on ne touche pas à la ligne.

Si par contre on a pas d'adresse mail sur la ligne

InternetAddress:

Alors on lui rajoute une adresse e-mail bidon afin d'obtenir ceci:

InternetAddress: aucune@adresse

Hors ligne

#9 Le 13/06/2012, à 10:42

HacKurx

Re : [résolu] Besoin d'aide pour manipuler du texte

Le fichier que je dois modifier ressemble à ceci pour chaque contact :

PhoneLabel_1:  Téléphone professionnel
PhoneLabel_3:  Fax professionnel
PhoneLabel_5:  Téléphone portable
PhoneLabel_2:  Téléphone personnel
PhoneLabel_4:  Fax personnel
PhoneLabel_6:  Radiomessagerie
OfficeStreetAddress:  
OfficeCity:  
OfficeState:  
StreetAddress:  
City:  
State:  
AreaCodeFromLoc:  
FirstName:  bob
OfficePhoneNumber:  
MiddleInitial:  
OfficeFAXPhoneNumber:  
LastName:  eponge
CellPhoneNumber:  
Title:  
Suffix:  
PhoneNumber:  
AltFullName:  
AltFullNameLanguage:  
HomeFAXPhoneNumber:  
PhoneNumber_6:  
CompanyName:  test
MailAddress:  bob@eponge
JobTitle:  
WebSite:  
BusinessAddress:  
HomeAddress:  
OfficeZIP:  
Zip:  
OfficeCountry:  
country:  
Location:  
Spouse:  
Department:  
Children:  
Manager:  
Assistant:  
Birthday:  
FullName:  bob eponge
Categories:  
MailDomain:  
MailSystem:  
Logo: 
ShortName:  
AltFullNameSort:  
NameDisplayPref:  1
Certificate:  
PublicKey:  
Type:  Person
DocumentAccess:  [UserModifier]
InternetAddress:  test@test.fr
$UpdatedBy:  CN=bob eponge/O=test
$Revisions:  14/04/2010 17:00:03,14/04/2010 17:00:04,14/04/2010 17:00:21

Je pense que pour éviter toute erreur sur l'import de chaque contact il faudrait plus utiliser la ligne $Revisions.

Dernière modification par HacKurx (Le 13/06/2012, à 10:45)

Hors ligne

#10 Le 13/06/2012, à 10:47

HacKurx

Re : [résolu] Besoin d'aide pour manipuler du texte

Pour faire plus simple voici mon script :

#!/bin/sh
# Structure du CSV zimbra: http://wiki.zimbra.com/wiki/Import_and_Export_of_Contacts
# Utilisation: ./domino2zimbra.sh test_export_carnet

# Convertion du fichier source en utf-8
iconv -f ISO-8859-1 -t utf-8 $1 > /tmp/export.txt

# Récupération des champs intéressant
cat /tmp/export.txt | egrep -a -e "FirstName|OfficePhoneNumber|OfficeFAXPhoneNumber|LastName|CellPhoneNumber|CompanyName|JobTitle|InternetAddress" | cut -d ' ' -f 3- > /tmp/export.csv

# Remplacement des retour chariot windows ^M (soit \r avec sed) par une virgule.  
sed -i s/\\r/,/g  /tmp/export.csv

# Mise en forme des champs pour respecter la structures .csv d'importation
awk '{printf $0} /@/ {print ""}' /tmp/export.csv > /tmp/import-contact-zimbra.csv

# Ajout de la 1ere ligne de fichier pour définir les colones
sed -i '1i"FirstName","workPhone","workFax","LastName","mobilePhone","company","jobTitle","email",' /tmp/import-contact-zimbra.csv

# Message de fin
echo "Votre fichier /tmp/import-contact-zimbra.csv est prêt pour l'importation dans Zimbra."

exit 0

Hors ligne

#11 Le 13/06/2012, à 10:50

credenhill

Re : [résolu] Besoin d'aide pour manipuler du texte

$ cat a44
InternetAddress:  bobleponge@delocean
InternetAddress:
$ 
$ awk '/^InternetAd/ {if(NF<2)$2="aucune@adresse" ; print $2}' a44
bobleponge@delocean
aucune@adresse
$ 

Hors ligne

#12 Le 13/06/2012, à 11:06

HacKurx

Re : [résolu] Besoin d'aide pour manipuler du texte

Hélas cela ne fonctionne pas je viens de voir que certain contact non pas la ligne "InternetAddress" et que de plus la ligne parfois ne se trouve pas à la fin d'un contact roll

C'est un veux serveur domino, et je me retrouve avec des .csv parfois différent...

Dernière modification par HacKurx (Le 13/06/2012, à 11:09)

Hors ligne

#13 Le 13/06/2012, à 11:21

HacKurx

Re : [résolu] Besoin d'aide pour manipuler du texte

J'ai trouvé une solution alternative, je récupère juste les adresses email si le .csv m'embête de trop. En tout cas encore merci Credenhill.

Hors ligne

#14 Le 14/06/2012, à 04:49

nesthib

Re : [résolu] Besoin d'aide pour manipuler du texte

En réponse à la première question, si ton fichier csv est régulier, voici une solution dans le même genre que celle de credenhill, mais se basant sur le numéro de ligne plutôt que sur un motif de la ligne :

awk '{printf($0(NR%3 ? "" : "\n"))}' fichier


NB. quelques remarques en vrac :

cat … | grep … | cut … > …

peut avantageusement être remplacé par

sed -i -n '/FirstName\|OfficePhoneNumber\|OfficeFAXPhoneNumber\|LastName\|CellPhoneNumber\|CompanyName\|JobTitle\|InternetAddress/s/[^:]*: *//p' fichier

(avec l'option -i le fichier est modifié sur place)


Si ton fichier est un ensemble de blocs tels que décrits dans le message #9 tu peux utiliser la commande suivante :

awk '(/FirstName|OfficePhoneNumber|OfficeFAXPhoneNumber|LastName|CellPhoneNumber|CompanyName|JobTitle|InternetAddress/) {printf $2", "} ; (/\$Revisions/) { printf "\n"}'

Si ton fichier comporte des exceptions, comme un champ présent aléatoirement ou les paramètres dans un ordre variable, je te suggère de créer un script plus complet qui lit ligne à ligne le fichier et assigne chaque information trouvée à une variable puis compile le résultat à chaque fin de bloc.
en pseudocode :

on lit une ligne
si la ligne comporte le mot clé "FirstName" on enregistre l'information qui suit dans la variable firstname
sinon, si la ligne comporte le mot clé…
sinon, si…
si on arrive en fin d'un bloc (motif "$Revisions") on compile les informations obtenues (les variables non assignées doivent retourner une chaîne vide)
    ${firstname}, ${officephonenumber}, ${…}, …\n
on recommence tant qu'il reste des lignes

Tu peux faire ça en bash ou dans un langage un peu plus convivial comme le python.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#15 Le 14/06/2012, à 13:59

HacKurx

Re : [résolu] Besoin d'aide pour manipuler du texte

Ok merci wink

Hors ligne