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/08/03 14:15] – [Extraire les lignes comprenant un nombre de tabulation anormal] jpmilcentdatabase:utilitaires-imports [2026/08/20 11:06] (Version actuelle) – [Extraire les lignes comprenant un nombre de tabulation anormal] jpmilcent
Ligne 33: 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 50: Ligne 62:
 Il est possible de repérer les lignes posant problème avec la succession Il est possible de repérer les lignes posant problème avec la succession
 de commandes suivantes : de commandes suivantes :
 +
 +Si votre espace de stockage principal n'est pas un SSD NVME mais que vous en posséder un sur la machine, l'utilitaire ''sort'' peut s'en servir en indiquant un dossier sur ce disque à l'aide de l'option ''-T'', par exemple : ''-T /data-nvme/jpmilcent/tmp/''.
  
 <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/jpmilcent/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/jpmilcent/tmp/ | uniq -c | cut -d : -f 1+grep -n -o -P "\t" synthese.extract.csv | sort -n  | 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/jpmilcent/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/jpmilcent/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 | 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 73: Ligne 87:
 # Après correction, vous pouvez vérifier si le fichier corrigé ne contient plus de ligne en erreur # Après correction, vous pouvez vérifier si le fichier corrigé ne contient plus de ligne en erreur
 # Le chemin /data-nvme/tmp/ correspond à un dossier temporaire sur un disque rapide SSD NVM-E # Le chemin /data-nvme/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 '^(?    58 )'+grep -n -o -P "\t" synthese.csv | sort -n | uniq -c | cut -d : -f 1 | grep -P '^(?    58 )'
 # Si tout est OK, la commande ne doit rien afficher... # Si tout est OK, la commande ne doit rien afficher...
 </code> </code>
 +
 +===== Extraire lignes avec trop de caractères dans une colonne =====
 +
 +<code bash>
 +# Extraire les lignes dont la colonne 38 possède plus de 500 caractères :
 +awk -F'\t' -v col=38 -v limite=500 'length($col) > limite { print "Ligne " NR " : " length($col) " caractères" }' synthese.csv > synthese.col-38-extra-chars.txt
 +</code>
 +  * ''%%-v col=38%%'' : remplacez 38 par le numéro de la colonne que vous souhaitez analyser.
 +  * ''%%-v limite=500%%'' : remplacez 500 par le nombre de caractères au-delà duquel vous souhaitez être alerté.
 +  * ''%%length($col) > limite%%'' : c'est la condition. awk ne déclenchera la suite que si la longueur du texte dans la cellule est strictement supérieure à votre limite.
 +  * ''%%{ print NR }%%'' : permet d'afficher uniquement le numéro de la ligne concernée. Dans l'exemple, nous affichons également le nombre de caractères ''%%length($col)%%''
  
 ===== Trouver les doublons ===== ===== Trouver les doublons =====
  
 ==== 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 103: Ligne 128:
 apparaître avec un texte rouge. apparaître avec un texte rouge.
  
-===== Affichage/Extraction de lignes contenant une chaine particulière =====+===== 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 chaîne particulière =====
  
 Par exemple, pour extraire les lignes du fichier ''synthese.csv'' contenant  Par exemple, pour extraire les lignes du fichier ''synthese.csv'' contenant 
