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 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 smile

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 smile

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. tongue
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 hmm

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)

Hors ligne

#10 Le 05/09/2024, à 20:07

jplemoine

Re : BASH - Compter les lignes d'un csv avec champ contenant retour chariot

Alicetxe a écrit :

je n'ai aucun droit pour faire l'installation hmm

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