database:utilitaires-imports

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
database:utilitaires-imports [2021/04/27 13:36] – [Extraire les lignes comprenant un nombre de tabulation anormal] jpmilcentdatabase:utilitaires-imports [2024/09/04 16:13] (Version actuelle) – [Extraction de lignes d'un fichier] jpmilcent
Ligne 6: Ligne 6:
 travailler avec ces fichiers. travailler avec ces fichiers.
  
 +===== Manipulation des fichiers CSV =====
 +Les outils ci-dessous permettent de transformer les fichiers CSV et de les analyser :
 +  * [[https://csvkit.readthedocs.io/en/latest/tutorial.html|CsvKit]]
 +  * [[https://colin.maudry.com/csvtool-manual-page/|CsvTool]]
 +  * [[https://miller.readthedocs.io/en/latest/index.html|Miller]]
 +    * Exemple de [[https://miller.readthedocs.io/en/latest/cookbook.html#search-and-replace-over-all-fields|remplacement de valeur de colonne]]
 ===== Extraction de lignes d'un fichier ===== ===== Extraction de lignes d'un fichier =====
  
Ligne 27: Ligne 33:
  
 Compter le nombre de ligne d'un fichier : <code bash> wc -l synthese.csv </code> Compter le nombre de ligne d'un fichier : <code bash> wc -l synthese.csv </code>
 +
 +==== Visualiser un fichier TSV dans un terminal ====
 +Pour afficher les premières lignes d'un fichier TSV sans l'ouvrir en totalité (gros volume) dans un terminal :
 +  * Créer un fichier ''pretty_tsv.sh'' dans ''~/bin'' et y insérer les lignes suivantes : <code bash>
 +#!/bin/bash
 +perl -pe 's/((?<=\t)|(?<=^))\t/ \t/g;' "$@" | head -n 10 | column -t -s $'\t' | exec less  -F -S -X -K 
 +</code>
 +  * Editer ''~/.bash_aliases'' et insérer la ligne suivante : <code bash>
 +# pretty tsv with first ten lines
 +alias watch='~/bin/pretty_tsv.sh'
 +</code>
 +  * Vous pouvez lancer la commande ''watch ../chemin/vers/fichier'' dans le Terminal
  
 ===== Extraire les lignes comprenant un nombre de tabulation anormal ===== ===== Extraire les lignes comprenant un nombre de tabulation anormal =====
Ligne 47: Ligne 65:
 <code bash> <code bash>
 # Afficher le nombre de tabulation des lignes du fichier contenant un extrait de la synthese # Afficher le nombre de tabulation des lignes du fichier contenant un extrait de la synthese
-# Le chemin /data-nvme/tmp/ correspond à un dossier temporaire sur un disque rapide SSD NVM-E +# Le chemin /data-nvme/jpmilcent/tmp/ correspond à un dossier temporaire sur un disque rapide SSD NVM-E 
-grep -n -o -P "\t" synthese.extract.csv | sort -n -T /data-nvme/tmp/ | uniq -c | cut -d : -f 1+grep -n -o -P "\t" synthese.extract.csv | sort -n -T /data-nvme/jpmilcent/tmp/ | uniq -c | cut -d : -f 1
  
 # Extraire le nombre de tabulation anormal (**ici différent de 58**) et le numéro de la ligne correspondante : # Extraire le nombre de tabulation anormal (**ici différent de 58**) et le numéro de la ligne correspondante :
-# Le chemin /data-nvme/tmp/ correspond à un dossier temporaire sur un disque rapide SSD NVM-E +# Le chemin /data-nvme/jpmilcent/tmp/ correspond à un dossier temporaire sur un disque rapide SSD NVM-E 
-grep -n -o -P "\t" synthese.csv | sort -n -T /data-nvme/tmp/ | uniq -c | cut -d : -f 1 | grep -P -v "^\s+58 " > ./synthese.tab_errors.txt+grep -n -o -P "\t" synthese.csv | sort -n -T /data-nvme/jpmilcent/tmp/ | uniq -c | cut -d : -f 1 | grep -P -v "^\s+58 " > ./synthese.tab_errors.txt
  
 # Supprimer le nombre de tabulation (occupant les 8 premières caractères de chaque ligne) # Supprimer le nombre de tabulation (occupant les 8 premières caractères de chaque ligne)
Ligne 74: Ligne 92:
  
 ==== Extraire les lignes dupliquées ===== ==== Extraire les lignes dupliquées =====
-  * Extraire les lignes dupliquées : <code bash> sort -T /data-nvme/tmp/ synthese.csv | uniq -cd > synthese.duplicates.csv </code>+  * Extraire les lignes dupliquées : <code bash> sort -T /data-nvme/jpmilcent/tmp/ synthese.csv | uniq -cd > synthese.duplicates.csv </code>
   * Extraire les lignes dupliquées en se basant seulement sur le contenu de la première colonne (remplacer le chiffre dans ''$1'' pour indiquer une autre colonne) : <code bash> awk 'cnt[$1]++{if (cnt[$1]==2) print prev[$1]; print} {prev[$1]=$0}' synthese.csv > synthese.duplicates-first-column.csv </code>   * Extraire les lignes dupliquées en se basant seulement sur le contenu de la première colonne (remplacer le chiffre dans ''$1'' pour indiquer une autre colonne) : <code bash> awk 'cnt[$1]++{if (cnt[$1]==2) print prev[$1]; print} {prev[$1]=$0}' synthese.csv > synthese.duplicates-first-column.csv </code>
  
Ligne 96: Ligne 114:
 Les lignes possédant une valeur dupliquée dans la colonne sélectionnée devraient Les lignes possédant une valeur dupliquée dans la colonne sélectionnée devraient
 apparaître avec un texte rouge. apparaître avec un texte rouge.
 +
 +===== Trouver les valeurs NULL dans les champs obligatoires =====
 +  * Vérifier la présence de valeur NULL (=''\N'') dans la colonne 33 (= //nom_cite//) :
 +    * Vérifier que la colonne 33 correspond bien au champ //nom_cite// avec : <code bash>head -1 synthese.csv | cut -f33</code>
 +    * Extraction des lignes contenant "\N" dans la colonne 33 : <code bash>grep -P '^(?:[^\t]+\t){32}\\N\t' synthese.csv  > synthese.col33_null.csv</code>
 +
  
 ===== Affichage/Extraction de lignes contenant une chaine particulière ===== ===== Affichage/Extraction de lignes contenant une chaine particulière =====
Ligne 108: Ligne 132:
 </code> </code>
  
-==== Liste de tests d'extractions ====+==== Commandes d'extractions (TSV) ====
   * Extraire les lignes dont la 29ème colonne contient la valeur "//0//" : <code bash> grep -P '^(?:[^\t]+\t){28}0\t' synthese.csv  > synthese.col29_zero.csv </code>   * Extraire les lignes dont la 29ème colonne contient la valeur "//0//" : <code bash> grep -P '^(?:[^\t]+\t){28}0\t' synthese.csv  > synthese.col29_zero.csv </code>
   * Présence de guillemets doubles non protégés :   * Présence de guillemets doubles non protégés :
Ligne 115: Ligne 139:
   * Présence du [[https://www.compart.com/fr/unicode/U+001A|caractère UTF-8 SUB]] issu d'un mauvais encodage : <code bash> grep -P '\x1A' synthese.csv > synthese.utf8_err.csv </code>   * Présence du [[https://www.compart.com/fr/unicode/U+001A|caractère UTF-8 SUB]] issu d'un mauvais encodage : <code bash> grep -P '\x1A' synthese.csv > synthese.utf8_err.csv </code>
   * Présence d'une succession de chaine NULL (''\N'') possiblement mal encodé : <code bash> grep -P '\tN\tN\t' synthese.csv  > synthese.null_err.csv </code>   * Présence d'une succession de chaine NULL (''\N'') possiblement mal encodé : <code bash> grep -P '\tN\tN\t' synthese.csv  > synthese.null_err.csv </code>
 +
 +==== Commandes d'extractions (Semicolon-SV) ====
 +  * Extraire les lignes dont la 1ère colonne est vide (avec CsvKit) : <code bash>csvgrep -d ";" -q '"' -u 0 -e "UTF-8" -c 1 -r "^$" synthese.csv > synthese.col1_empty.csv</code>
 +
 +
 ===== Supprimer des colonnes ===== ===== Supprimer des colonnes =====
  
Ligne 120: Ligne 149:
  
 Par exemple, pour supprimer les colonnes 36 et 37 d'un fichier //synthese.csv//, le résultat étant stocké dans le fichier //synthese.cuted.csv// : Par exemple, pour supprimer les colonnes 36 et 37 d'un fichier //synthese.csv//, le résultat étant stocké dans le fichier //synthese.cuted.csv// :
-''<nowiki> cut --complement -f 36-37 synthese.csv > synthese.cuted.csv </nowiki>''+<code bash> cut --complement -f 36-37 synthese.csv > synthese.cuted.csv </code> 
 + 
 +Sélections de colonnes pour réaliser un fichier de corrections. Ex. sélection des colonnes 1, 3 et 5 à 6, les autres sont supprimées : 
 +<code bash> cut --complement -f 2,4,7- synthese.csv > synthese.fix-2022-03-29.csv </code> 
 + 
 +**NOTES** : préalablement à l'utilisation de ''cut'' assurez vous d'avoir remplacer tous les retours à la ligne présent dans les colonnes par des caractères tel que ''\n'' ou ''\r\n'' voir la section //Contourner l'erreur : "sed: la taille du tampon d'entrée d'expression régulière est plus grand que INT_MAX"// ci-dessous.
  
 +===== Remplacer le contenu d'une colonne =====
 +Remplacer le contenu de la 33ème colonne dans le fichier //synthese.csv// quand elle contient ''\N'' avec la commande : <code bash> sed -i -E 's#^(([^\t]*\t){32})\\N\t#\1\t#' synthese.csv </code>
 ===== Remplacement de chaine ===== ===== Remplacement de chaine =====
  
Ligne 139: Ligne 175:
 sed -i -z 's/\(\t"[^"\t\n]*\)\n/\1\\n/g' synthese.csv sed -i -z 's/\(\t"[^"\t\n]*\)\n/\1\\n/g' synthese.csv
 </code> </code>
 +
 +===== Stats =====
 +  * Date d'observation la plus ancienne : <code bash> csvstat -t -q '"' -u 0 -e "UTF-8" -c date_min --min synthese.csv </code>
  
 ===== Contourner l'erreur : "sed: la taille du tampon d'entrée d'expression régulière est plus grand que INT_MAX" ===== ===== Contourner l'erreur : "sed: la taille du tampon d'entrée d'expression régulière est plus grand que INT_MAX" =====
Ligne 157: Ligne 196:
  
 # Recréation du fichier synthese.csv à partir des 2 fichiers de 2 millions de lignes # Recréation du fichier synthese.csv à partir des 2 fichiers de 2 millions de lignes
-cat synthese.2.csv >> synthese.1.csv ; mv synthese.1.csv synthese.csv+cat synthese.2.csv >> synthese.1.csv ; mv synthese.1.csv synthese.csv ; rm -f synthese.2.csv
 </code> </code>
  • database/utilitaires-imports.1619530592.txt.gz
  • Dernière modification : 2021/04/27 13:36
  • de jpmilcent