#1 Le 05/09/2024, à 10:42
- Alicetxe
BASH - Compter les lignes d'un csv avec champ contenant retour chariot
Bonjour,
J'ai créé un script bash qui me stocke des lignes d'une table dans un CSV avec cette commande :
psql -v client_encoding='LATIN1' -b -h $P_Serv -p $P_Port -q $P_Base $P_User -c "\\Copy (select * from ma_table) To '"Fichier_EXPORT"' With CSV DELIMITER ';' HEADER"
Ceci dans le but de sauvegarder mes données avant leur suppression en base.
Justement, avant de faire un delete dans ma table, je veux contrôler que mon fichier d'export contient bien toutes les données.
Pour cela, je teste si mon count(*) de ma table correspond au nombre de lignes de mon fichier, avec cette commande :
nb_lignes_fic=$(wc -l <Fichier_EXPORT.csv)
Le problème, c'est que j'ai une colonne "Commentaire" dans ma table qui contient, pour certaines lignes, un retour chariot...
Donc mon count(*) me retourne 100 lignes (ce qui est correct) et ma variable nb_lignes_fic me retourne 110 lignes (incorrect, car j'ai 10 lignes dont la colonne Commentaire comporte un retour chariot).
Si j'ouvre mon csv avec Excel, je vois bien mes 100 lignes.
Comment faire en shell pour compter le nombre de lignes réel ?
Merci d'avance à tous
Hors ligne
#2 Le 05/09/2024, à 13:28
- Watael
Re : BASH - Compter les lignes d'un csv avec champ contenant retour chariot
salut,
ce ne serait pas plus simple de copier la table dans une base de données ou temporaire ou de sauvegarde ? ainsi, tu continues d'utiliser SQL pour vérifier l'intégrité des données, et/ou effectuer des traitements ultérieurement !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 05/09/2024, à 13:31
- Alicetxe
Re : BASH - Compter les lignes d'un csv avec champ contenant retour chariot
Salut,
Merci pour ta réponse mais malheureusement ce n'est pas possible d'agir sur la base actuelle et nous n'avons pas d'autre base à disposition...
Voilà pourquoi des fichiers à plat...
Hors ligne
#4 Le 05/09/2024, à 13:46
- Watael
Re : BASH - Compter les lignes d'un csv avec champ contenant retour chariot
et le CSV est obligatoire ? tu peux exporter en JSON, puis utiliser jq.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 05/09/2024, à 13:59
- Alicetxe
Re : BASH - Compter les lignes d'un csv avec champ contenant retour chariot
Je n'ai pas essayé, tu aurais un exemple à me donner pour que je teste ?
Merci
Hors ligne
#6 Le 05/09/2024, à 14:23
- Watael
Re : BASH - Compter les lignes d'un csv avec champ contenant retour chariot
je ne saurais pas élaborer une commande d'export (je n'ai pas de base psql), mais ça se trouve en sftw.
par contre, il semble qu'il faille faire une "petite" manipulation avec sed pour avoir un JSON valide :
$ psql #...export2_fichier.json
$ sed -i '1i\[
s/}$/},/g; $s/},$/}/; $a\]' fichier.json
$ jq '.|length' fichier.json
si ça ne fonctionne pas, il faudra que tu nous confies quelques lignes de l'export JSON pour qu'on adapte le sed.
Dernière modification par Watael (Le 05/09/2024, à 16:46)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 05/09/2024, à 15:21
- soshy
Re : BASH - Compter les lignes d'un csv avec champ contenant retour chariot
Salut,
Honnêtement ce qui me parait le plus simple pour ton cas c'est d'utiliser q
q -H -d ';' "select count(*) from ./myfile.csv"
Ca devrait fonctionner tout seul. Ce truc est trop bien, tu peux même faire des requêtes avec jointures entres des fichiers CSV.
Dernière modification par soshy (Le 05/09/2024, à 15:29)
Hors ligne
#8 Le 05/09/2024, à 16:37
- Alicetxe
Re : BASH - Compter les lignes d'un csv avec champ contenant retour chariot
Merci soshy, ça a l'air super ton truc, mais malheureusement le package n'est pas installé sur ma machine et je n'ai aucun droit pour faire l'installation
Hors ligne
#9 Le 05/09/2024, à 19:47
- RaphaelG
Re : BASH - Compter les lignes d'un csv avec champ contenant retour chariot
Cela doit pouvoir se faire avec awk.
Il aurait fallu que tu nous montres un extrait de ton fichier CSV mais je t'ai quand même fait un petit script qui marche sous certaines conditions.
- Dans les lignes qui ne sont pas tronquées par un commentaire avec des retours à la ligne, il y a toujours le même nombre de virgule.
- la colonne commentaire est toujours à la fin.
awk2$ cat linecounter.sh
#!/usr/bin/sh
#### to be personalized ####
csv_file=~/IT/shell_scripts/awk2/csv_file.csv # path of the csv file to
# process
nc=4 # number of columns
awk -v nc=$nc '
BEGIN { FS=","; nl=0 }
NF == nc { nl++ }
END { print nl }
' $csv_file
exit $?
awk2$
Si le nombre de 'field' (c'est la terminologie awk) est variable, bah mon script ne marche pas et je ne vois pas trop comment faire.
Si la colonne commentaire n'est pas à la fin, c'est plus compliqué mais pas insurmontable.
IHTH.
P.S. avant d'utiliser ce script, il faut que tu personnalises les variables csv_file et nc.
Dernière modification par RaphaelG (Le 05/09/2024, à 23:26)
En ligne
#10 Le 05/09/2024, à 20:07
- jplemoine
Re : BASH - Compter les lignes d'un csv avec champ contenant retour chariot
je n'ai aucun droit pour faire l'installation
Et tu ne peux pas demander à ce que l'on te l'installe ?
Parce que là, on est entre un admin base de données et un admin système.
Donc, faire de l'administration sans les droits d'admin, tu oublies...
Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.
Déconnecté jusqu’à nouvel ordre
Hors ligne