insérer une ligne dans le fichier

insérer une ligne dans le fichier - Shell/Batch - Programmation

Marsh Posté le 04-04-2008 à 20:00:35    

Bonjour,
J'ai une liste de fichiers.
quand je trouve un pattern du genre "Insert Into Table (26555, 5, 3, , 15, 0)"
je veux insérer une ligne dans le fichier, du genre: "Insert Into Table (26555, 5, 3, , 93, 0)"
sed refuse l'option \a qui permet d'écrire une ligne de plus dans le fichier!
Merci à ceux qui auront des idées!

Reply

Marsh Posté le 04-04-2008 à 20:00:35   

Reply

Marsh Posté le 04-04-2008 à 21:00:05    

Citation :

sed

Ah, c'est de l'Unix ?
 
Awk, par exemple (non testé) :

awk {
 print
 if ($0 == "Insert Into Table (26555, 5, 3, , 15, 0)" ) {
    printf("Insert Into Table (26555, 5, 3, , 93, 0)" )
  }
} ' toto.txt >new_file.txt


 
Ou une boucle read, par exemple (non testé) :

  cat toto.txt | while read theline
   do
      echo $theline >>new_file.txt
      if [ $theline = "Insert Into Table (26555, 5, 3, , 15, 0)" ]
      then
         echo "Insert Into Table (26555, 5, 3, , 93, 0)" >>new_file.txt
      fi
   done

Il doit aussi être possible d'utiliser sed pour insérer une ligne car il doit être possible de remplace une chaine par une autre qui contient un ou plusieurs retour à la ligne.
 
Mais le plus simple est de récupérer le fichier et de le retravailler sur son PC, par exemple avec un petit script VBS.
 

Reply

Marsh Posté le 05-04-2008 à 08:00:59    

Merci, j'essaie ça lundi. Normalement avec sed \a on devrait insérer mais ça ne marche pas et de plus sed ne reconnait pas \n comme un saut de ligne!

Reply

Marsh Posté le 05-04-2008 à 12:06:57    

richard3 a écrit :

Merci, j'essaie ça lundi. Normalement avec sed \a on devrait insérer mais ça ne marche pas et de plus sed ne reconnait pas \n comme un saut de ligne!


Tu es en train d'essayer de lire et d'écrire dans le même fichier ce qui est très dangereux si on s'y prend mal. Une bonne façon de faire est de passer par un second fichier. Sinon la seule façon de faire que j'ai trouvé est de mémoriser tout le fichier dans mon processus et d'effacer ensuite le fichier pour le recréer. Et j'ai fait des tests, ça a marché même avec des fichiers qui dépassent le Go...

Code :
  1. #!/bin/sh
  2. # Mémorisation du fichier dans le canal 3 et effacement
  3. exec 3<toto.txt
  4. rm -f toto.txt
  5.  
  6. # Lecture du canal 3 et création du fichier
  7. while read theline 0<&3
  8. do
  9.      echo "$theline" >>toto.txt
  10.      if [ "$theline" = "Insert Into Table (26555, 5, 3, , 15, 0)" ]
  11.      then
  12.         echo "Insert Into Table (26555, 5, 3, , 93, 0)" >>toto.txt
  13.      fi
  14. done


Message édité par Sve@r le 05-04-2008 à 12:07:42

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 08-04-2008 à 12:39:58    

Hélas! rien ne fonctionne......

Reply

Marsh Posté le 10-04-2008 à 09:55:50    

J'ai écrit ça: avec un fichier d'entree "entree.csv" (voir plus bas)
IFS="!"
if [ $# -lt 1 ]
then
   echo "nom du fichier[.csv]"
   exit
fi
for lg in `cat $1`
do
   
  Code=`echo $lg | awk -F";" '{ printf "%s", $1 }'`
  Chaine = `echo $lg | awk -F";" '{ printf "%s", $2 }'`
  Fichier=`echo $lg | awk -F";" '{ printf "%s", $3 }'`
 
 
cat $Fichier | while read theline  
do  
     echo "$theline" >> titi  
     if [ "$theline" = "Insert Into DISCOUNT_RESTRICTIONS Values ("$Code", 5, 3, 15, 0)" ]  
     then  
  echo "Insert Into DISCOUNT_RESTRICTIONS Values ("$Code", "$Chaine)" >> titi  
  fi
  done
 
 
