Bonjour à tous,
je vous soumet un travail sur lequel j'évolue :
Ce script est une base à un parseur de csv en bash,
il montre l'utilisation des tableaux et d'autres trucs glanés à droite et à gauche.
NB : il reste un zenity pour indiquer l'enregistrement
ROLE :
Il charge un fichier texte ligne par ligne dans un tableau
NB2 : les numéros de ligne commencent à 0
permet des actions sur ce fichier :
ajouter, insérer, supprimer, remplacer
Là où j'en suis :
Pour voir son fonctionnement je vous propose 3 fichiers
- un fichier à modifier (on va mettre csv 😉 ),
- le parseur (reader.sh)
- et un lanceur (pour voir comment reader.sh se lance)
pour tester
créer un dossier
mkdir parseur
cd parseur
créer les trois fichiers (copier / coller le texte d'en dessous)
touch, gedit, nano...
gedit test.csv
...
rendre les sh exécutable
chmod +x *.sh
tester :
./lanceur.sh
puis
cat test.csv
LES FICHIERS
le fichier texte
test.csv
0|un nom|une réf|une date|valeur|valeur1|valeur2|valeur3|valeur4
1|machine|7,456|'titi'|01/01/2010|45|67|45|67|45
2|gdfgdgf|7dgd456|jygjkg|'zaeaze'|'plein de quote"|et encore|45|67|45
3|kjfkj||||||||
4|gdfgdgf|7dgd456|jygjkg|zaeaze|"encore du texte"|et encore|45|67|45
5|tete|123,12346|titi|20/03/2017|100|200|300|400|500 600
6|poiuytr|4679|nini|10/04/2021|un nom|un autre|le troise|leu cat|et de cinq
7|leu set...
le programme
reader.sh
#!/bin/bash
# ----------------------------------------------
nomlogiciel="${0##*/}"
FONCTION="charge un fichier texte ligne par ligne dans un tableau
permet des actions sur ce fichier :
ajouter, insérer, supprimer, remplacer"
VERSION="0.002"
# NOTES DE VERSIONS
#
# ----------------------------------------------
echo "
# ----------------------------------------------
lancement $nomlogiciel...
# ----------------------------------------------
" ;
# décommenter pour activer
# MODE_DEBUG=1
function MsgBox () { # texte
zenity --info --text="$@" ;
}
function infos () {
echo "Aucun argument à votre demande
${0##*/}
${FONCTION}
Utilisation :
$0 -f fichier [-a-i-s-r-e] OPTIONS
$0 -f fichier1 [-x] fichier2
a) ajouter Ligne
-a texte_à_ajouter
i) inserer Ligne
-i numéro texte_à_insérer
s) supprimer Ligne
-s numéro_Ligne
r) remplacer Ligne
-r numéro texte_à_ajouter
e) echanger Ligne1 par Ligne2
-e numéro numéro
x) executerFichierScript
-x fichier
"
exit 1
}
# manque arguments informations
[[ ${#@} -lt 1 ]] && infos
[[ ${#@} -lt 1 ]] || echo -e "argument passés : \n$@\n"
# [[ -n "$@" ]] && MsgBox "$@" || infos
# ----------------------------------------------
leFICHIER="" ;
# ToutesLesLignes
declare -a ToutesLesLignes ; # ToutesLesLignes=[] ;
numLigneCourante=0 ;
declare -a txtLigneCourante ; # txtLigneCourante=[] ;
declare -a txtTemp ; # txtTemp=[] ;
declare -a tete ; # tete=[] ;
function chargerFichierDanslesLignes () { # fichier : /dossier/mon_fichier.extension
IFS=$'\n' ;
local leTexte="$(cat "${@}")" ;
ToutesLesLignes=( $leTexte ) ;
}
# ----------------------------------------------
# -a
function ajouterLigne () { # texte à ajouter au tableau
ToutesLesLignes[${#ToutesLesLignes[@]}]="$@" ;
# ou
# ToutesLesLignes=( ${ToutesLesLignes[@]} "$@" ) ;
}
# -i
function insererUneLigne () { # "n° texte à insérer"
local a=${@%% *}
local b=${@#* }
local arr=()
for ((i=0;i<${a};i++)); do
arr+=(${ToutesLesLignes[$i]})
done
arr+=($b)
for ((i=${a};i<=$(expr ${#ToutesLesLignes[@]} - 1);i++)); do
arr+=(${ToutesLesLignes[$i]})
done
ToutesLesLignes=(${arr[@]})
}
# -s
function supprimerUneLigne () { # par numéro Ligne
unset ToutesLesLignes[$@] ;
}
# -r
function remplacerUneLigne () { # num et texte à ajouter au tableau
local a=${@%% *}
local b=${@#* }
ToutesLesLignes[$a]=""
ToutesLesLignes+=([$a]="$b") ;
}
# -e
function echangerLigne1parLigne2 () {
local L1
local L2
local a=${@%% *}
local b=${@#* }
L1="${ToutesLesLignes[$a]}"
L2="${ToutesLesLignes[$b]}"
ToutesLesLignes[$b]="$L1"
ToutesLesLignes[$a]="$L2"
}
# ----------------------------------------------
# -c
function executerFichierScript () {
# echo "TODO executerFichierScript"
MsgBox "TODO executerFichierScript"
}
# ----------------------------------------------
function parser_arguments {
case $@ in
-f=*|--fichier=*)
leFICHIER="${@#*=}"
chargerFichierDanslesLignes "${leFICHIER}"
;;
-a=*|--ajouterLigne=*) # texte à ajouter au tableau
ajouterLigne "${@#*=}"
;;
-i=*|--insererUneLigne=*) # "n°" "texte à insérer"
insererUneLigne "${@#*=}"
;;
-s=*|--supprimerUneLigne=*) # par numéro Ligne
supprimerUneLigne "${@#*=}"
;;
-r=*|--remplacerUneLigne=*) # num et texte à ajouter au tableau
remplacerUneLigne "${@#*=}"
;;
-e=*|--echangerLigne1parLigne2=*)
echangerLigne1parLigne2 "${@#*=}"
;;
-x=*|--executerFichierScript=*)
executerFichierScript "${@#*=}"
;;
-h|-?)
infos
exit 1
;;
-*)
# MsgBox "${@#*=}"
echo "${i} : option invalide : ${@#*=}"
exit 1
;;
esac
}
function reader-arg () {
for i in "$@"
do
# echo -e "i :\n$i"
parser_arguments "$i"
done
}
reader-arg "$@"
function composerFichierSortie () {
local ligneEC
IFS=$'\n' ;
for ligneEC in ${ToutesLesLignes[@]}
do
echo ${ligneEC} ;
done
}
function sauverFichier () {
composerFichierSortie | tee "$@" ;
}
[ $MODE_DEBUG ] && {
# POUR VERIF
echo "***********************************************************"
# echo "MODE_DEBUG ON"
composerFichierSortie ;
echo "***********************************************************"
} || {
sauverFichier "${leFICHIER}"
MsgBox "fichier sauvé"
# echo "MODE_DEBUG OFF"
}
exit 0
un lanceur
lanceur.sh
#!/bin/bash
# ----------------------------------------------
nomlogiciel="${0##*/}"
FONCTION=""
VERSION="alpha"
# NOTES DE VERSIONS
# ----------------------------------------------
echo "lancement $nomlogiciel..." ;
# FICHIER=""
# cp $FICHIER "test.csv"
FICHIER="test.csv"
AJOUT="ce texte à été ajouté"
INSERT="ce texte a été insérer"
REMPLACE="ce texte remplace la ligne d'origine"
ECHANGE="1 3"
# un par un
# ./reader.sh -f="$FICHIER" -a="${AJOUT}"
# ./reader.sh -f="$FICHIER" -i="5 ${INSERT}"
# ./reader.sh -f="$FICHIER" -r="7 ${REMPLACE}"
# ./reader.sh -f="$FICHIER" -e="${ECHANGE}" ;
# en une seule passe
./reader.sh -f="$FICHIER" -a="${AJOUT}" -i="5 ${INSERT}" -r="7 ${REMPLACE}" -e="${ECHANGE}" ;
exit 0
le fichier modifié devient :
0|un nom|une réf|une date|valeur|valeur1|valeur2|valeur3|valeur4
3|kjfkj||||||||
2|gdfgdgf|7dgd456|jygjkg|'zaeaze'|'plein de quote"|et encore|45|67|45
1|machine|7,456|'titi'|01/01/2010|45|67|45|67|45
4|gdfgdgf|7dgd456|jygjkg|zaeaze|"encore du texte"|et encore|45|67|45
ce texte a été insérer
5|tete|123,12346|titi|20/03/2017|100|200|300|400|500 600
ce texte remplace la ligne d'origine
7|leu set...
ce texte à été ajouté