Re: commande sort ou autre : problème si catégorie est à bla…

Top Page

Reply to this message
Author: guilde.nt
Date:  
To: anne.guilde@free.fr
CC: guilde
Subject: Re: commande sort ou autre : problème si catégorie est à blanc
Quoting anne.guilde@???, Wed 22 Jan 2020, 05:37 +0100 CET :
> Quand le csv vient de mon téléphone, il n'y a pas de catégorie.
>
>     $37 {print |& s37 ; next}
>       close(s37, "to")
>       while ((s37 |& getline) > 0) print

>
> Le script se bloque et attend désespérément
> Comment gérer dans le awk quand la colonne 37 est à blanc sur toutes les
> lignes du fichier pour qu'il n'attende pas indéfiniment?


Plus haut, en ne gardant que les lignes d'intérêt : s'il n'y a pas de
champ 37, on ne passe pas par '$37 {print...}', donc on n'ouvre jamais
la pipe bi-directionnelle vers le coprocessus s37. Plus tard, on ferme
la direction "to" de cette pipe avec close(s37, "to"), qui ne provoque
pas d'erreur, même si elle n'a jamais été ouverte ; ensuite, on essaie
de lire la sortie du coprocessus avec "s37 |& getline". C'est là qu'on
bloque, puisqu'elle n'est pas été ouverte. La correction est simple :

$37 {p37=1 ; print |& s37 ; next} # on marque l'ouverture de s37
!$37 {p1=1 ; print |& s1 ; next} # pareil pour s1
END {
  if (p37) {
    close(s37, "to")
    while ((s37 |& getline) > 0) print
  }


  if (p1) {
    close(s1, "to")
    while ((s1 |& getline) > 0) print
  }
}


> J'ai mis une catégorie a une des lignes du fichier et le script fonctionne.


Bonne heuristique ; "zzz" dans la solution avec vi était aussi un
work-around ; mais sans garantie, et qui demande de vérifier qu'il n'y
a pas de chaîne "zzz" au début du champ 37, dans quel cas il faudrait
utiliser "zzzz". Vi étant interactif, on ne peut pas le mettre dans un
script, qui n'a pas de terminal ouvert. Pour cela, il faut utiliser ex,
sur qui vi repose ; comme ceci :

echo '
2,$s/;$/;zzz/
2,$!sort -t \; -k 37,37 -k 3,3
2,$s/;zzz$/;/
wq
' | ex file.csv

ou ceci :

cat <<'eof' | ex file.csv
2,$s/;$/;zzz/
2,$!sort -t \; -k 37,37 -k 3,3
2,$s/;zzz$/;/
wq
eof

> Si c'est compliqué à modifier dans le awk, je peux modifier le php qui
> transforme le vcf en csv pour qu'il mette 'tel' dans la catégorie.


Les outils pour travailler du texte sont, par ordre croissant, sed ;
sinon awk ; sinon, pour moi, perl. Le problème de perl : on a un peu de
mal à se relire quelque temps après ; peut-être que perl6 (renommé
raku) est plus orthogonal. Les gens hésitent à utiliser ces vieux
outils des années 1970 parce qu'ils sont... vieux, en pensant que ce
qui est moderne est mieux. PHP peut convertir tes formats, mais moins
bien -- je pense pouvoir faire tenir les scripts de conversion,
dans les deux sens, sur moins d'une page.

> J'ai réussi à ajouter une autre commande awk dans le script pour pouvoir
> comparer facilement les enregistrements modifiés entre les téléphones et
> nextcloud
>
> # traitement du fichier trié pour comparaison entre téléphone et nextcloud
> awk -F \; '{print $1";"$2";"$3";"$8";"$9";"$10";"$5";"$32}
> ' $fichier_retour1 > $fichier_retour3
>
> Si vous avez des commentaires à faire sur la commande...


Je pense que tu essaies de comparer juste quelques champs non-vides. Si
j'ai deviné juste, essaie mon programme d'il y a deux semaines qui
éclate une ligne csv en plusieurs lignes, un champ par ligne, en
éliminant les champs vides. Avec un outil tout aussi simple, tu peux
convertir dans l'autre sens. Tout ceci ressemble à la conversion entre
csv et vcf.
Ton projet de carnet d'adresses unifié a deux ans maintenant. Tu
découvres que parfois le champ 37 n'est pas renseigné ; ou qu'il manque
complètement dans certains de tes appareils ; ou que la date n'a pas
le même format d'un appareil à un autre ; ou qu'un champ contient le
séparateur de champs. Je pense qu'il n'y a pas de format commun. Au
moins les noms et le nombre des champs seront différents d'un appareil
à l'autre, et il faudra passer cette information comme paramètre à
tes routines de conversion. Ensuite vient le problème des formats des
données dans les champs.
Dans l'immédiat, il est plus censé de se concentrer sur tes 20, 30 ou
50 contacts fréquents, et de garder le reste sur ton ordinateur. Pour
ces contacts fréquents, réduis le nombre des champs au minimum
(environ 20 dans mon téléphone, la plupart étant vides). Avec cela,
tu peux expérimenter en construisant des outils simples.
Sinon, on en reparle dans deux ans.
Nicolas T.