done
mv titi $Fichier
----------------------------------------------------------------------
fichier d'entree "entree.csv"
26231; 5,3,93,0;g041000.sql;!
27753; 5,3,93,0;g041000.sql;!
26233; 5,3,93,0;g041001.sql;!
27754; 5,3,93,0;g041001.sql;!
26235; 5,3,93,0;g041002.sql;!
27755; 5,3,93,0;g041002.sql;!
26237; 5,3,93,0;g041003.sql;!
27756; 5,3,93,0;g041003.sql;!
26263; 5,3,93,0;g041027.sql;!
26264; 5,3,93,0;g041027.sql;!
26265; 5,3,93,0;g041027.sql;!
26266; 5,3,93,0;g041027.sql;!
26267; 5,3,93,0;g041027.sql;!
26268; 5,3,93,0;g041027.sql;!
26269; 5,3,93,0;g041039.sql;!
26270; 5,3,93,0;g041039.sql;!
26291; 5,3,93,0;g041048.sql;!
 
 
 

Reply

Marsh Posté le 11-04-2008 à 06:49:10    

et ça ne marche pas....

Reply

Marsh Posté le 11-04-2008 à 14:37:28    

richardjf a écrit :

et ça ne marche pas....


Cette version devrait fonctionner un peu mieux (non testée)

Code :
  1. IFS="!"
  2. if [ $# -lt 1 ]
  3. then
  4.    echo "nom du fichier[.csv]"
  5.    exit
  6. fi
  7. for lg in `cat $1`
  8. do
  9.  
  10.   Code=`echo $lg | awk -F";" '{ printf "%s", $1 }'`
  11.   Chaine = `echo $lg | awk -F";" '{ printf "%s", $2 }'`
  12.   Fichier=`echo $lg | awk -F";" '{ printf "%s", $3 }'`
  13.  
  14.   cat $Fichier | while read theline 
  15.   do 
  16.      if [ "$theline" = "Insert Into DISCOUNT_RESTRICTIONS Values ("$Code", 5, 3, 15, 0)" ] 
  17.      then 
  18.         echo "Insert Into DISCOUNT_RESTRICTIONS Values ("$Code", "$Chaine)" >> titi
  19.      else
  20.        echo "$theline" >> titi 
  21.      fi
  22.    done
  23.    mv titi $Fichier 
  24. done


 
Une autre solution à tester et adapter :

Code :
  1. modif() {
  2.    [ -z "$1" ] && return
  3.    echo "- Modification fichier $1"
  4.    if [ -f "$1" ]
  5.    then
  6.       if sed -f $2 $1 > $1.tmp
  7.       then
  8.          mv $1.tmp $1
  9.          echo "  Ok."
  10.       else
  11.          echo "  Echec !"
  12.          rm -f $1.tmp
  13.       fi
  14.    else
  15.       echo "  Non trouvé !"
  16.    fi
  17. }
  18. sed_fic=/tmp/sed.$$
  19. insert='Insert Into DISCOUNT_RESTRICTIONS Values ('
  20. values='", 5, 3, 15, 0'
  21. rm -f $sed_fic
  22. prec_fic=
  23. sort -t';' -k3,3 -k1,1 richard.csv | \
  24. while IFS=';' read code chaine fichier filler
  25. do
  26.   if [ "$fichier" != "$prec_fic" -a -n "$prec_fic" ]
  27.   then
  28.      modif "$fichier" "$sed_fic"
  29.      > $sed_fic
  30.   fi
  31.   prec_fic=${fichier}
  32.   echo "s/\\(${insert}${code}\\),[^)]*)/\1${chaine})/g" >> ${sed_fic}
  33. done
  34. modif "$fichier" "$sed_fic"


 
Jean-Pierre.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed