Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2527 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  insérer une ligne dans le fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

insérer une ligne dans le fichier

n°1712966
richardjf
Posté le 04-04-2008 à 20:00:35  profilanswer
 

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!

mood
Publicité
Posté le 04-04-2008 à 20:00:35  profilanswer
 

n°1712984
olivthill
Posté le 04-04-2008 à 21:00:05  profilanswer
 

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.
 

n°1713033
richard3
Posté le 05-04-2008 à 08:00:59  profilanswer
 

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!

n°1713090
Sve@r
Posté le 05-04-2008 à 12:06:57  profilanswer
 

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.
n°1714292
richardjf
Posté le 08-04-2008 à 12:39:58  profilanswer
 

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

n°1715431
richardjf
Posté le 10-04-2008 à 09:55:50  profilanswer
 

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;!
 
 
 

n°1716019
richardjf
Posté le 11-04-2008 à 06:49:10  profilanswer
 

et ça ne marche pas....

n°1716327
aigles
Posté le 11-04-2008 à 14:37:28  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  insérer une ligne dans le fichier

 

Sujets relatifs
lien hypertext vers un fichier sur un serveur qui ne fonctionne pasligne de commande à convertir en VBS ou .bat
Opération automatique sur fichier txt coté serveur![PHP] fonction ftp_ pour déplacer un fichier
Inserer une mire sur une videorécupérer les donnees d'un fichier ds 1 tableau python
Transférer un fichier dans 170 dossiers !Vecteur dans fichier
Ligne de code css que je ne comprend pas?[C++]Insérer une ligne dans un fichier
Plus de sujets relatifs à : insérer une ligne dans le fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR