Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

csm a écrit :

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 smile)

#!/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,

AnzusPeorth #6 a écrit :

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é wink

csm a écrit :

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 wink

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

csm a écrit :

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 ... big_smile

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