La semaine dernière au boulot j'ai eu à traiter un fichier qui contenait 34 000 lignes. C'était un export provenant d'une base de données. La structure était du csv mais très particulière puisqu'un enregistrement était répartie sur 2 lignes avec un pseudo index. Le but était de garder la même structure et les mêmes champ sauf que chaque enregistrement devaient être sur 1 seul ligne. Bien sûr l'opération inverse devrait être réalisé.
Après pas mal de recherche j'ai décidé d'en faire un petit script histoire de le re-utiliser par la suite en adaptant le nombre de lignes et de champ par enregistrement.
#!/bin/bash
file="/tmp/artsub.txt"
export_file="/tmp/export_file.csv"
out_file="/tmp/out_file.csv"
line=1
nbline=`wc -l <$file`
i=1
# Transformation du fichier 2 lignes en 1 avec
# séparteur ;
if [ "$1" == "csv" ]
then
echo "Transformation du fichier en cours, merci de patienter"
while [ $i -lt $nbline ]
do
echo -n "."
line=$i
LIGNE1=`awk 'NR=='"$line"' { print $0 }' $file`
let "line+=1"
LIGNE2=`awk 'NR=='"$line"' { print $0 }' $file`
echo $LIGNE1";"$LIGNE2 >> $export_file
let "i+=2"
done
echo "Fichier $export_file créé"
fi
# Transformation du fichier 1 ligne au format
# csv sur 2 lignes
if [ "$1" == "export" ]
then
echo "Transformation du fichier, merci de patienter"
cat $export_file | while read line
do
echo -n "."
VAR1=`echo $line | cut -d ";" -f1`
VAR2=`echo $line | cut -d ";" -f2`
VAR3=`echo $line | cut -d ";" -f3`
VAR4=`echo $line | cut -d ";" -f4`
VAR5=`echo $line | cut -d ";" -f5`
VAR6=`echo $line | cut -d ";" -f6`
VAR7=`echo $line | cut -d ";" -f7`
VAR8=`echo $line | cut -d ";" -f8`
echo "$VAR1;$VAR2;$VAR3;$VAR4" >> $out_file
echo "$VAR5;$VAR6;$VAR7;$VAR8" >> $out_file
done
fi
if [ "$1" == "" ]
then
echo "Paramètre incorrecte"
echo "$0 csv : Transforme le fichier $file 2 lignes ligne en 1"
echo "$0 export : Transforme le fichier $export_file 1 ligne en 2 lignes pour l'importer dans X3"
exit 1
fi
exit 0