#1 Le 14/12/2011, à 14:10
- csm
[resolu] Injecter du contenu d'un fichier à l'autre
Bonjour.
Je dispose d'un script shell qui me permet de transformer les balises d'un fichier csv en balises latex pour tableau.
#!/bin/bash
while read
do
REPLY=${REPLY//\"/}
Fichier+=( "${REPLY//,/ & }" )
done < $1
printf '%s\\\\ \\hline\n' "${Fichier[@]}" > $2
exit 0
Il fonctionne à peu près correctement. Si ce n'est qu'il rajoute des \\ \hline même sur les lignes vides, mais passons...
je souhaiterais ensuite que le script injecte des morceaux du fichier dans un autre fichier. Voici un extrait du fichier de données sources :
"2.3.1"
""," "," s01"," s02"," s03"," s04"," s05"," s06"," Se"
"Bn agr&al."," b01",17952,0,7206,0,0,0,25159
"Bn&Sv loc."," b02",4699,0,2683,0,0,0,7382
"Energie"," b03",1931,0,122,0,0,0,2053
"Bn&Sv bat."," b04",14405,0,0,0,0,0,14405
"Sv distr."," b05",0,522,0,0,0,0,522
"Sv transp."," b06",0,13841,0,0,0,0,13841
"Sv hab."," b07",0,0,0,45755,0,0,45755
"Sv loisirs"," b08",0,0,2458,0,12406,0,14863
"Div. Sv ma"," b09",0,0,0,0,0,11859,11859
"Bn exog."," b11",0,0,7633,0,0,0,7633
"Sv exog."," b12",0,0,0,0,0,0,0
"Total Bn & Sv"," B",38987,14363,20102,45755,12406,11859,143471
"Rev. trav."," p11",0,0,0,0,0,0,0
"Rev. propr."," p12",0,0,0,0,0,0,0
"Cotis. soc."," p21",0,0,0,0,0,0,0
"Prest. soc."," p22",0,0,0,0,0,0,0
"Impots"," p31",0,0,0,0,0,0,0
"Subvent."," p32",751,251,251,411,489,33,2186
"Tr. adm."," p34",0,0,0,0,0,0,0
"Tr. ass."," p41",0,0,0,0,0,0,0
"Tr. cour."," p42",0,0,0,0,0,0,0
"Tr. inv."," p43",0,0,0,0,0,0,0
"Cr. ou De."," p50",6554,6880,0,13472,1006,2612,30523
"Total op. rép."," P",7304,7131,251,13882,1495,2645,32709
"Total gén."," B+P",46291,21494,20354,59637,13901,14504,176180
"2.3.2"
""," s07"," s08"," Sa"," s09"," s10"," Sm"," s11"," TT"
" b01",0,0,0,0,0,0,2495,27653
" b02",0,0,0,0,0,0,5367,12749
" b03",0,0,0,0,0,0,3381,5435
" b04",0,0,0,0,0,0,1058,15463
" b05",0,0,0,0,0,0,2744,3266
" b06",0,0,0,0,0,0,333,14173
" b07",0,0,0,0,0,0,1315,47070
" b08",0,0,0,0,0,0,2376,17239
" b09",0,0,0,0,0,0,21634,33492
" b11",0,0,0,0,0,0,47828,55461
" b12",0,0,0,0,0,0,15129,15129
" B",0,0,0,0,0,0,103658,247129
" p11",0,0,0,31665,0,31665,0,31665
" p12",0,0,0,36541,0,36541,0,36541
" p21",0,0,0,0,0,0,20330,20330
" p22",0,0,0,20400,0,20400,0,20400
" p31",0,0,0,0,0,0,22945,22945
" p32",48,0,48,0,0,0,0,2234
" p34",0,25774,25774,0,0,0,0,25774
" p41",0,0,0,0,0,0,1527,1527
" p42",0,0,0,0,106358,106358,11604,117962
" p43",0,0,0,0,0,0,0,0
" p50",1708,0,1708,0,0,0,2590,34820
" P",1756,25774,27529,88605,106358,194963,58996,314198
" B+P",1756,25774,27529,88605,106358,194963,162654,561327
Il contient un en-tête numérique (2.1.1, 2.1.2.... 3.4.1, etc.) qui permet d'identifier le bloc de données.
D'autre part j'ai un fichier où les données doivent être injectées de type :
Blablabla
%2.3.1%
blablablabla
%2.3.2%
etc.
Ce qui permet d'identifier le bloc, c'est donc le %2.3.2% (les signes pourcentages servant juste à distinguer le bloc par rapport aux titres des chapitres, qui sont eux aussi 2.3.2 - sans pourcentage).
Comment d'injecter automatiquement les données dans le fichier cible (en supprimant au passage la ligne 2.3.1 du fichier source et le %2.3.1% du fichier cible) ? (en un seul script qui ferait tout de préférence : transformer balises csv -> balises latex -> injecter le code ainsi produit)
Merci de vos conseils avisés !
Dernière modification par csm (Le 19/12/2011, à 00:44)
Hors ligne
#2 Le 14/12/2011, à 16:21
- AnsuzPeorth
Re : [resolu] Injecter du contenu d'un fichier à l'autre
Bjr,
Encore avec le même exercice ? Toujours pas à bout ...
Voilà ma façon de faire (fullbash ...)
#!/bin/bash
f_source='/home/data'
f_tmpl='morceau 1=> 2.3.1:
%2.3.1%
morceau 2=> 2.3.2:
%2.3.2%
'
declare -A ARRAY
while read line
do
[[ "$line" = "" ]] && continue
line=${line//\"/}
line=${line//&/\\&} # echappement des &, je sais pas si necessaire ?
line=${line//,/ & }
[[ "$line" =~ ^[0-9]\.[0-9] ]] && index=$line && continue
ARRAY[$index]+=${line}'\\\\ \\hline'\\n
done < $f_source
while read line
do
[[ "$line" =~ ^%[0-9]\.[0-9] ]] && {
index=${line//%/}
echo -e "${ARRAY[$index]}"
continue
}
echo $line
done <<< "$f_tmpl"
exit
morceau 1=> 2.3.1:
& & s01 & s02 & s03 & s04 & s05 & s06 & Se\\ \hline
Bn agr\&al. & b01 & 17952 & 0 & 7206 & 0 & 0 & 0 & 25159\\ \hline
Bn\&Sv loc. & b02 & 4699 & 0 & 2683 & 0 & 0 & 0 & 7382\\ \hline
Energie & b03 & 1931 & 0 & 122 & 0 & 0 & 0 & 2053\\ \hline
Bn\&Sv bat. & b04 & 14405 & 0 & 0 & 0 & 0 & 0 & 14405\\ \hline
Sv distr. & b05 & 0 & 522 & 0 & 0 & 0 & 0 & 522\\ \hline
Sv transp. & b06 & 0 & 13841 & 0 & 0 & 0 & 0 & 13841\\ \hline
Sv hab. & b07 & 0 & 0 & 0 & 45755 & 0 & 0 & 45755\\ \hline
Sv loisirs & b08 & 0 & 0 & 2458 & 0 & 12406 & 0 & 14863\\ \hline
Div. Sv ma & b09 & 0 & 0 & 0 & 0 & 0 & 11859 & 11859\\ \hline
Bn exog. & b11 & 0 & 0 & 7633 & 0 & 0 & 0 & 7633\\ \hline
Sv exog. & b12 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ \hline
Total Bn \& Sv & B & 38987 & 14363 & 20102 & 45755 & 12406 & 11859 & 143471\\ \hline
Rev. trav. & p11 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ \hline
Rev. propr. & p12 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ \hline
Cotis. soc. & p21 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ \hline
Prest. soc. & p22 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ \hline
Impots & p31 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ \hline
Subvent. & p32 & 751 & 251 & 251 & 411 & 489 & 33 & 2186\\ \hline
Tr. adm. & p34 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ \hline
Tr. ass. & p41 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ \hline
Tr. cour. & p42 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ \hline
Tr. inv. & p43 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ \hline
Cr. ou De. & p50 & 6554 & 6880 & 0 & 13472 & 1006 & 2612 & 30523\\ \hline
Total op. rép. & P & 7304 & 7131 & 251 & 13882 & 1495 & 2645 & 32709\\ \hline
Total gén. & B+P & 46291 & 21494 & 20354 & 59637 & 13901 & 14504 & 176180\\ \hline
morceau 2=> 2.3.2:
& s07 & s08 & Sa & s09 & s10 & Sm & s11 & TT\\ \hline
b01 & 0 & 0 & 0 & 0 & 0 & 0 & 2495 & 27653\\ \hline
b02 & 0 & 0 & 0 & 0 & 0 & 0 & 5367 & 12749\\ \hline
b03 & 0 & 0 & 0 & 0 & 0 & 0 & 3381 & 5435\\ \hline
b04 & 0 & 0 & 0 & 0 & 0 & 0 & 1058 & 15463\\ \hline
b05 & 0 & 0 & 0 & 0 & 0 & 0 & 2744 & 3266\\ \hline
b06 & 0 & 0 & 0 & 0 & 0 & 0 & 333 & 14173\\ \hline
b07 & 0 & 0 & 0 & 0 & 0 & 0 & 1315 & 47070\\ \hline
b08 & 0 & 0 & 0 & 0 & 0 & 0 & 2376 & 17239\\ \hline
b09 & 0 & 0 & 0 & 0 & 0 & 0 & 21634 & 33492\\ \hline
b11 & 0 & 0 & 0 & 0 & 0 & 0 & 47828 & 55461\\ \hline
b12 & 0 & 0 & 0 & 0 & 0 & 0 & 15129 & 15129\\ \hline
B & 0 & 0 & 0 & 0 & 0 & 0 & 103658 & 247129\\ \hline
p11 & 0 & 0 & 0 & 31665 & 0 & 31665 & 0 & 31665\\ \hline
p12 & 0 & 0 & 0 & 36541 & 0 & 36541 & 0 & 36541\\ \hline
p21 & 0 & 0 & 0 & 0 & 0 & 0 & 20330 & 20330\\ \hline
p22 & 0 & 0 & 0 & 20400 & 0 & 20400 & 0 & 20400\\ \hline
p31 & 0 & 0 & 0 & 0 & 0 & 0 & 22945 & 22945\\ \hline
p32 & 48 & 0 & 48 & 0 & 0 & 0 & 0 & 2234\\ \hline
p34 & 0 & 25774 & 25774 & 0 & 0 & 0 & 0 & 25774\\ \hline
p41 & 0 & 0 & 0 & 0 & 0 & 0 & 1527 & 1527\\ \hline
p42 & 0 & 0 & 0 & 0 & 106358 & 106358 & 11604 & 117962\\ \hline
p43 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ \hline
p50 & 1708 & 0 & 1708 & 0 & 0 & 0 & 2590 & 34820\\ \hline
P & 1756 & 25774 & 27529 & 88605 & 106358 & 194963 & 58996 & 314198\\ \hline
B+P & 1756 & 25774 & 27529 & 88605 & 106358 & 194963 & 162654 & 561327\\ \hline
PS: Un saut de ligne est ajouté, il faudra peut etre le supprimer ?
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#3 Le 16/12/2011, à 17:59
- csm
Re : [resolu] Injecter du contenu d'un fichier à l'autre
Merci pour cet exemple et pardon pour le retard avec lequel je vous réponds. Il semble que votre script imprime le résultat dans le terminal. La question était justement de l'insérer dans un autre fichier à un emplacement donné.
Si le fichier où les blocs doivent être insérés s'appelle ch3.v1a7.tex, il faudrait que le script insère le bloc 2.3.1 à l'emplacement où est écrit %2.3.1% dans le fichier ch3.v1a7.tex. On a donc deux fichier (sources.csv et ch3.v1a7.tex) plus le script chargé de transformer les sources et de les injecter dans le fichier ch3.v1a7.tex.
Sans doute me suis-je mal fait comprendre !
ch3.v1a7.tex
BlablablaBlablablaBlablablaBlablabla
BlablablaBlablablaBlablablaBlablabla
BlablablaBlablablaBlablablaBlablabla
\begin{spacing}{0.8}\footnotesize{
\begin{tabular}{|l|c|rrrrrr|r|}
%2.3.1%
\end{tabular}}\end{spacing}\normalsize
BlablablaBlablablaBlablablaBlablabla
BlablablaBlablablaBlablablaBlablabla
BlablablaBlablablaBlablablaBlablabla
\begin{spacing}{0.8}\footnotesize{
\begin{tabular}{|l|c|rrrrrr|r|}
%2.3.2%
\end{tabular}}\end{spacing}\normalsize
BlablablaBlablablaBlablablaBlablabla
BlablablaBlablablaBlablablaBlablabla
BlablablaBlablablaBlablablaBlablabla
BlablablaBlablablaBlablablaBlablabla
Merci de votre assistance !
Dernière modification par csm (Le 16/12/2011, à 18:00)
Hors ligne
#4 Le 17/12/2011, à 12:22
- AnsuzPeorth
Re : [resolu] Injecter du contenu d'un fichier à l'autre
J'avais juste donné l'exemple, il fallait interpréter pour toi ...
#!/bin/bash
f_source='/home/data'
f_tmpl='/home/ch3.v1a7.tex'
declare -A ARRAY
while read line
do
[[ "$line" = "" ]] && continue
line=${line//\"/}
line=${line//&/\\&} # echappement des &, je sais pas si necessaire ?
line=${line//,/ & }
[[ "$line" =~ ^[0-9]\.[0-9] ]] && index=$line && continue
ARRAY[$index]+=${line}'\\\\ \\hline'\\n
done < "$f_source"
while read line
do
[[ "$line" =~ ^%[0-9]\.[0-9] ]] && {
index=${line//%/}
echo -e "${ARRAY[$index]}"
continue
}
echo $line
done < "$f_tmpl"
exit
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#5 Le 17/12/2011, à 14:40
- csm
Re : [resolu] Injecter du contenu d'un fichier à l'autre
Merci, j'ai juste modifié l'avant dernière ligne pour obtenir le résultat
#!/bin/bash
f_source='sources'
f_tmpl='ch3.v1a7.tex'
f_final='final.tex'
declare -A ARRAY
while read line
do
[[ "$line" = "" ]] && continue
line=${line//\"/}
line=${line//&/\\&} # echappement des &, je sais pas si necessaire ?
line=${line//,/ & }
[[ "$line" =~ ^[0-9]\.[0-9] ]] && index=$line && continue
ARRAY[$index]+=${line}'\\\\ \\hline'\\n
done < "$f_source"
while read line
do
[[ "$line" =~ ^%[0-9]\.[0-9] ]] && {
index=${line//%/}
echo -e "${ARRAY[$index]}"
continue
}
echo $line
done < "$f_tmpl" >> "$f_final"
exit
Petit question subsidiaire : est-il possible de lui demander d'aller chercher les valeurs de f_source, f_tmpl et f_final dans un fichier externe que l'on nommerait "indic" (par exemple) et qui ne contiendrait donc que le nom des fichiers à traiter ? Ce script va beaucoup m'aider vu la masse de données qu'il me faut traiter.
Merci de votre aide précieuse.
Dernière modification par csm (Le 17/12/2011, à 14:41)
Hors ligne
#6 Le 17/12/2011, à 16:37
- AnsuzPeorth
Re : [resolu] Injecter du contenu d'un fichier à l'autre
Ce script va beaucoup m'aider vu la masse de données qu'il me faut traiter.
Fallait le dire de suite, je te l'aurais fait en python, bcp plus rapide et solide que bash ... Enfin, c'est fait, si ca te convient et que t'es pas à 2 mn pret ...
Sinon, pour partir d'un fichier avec les noms nécessaires(tu aurais pu chercher un peu qd même )
#!/bin/bash
CreateFile() {
declare -A ARRAY
while read line
do
[[ "$line" = "" ]] && continue
line=${line//\"/}
line=${line//&/\\&} # echappement des &, je sais pas si necessaire ?
line=${line//,/ & }
[[ "$line" =~ ^[0-9]\.[0-9] ]] && index=$line && continue
ARRAY[$index]+=${line}'\\\\ \\hline'\\n
done < "$f_source"
while read line
do
[[ "$line" =~ ^%[0-9]\.[0-9] ]] && {
index=${line//%/}
echo -e "${ARRAY[$index]}"
continue
}
echo $line
done < "$f_tmpl" >> "$f_final"
}
while read f_source f_tmpl f_final
do
CreateFile
done < indic
exit
Attention au fichier indic, il devra peut être avoir une ligne vide en dernier, while sur un fichier ne lit pas la dernière ligne, parfois ... (enfin, j'ai jamais vraiment regarder pourquoi comment !)
Il faudra donc dans ce fichier, les 3 noms de fichiers par ligne
EDIT:
j'avais pas bien lu ton intervention, si tu veux ecraser le f_tmpl, il faudra faire légèrement différent.
C'est à dire, charger le fichier dans une variable, boucler sur cette variable pour pouvoir réecrire le fichier.
Dernière modification par AnsuzPeorth (Le 17/12/2011, à 16:51)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#7 Le 17/12/2011, à 17:46
- pingouinux
Re : [resolu] Injecter du contenu d'un fichier à l'autre
Salut,
while sur un fichier ne lit pas la dernière ligne, parfois ...
Il me semble que read renvoie faux si la dernière ligne ne se termine pas par '\n'.
Hors ligne
#8 Le 17/12/2011, à 22:31
- csm
Re : [resolu] Injecter du contenu d'un fichier à l'autre
Je vous remercie pour cette ultime correction !
J'ai, selon vos indications, crée le fichier indic. Par contre, la ligne vide à la fin provoquait une erreur qui n'empêchait pas le script de faire son travail.
./AnP.sh: ligne 3: : Aucun fichier ou dossier de ce type
./AnP.sh: ligne 3: : Aucun fichier ou dossier de ce type
Je l'ai donc supprimé et désormais tout fonctionne à merveille. Sans doute en python le traitement aurait été plus rapide, mais ce sera bien suffisant et, comme vous disiez, je ne suis pas à quelques minutes près.
Avec tous mes remerciements !
Edit : Peut-être devrais-je créer un nouveau fil de discussion, mais si par hasard je souhaitais rajouter des conditions (des if donc) pour certaines opérations, comment devrais-je procéder ?
Si je souhaite que \hline n'apparaisse qu'à la fin de la ligne précédant une ligne contenant le mot "Total" et sur la ligne où se trouve "Total". C'est-à-dire :
....
Sv loisirs & b08 & 0 & 0 & 2458 & 0 & 12406 & 0 & 14863\\[-2pt]
Div. Sv ma & b09 & 0 & 0 & 0 & 0 & 0 & 11859 & 11859\\[-2pt]
Bn exog. & b11 & 0 & 0 & 7633 & 0 & 0 & 0 & 7633\\[-2pt]
Sv exog. & b12 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\[-2pt] \hline
Total Bn \& Sv & B & 38987 & 14363 & 20102 & 45755 & 12406 & 11859 & 143471\\[-2pt] \hline
Rev. trav. & p11 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\[-2pt]
Rev. propr. & p12 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\[-2pt]
Cotis. soc. & p21 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\[-2pt]
....
Cela se fait-il facilement en shell script ?
#!/bin/bash
CreateFile() {
declare -A ARRAY
while read line
do
[[ "$line" = "" ]] && continue
line=${line//\"/}
line=${line//&/\\&} # echappement des &, je sais pas si necessaire ?
line=${line//,/ & }
[[ "$line" =~ ^[0-9]\.[0-9] ]] && index=$line && continue
ARRAY[$index]+=${line}'\\\\[-2pt] \\hline'\\n
done < "$f_source"
while read line
do
[[ "$line" =~ ^%[0-9]\.[0-9] ]] && {
index=${line//%/}
echo -e "${ARRAY[$index]}"
continue
}
echo $line
done < "$f_tmpl" >> "$f_final"
}
while read f_source f_tmpl f_final
do
CreateFile
done < indic
exit
Dernière modification par csm (Le 17/12/2011, à 23:35)
Hors ligne
#9 Le 18/12/2011, à 01:46
- AnsuzPeorth
Re : [resolu] Injecter du contenu d'un fichier à l'autre
@pingouinux
Merci d'avoir confirmé / expliqué
Si je souhaite que \hline n'apparaisse qu'à la fin de la ligne précédant une ligne contenant le mot "Total" et sur la ligne où se trouve "Total".
Tu en as encore beaucoup comme ça ... Autant y aller franco plutot que de devoir ajouter des rustines à chaque fois. A force de rustine, ça ressemblera à plus rien !
Pour faire ça, j'ai ajouté le saut de ligne au début plutôt qu' à la fin. Ca permet, si Total sur la ligne, d'ajouter à la précédente le \hline ainsi qu'à la ligne courante. Un petit flag obligatoire si 2 lignes avec Total se suivent.
Le mot Total est matché uniquement si il est en début de ligne (je pense que cela accélérera un peu le traitement plutôt que de chercher sur la ligne entière)
Le saut de ligne est supprimer également.
flag=false
declare -A ARRAY
#v_tmpl=$(< "$f_tmpl")
while read line
do
[[ "$line" = "" ]] && continue
line=${line//\"/}
line=${line//&/\\&}
line=${line//,/ & }
[[ "$line" =~ ^[0-9]\.[0-9] ]] && index=$line && continue
if [[ "$line" =~ ^Total ]]; then
if ! $flag; then ARRAY[$index]+=' \\hline'; fi
ARRAY[$index]+=\\n${line}'\\\\[-2pt] \\hline'
flag=true
else
ARRAY[$index]+=\\n${line}'\\\\[-2pt]'
flag=false
fi
done < $f_source
while read line
do
[[ "$line" =~ ^%[0-9]\.[0-9] ]] && {
index=${line//%/}
echo -e "${ARRAY[$index]:2}"
continue
}
echo $line
done < "$f_tmpl" >> "$f_final"
#done <<< "${v_tmpl}" >> "$f_tmpl"
Si tu veux écraser f_tmpl plutot que d'en écrire un autre (f_final), tu dé-commentes la variable v_tmpl et intervertit le commentaire done de la fin, mais travaille sur des copies
Dernière modification par AnsuzPeorth (Le 18/12/2011, à 01:47)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#10 Le 18/12/2011, à 21:24
- csm
Re : [resolu] Injecter du contenu d'un fichier à l'autre
J'ai selon votre exemple, adapté le script. Je travaille toujours sur des copies avec un système de version.
Je me rends bien compte que cela se fait par à-coup, ce qui n'est pas pratique. Je me rends compte au faire et à mesure que le script shell peut réaliser les ajustements que je dois autrement faire à la main, ce qui est très fastidieux !
Je viens de me rendre compte qu'il y a un "léger" problème : tous les \ qui figurent dans le fichier de structure "ch3.v1a7.tex" n'apparaissent plus dans le fichier final !
\begin{spacing}{0.8}\footnotesize{
\begin{tabular}{|l|c|rrrrrr|r|}
devient
begin{spacing}{0.8}footnotesize{
begin{tabular}{|l|c|rrrrrr|r|}
Du coup, évidemment, le code ne compile plus en latex.
#!/bin/bash
flag=false
CreateFile() {
declare -A ARRAY
while read line
do
[[ "$line" = "" ]] && continue
line=${line//\"/}
line=${line//&/\\&}
line=${line//,/ & }
[[ "$line" =~ ^[0-9]\.[0-9] ]] && index=$line && continue
if [[ "$line" =~ ^Total ]]; then
if ! $flag; then ARRAY[$index]+=' \\hline'; fi
ARRAY[$index]+=\\n${line}'\\\\ \\hline'
flag=true
else
ARRAY[$index]+=\\n${line}'\\\\[-2pt]'
flag=false
fi
done < $f_source
while read line
do
[[ "$line" =~ ^%[0-9]\.[0-9] ]] && {
index=${line//%/}
echo -e "${ARRAY[$index]:2}"
continue
}
echo $line
#done < "$f_tmpl" >> "$f_final"
done < "$f_tmpl" >> "$f_final"
}
while read f_source f_tmpl f_final
do
CreateFile
done < indic
exit
Hors ligne
#11 Le 18/12/2011, à 22:15
- AnsuzPeorth
Re : [resolu] Injecter du contenu d'un fichier à l'autre
re,
CreateFile() {
flag=false
f_tmpl=$(< "${f_tmpl}")
declare -A ARRAY
while read line
do
[[ "$line" = "" ]] && continue
line=${line//\"/}
line=${line//&/\\&}
line=${line//,/ & }
[[ "$line" =~ ^[0-9]\.[0-9] ]] && index=$line && continue
if [[ "$line" =~ ^Total ]]; then
if ! $flag; then ARRAY[$index]+=' \\hline'; fi
ARRAY[$index]+=\\n${line}'\\\\[-2pt] \\hline'
flag=true
else
ARRAY[$index]+=\\n${line}'\\\\[-2pt]'
flag=false
fi
done < $f_source
while read line
do
[[ "$line" =~ ^%[0-9]\.[0-9] ]] && {
index=${line//%/}
echo -e "${ARRAY[$index]:2}"
continue
}
echo $line
done <<< "${f_tmpl//\\/\\\\}" >> "$f_final"
}
Ca devrait etre bon là ... !
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#12 Le 18/12/2011, à 23:30
- csm
Re : [resolu] Injecter du contenu d'un fichier à l'autre
Cela ne semble pas fonctionner, les \ disparaissent toujours.
Par ailleurs,
CreateFile() {
flag=false
f_tmpl=$(< "${f_tmpl}")
declare -A ARRAY
génère un erreur : "Nom de fichier trop long".
Et
flag=false
f_tmpl=$(< "${f_tmpl}")
CreateFile() {
declare -A ARRAY
provoque "Aucun fichier ou dossier de ce type". Bien que les deux finissent par créer final.tex, ce dernier perd ses \ quoi qu'il en soit.
Hors ligne
#13 Le 18/12/2011, à 23:49
- AnsuzPeorth
Re : [resolu] Injecter du contenu d'un fichier à l'autre
Tu as bien recopier le script dans son intégralité (c'était juste la fonction à remplacer)
Chez moi ca fonctionne avec tes fichiers d'exemples, je te le remets en entier:
#!/bin/bash
CreateFile() {
flag=false
f_tmpl=$(< "${f_tmpl}")
declare -A ARRAY
while read line
do
[[ "$line" = "" ]] && continue
line=${line//\"/}
line=${line//&/\\&}
line=${line//,/ & }
[[ "$line" =~ ^[0-9]\.[0-9] ]] && index=$line && continue
if [[ "$line" =~ ^Total ]]; then
if ! $flag; then ARRAY[$index]+=' \\hline'; fi
ARRAY[$index]+=\\n${line}'\\\\[-2pt] \\hline'
flag=true
else
ARRAY[$index]+=\\n${line}'\\\\[-2pt]'
flag=false
fi
done < $f_source
while read line
do
[[ "$line" =~ ^%[0-9]\.[0-9] ]] && {
index=${line//%/}
echo -e "${ARRAY[$index]:2}"
continue
}
echo $line
done <<< "${f_tmpl//\\/\\\\}" >> "$f_final"
}
while read f_source f_tmpl f_final
do
CreateFile
done < indic
exit
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#14 Le 18/12/2011, à 23:59
- csm
Re : [resolu] Injecter du contenu d'un fichier à l'autre
Effectivement, j'ai sûrement commis une erreur en voulant intégrer quelque chose. Le script fonctionne parfaitement désormais. Il fait à peu près tout ce que je pouvais rêver (!).
Si je souhaite rajouter un if à l'avenir, pour réaliser une opération particulière, pourrai-je l'intégrer simplement à la suite du premier ? Peut-être en créant un flag supplémentaire ?
Je vous remercie de votre patience ! Vous m'avez épargné bien des heures de rafistolage manuel !
Hors ligne
#15 Le 19/12/2011, à 00:28
- AnsuzPeorth
Re : [resolu] Injecter du contenu d'un fichier à l'autre
Si je souhaite rajouter un if à l'avenir, pour réaliser une opération particulière, pourrai-je l'intégrer simplement à la suite du premier ? Peut-être en créant un flag supplémentaire ?
Je te repondrai, ca dépends ...
C'est pour ça qu'il aurait été préférable de passer par python, plus facile pour traiter des strings (perl est encore plus puissant pour le traitement de catactères, mais je ne connais pas ...)
Si le script te conviens, passe le sujet en résolu.
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#16 Le 19/12/2011, à 00:44
- csm
Re : [resolu] Injecter du contenu d'un fichier à l'autre
C'est fait. Je ne manquerai pas de me rappeler votre offre !
Merci bien.
Hors ligne