script shell pour ajouter du texte dans des fichiers csv en fonction de contraintes


1

Dans mon projet, j'ai tellement de fichiers nommés “config.csv”. Mon exigence est d'ajouter une configuration à la fin du fichier en fonction de certaines contraintes.

- Get All config.csv files across the project.
- The config.csv should have 7 columns.
- Add if the property does not exist then add one at the end of the file.
- Sometimes there might be a new line character at the end. sometimes there might not be.

La propriété ressemble à ceci.

1/1/1970,,propertyName,"Description of the Config","false",,1

Comment puis-je écrire un script pour accomplir cette tâche?

Clause de non-responsabilité: je suis nouveau dans le domaine des scripts et souhaite automatiser le processus de cette tâche autant que possible.

Réponses:


1

Créez les fichiers suivants:

add_conf.awk:

BEGIN {FS=","}
NF!=7 {bad=1; exit 1}
      {print}
END   {if (!bad) print "1/1/1970,,propertyName,\"Description of the Config\",\"false\",,1"}

add_conf.sh:

#!/bin/sh
tempfile=$(mktemp)

for f
do
        if awk -f add_conf.awk "$f" > "$tempfile"
        then
                cp "$tempfile" "$f"
        fi
done

rm "$tempfile"

et fait chmod +x add_conf.sh. (Bien sûr, vous pouvez mettre ces fichiers quelque part autre que le répertoire courant; ajustez simplement les références de nom de fichier en conséquence.

find . -name config.csv -type f -exec ./add_conf.sh {} +

le find commande trouvera tous les fichiers simples nommés config.csv et passer leurs noms (chemin) à add_conf.sh. Ce script invoque awk sur chacun des fichiers, écrire la sortie dans un fichier temporaire. Si la awk le processus signale le succès, le script copie ensuite la sortie sur le fichier d'entrée.

le awk scénario, add_conf.awk, définit le séparateur de champs (FS) sur virgule (ce qui est une chose évidente à faire s’il s’agit d’un fichier séparé par des virgules). Si elle rencontre une ligne comportant moins de sept champs (séparés par des virgules), il définit le bad drapeau et sorties avec le statut 1, de sorte que le script shell verra que ce fichier n'est pas éligible et le laisserai seul. Sinon, chaque ligne d'entrée est imprimée dans le fichier de sortie (temporaire). Il ajoutera une nouvelle ligne à la dernière ligne, si nécessaire. Ensuite, si le fichier était OK jusqu'à la fin, ajoutez la nouvelle ligne de données.

Remarques:

  • Ce qui précède est écrit pour GNU awk. POSIX awk ne spécifie pas le comportement des données d'entrée ne se terminant pas par une nouvelle ligne, et il ne supporte pas le exit commander.
  • J'ai ignoré ta troisième balle, “ si la propriété n'existe pas puis ajoutez-en un à la fin du fichier. ” Il peut probablement être ajouté facilement si vous précisez ce que vous voulez dire.

que se passe-t-il lorsque "Description de la configuration" comporte des virgules?
codefreak

@codefreak: Strictement parlant, je ne sais pas comment cette serait important, mais je pense que vous vous demandez réellement: "Et si l'une des données préexistantes du fichier comporte une virgule dans une valeur?" Et c’est un argument valable: le moteur de division de champs d’Awk n’est pas assez intelligent pour gérer cela correctement, alors NF n'aura pas la "bonne" valeur, et donc des tests basés sur NF peut donner des résultats incorrects. awk n’est pas un outil parfait pour traiter les données CSV.
G-Man

"Que se passe-t-il si une des données préexistantes dans le fichier comporte une virgule dans une valeur?" c'est exactement ce que je voulais dire. Le meilleur moyen pour @ FurqanShaikh est peut-être d'utiliser un outil d'analyse syntaxique ou un langage de script tel que python / ruby
codefreak
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.