Ligne 110: Ligne 141:
 utiliser les commandes suivantes : utiliser les commandes suivantes :
 <code bash> <code bash>
 +# Extraction de la ligne des entêtes de colonne :
 head -1 synthese.csv > synthese.problems.csv head -1 synthese.csv > synthese.problems.csv
 +# Recherche via RegExp :
 grep -P ' Stéphane\t\tpointage' synthese.csv >> synthese.problems.csv grep -P ' Stéphane\t\tpointage' synthese.csv >> synthese.problems.csv
 +# Recherche d'un texte 100% littéral (pas de regexp) :
 +grep -F " - Téléphérique de l'Aiguille du Midi. Gare intermédiaire.  Abords de la gare. \nLa zone parcouru" synthese.csv >> synthese.problems.csv
 </code> </code>
 +
 +===== Affichage/Extraction des numéros de ligne contenant une chaîne particulière =====
 +<code bash>
 +# Recherche via RegExp :
 +grep -nP ' Stéphane\t\tpointage' synthese.csv | cut -d: -f1
 +# Recherche d'un texte 100% littéral (pas de regexp) :
 +grep -nF " - Téléphérique de l'Aiguille du Midi. Gare intermédiaire.  Abords de la gare. \nLa zone parcouru" synthese.csv | cut -d: -f1
 +</code>
 +  * ''-n'' (//Line number//) : Demande à grep d'afficher le numéro de la ligne avant le texte (ex: 45231: - Téléphérique...).
 +  * ''%% | cut -d: -f1 %%'' : permet de garder seulement le numéro de ligne.
 +  * Pour rediriger vers un fichier ajouter à la fin ''%%> synthese.pattern-lines.txt%%''
  
 ==== Commandes d'extractions (TSV) ==== ==== Commandes d'extractions (TSV) ====
Ligne 133: Ligne 179:
 <code bash> cut --complement -f 36-37 synthese.csv > synthese.cuted.csv </code> <code bash> cut --complement -f 36-37 synthese.csv > synthese.cuted.csv </code>
  
-===== Remplacement de chaine =====+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>
  
-Pour remplacer une chaine dans un fichier texte donnée, il est possible d'utiliser+**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 chaîne ===== 
 + 
 +=== Remplacement de chaîne courte === 
 +Pour remplacer une chaîne dans un fichier texte donnée, il est possible d'utiliser
 ''sed'' avec l'option ''-i''. ''sed'' avec l'option ''-i''.
 Par exemple, pour remplacer '' Stéphane\t\tpointage'' par '' Stéphane\tpointage'' Par exemple, pour remplacer '' Stéphane\t\tpointage'' par '' Stéphane\tpointage''
Ligne 143: Ligne 197:
 </code> </code>
  
-Remplacement multi-lignes (option ''-z'' de //sed//) :+=== Remplacement de chaîne longue === 
 +Remplacement de grande chaîne de texte avec Perl : 
 +<code bash> 
 +# Texte actuel 
 +export OLD="La zone parcourue se situe dans le secteur de contact du granite du Mont-Blanc et des gneiss du sous-bassement du massif, d'où la présence sur le socle de gneiss de nombreux blocs de granite venus des sommets, épars ou sous forme de moraines. Le glacier des Pèlerins, recouvert de blocs dans sa partie aval, est relativement statique et ne marque pas à l'heure actuelle un \"\"recul\"\" caractéristique, en comparaison avec d'autres glaciers proches. 
 +# Nouveau texte 
 +export NEW="Au contact du granite du Mont-Blanc et du socle de gneiss, la zone est jonchée de blocs granitiques venus des sommets (épars ou en moraines). Couvert de blocs en aval, le glacier des Pèlerins reste relativement statique : contrairement aux glaciers voisins, il ne marque actuellement aucun recul caractéristique." 
 +# Remplacement 
 +mv synthese.csv synthese.save.csv && perl -pe 's/\Q$ENV{OLD}\E/$ENV{NEW}/g' synthese.save.csv > synthese.csv 
 +</code> 
 +  * ''\Q'' et ''\E'' (//Quotemeta//) : ordonne à Perl de traiter tout le texte comme du texte littéral. 
 +  * Très rapide car Perl lit une ligne, la modifie si besoin, et l'écrit immédiatement dans le nouveau fichier. 
 + 
 +=== Remplacement multi-lignes === 
 +Remplacement multi-lignes avec Sed (option ''-z'' de //sed//) :
 <code bash> <code bash>
 # Remplacement des retours charriot (CR) suivi de retour à la ligne (LF) (si erreur INT_MAX, voir ci-dessous) # Remplacement des retours charriot (CR) suivi de retour à la ligne (LF) (si erreur INT_MAX, voir ci-dessous)
Ligne 151: Ligne 219:
 </code> </code>
  
 +Remplacement multi-lignes avec Awk (rassembler 2 lignes successives) :
 +<code bash> 
 +# Exemple de texte de fin de ligne : anticlinal\n
 +awk '/anticlinal\\n$/ { printf "%s", $0; next } { print }' synthese.save.csv > synthese.csv
 +</code>
 +  * Ici la fin de ligne se termine par les caractères littérals ''\n''. Il faut protéger "\".
 +  * ''printf "%s", $0'' affiche la ligne courante contenant le pattern sans le caractère de fin de ligne et passe à la ligne suivante ''next''.
 +  * Si la ligne ne contient pas le pattern, elle est renvoyée tel quel.
 ===== Stats ===== ===== Stats =====
   * Date d'observation la plus ancienne : <code bash> csvstat -t -q '"' -u 0 -e "UTF-8" -c date_min --min synthese.csv </code>   * Date d'observation la plus ancienne : <code bash> csvstat -t -q '"' -u 0 -e "UTF-8" -c date_min --min synthese.csv </code>
Ligne 171: Ligne 247:
  
 # 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.1628000102.txt.gz
  • Dernière modification : 2021/08/03 14:15
  • de jpmilcent