Ajouter un nouveau champs a un fichier csv

Résolu
bendjiz Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
bendjiz Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous je suis nouveau sur ce site et j'aimerais vous soumettre un problème. Le problème est que je souhaite avec un script shell ajouter a un fichier csv un nouveau champs, je m'explique par un exemple: j'ai un fichier csv qui contient plusieurs champs et plusieur lignes comme celui ci
toto;titi;tata;...
dada; mimi;....
roro; riri; tomi;popo;...
Ce que j'essai de faire c'est de réccupérer la date de la derniere modification du fichier et l'ajouter au differentes lignes de mon fichier ce qui me donnera:

toto;titi;tata;...;23-01-1998
dada; mimi;....;23-01-1998
roro; riri; tomi;popo;...;23-01-1998
J'espere avoir expliqué clairement ma preoccupation, merci de m'aider .

3 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    jp@MDK:~/tmpfs ssh$ cat ben
    toto;titi;tata;...
    dada; mimi;....
    roro; riri; tomi;popo;...
    
    jp@MDK:~/tmpfs ssh$ sed -i.bak 's/$/;23-01-1998/' ben
    
    jp@MDK:~/tmpfs ssh$ cat ben
    toto;titi;tata;...;23-01-1998
    dada; mimi;....;23-01-1998
    roro; riri; tomi;popo;...;23-01-1998
    
    jp@MDK:~/tmpfs ssh$ cat ben.bak
    toto;titi;tata;...
    dada; mimi;....
    roro; riri; tomi;popo;...
    
    jp@MDK:~/tmpfs ssh$


    ;-))
    0
    1. bendjiz Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
       
      Merci Jipicy,
      mais quand j'utilise le sed -i je reçois une erreur ainsi libéllé: sed: illegal option --i . Aussi je souhaiterais que tu m'aides à savoir comment insérer la commande stat -c '%y' zac.csv qui me renvoie la date de la derniere modification du fichier zac.csv dans le script que tu m'a envoyé. Encore merci de m'aider
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Quel système d'exploitation ?
      Quelle version de sed ?

      Si l'option "-i" n'existe pas il faut rediriger la sortie vers un fichier temporaire et écraser l'original par la suite...

      Édit :

      [tmpfs]$ cat ben.bak
      toto;titi;tata;...
      dada; mimi;....
      roro; riri; tomi;popo;...
      
      [tmpfs]$ STAT=$(stat -c ";%y" ben)
      
      [tmpfs]$ sed 's/$/'"${STAT}"'/' ben.bak > temp && mv -f temp ben.bak
      
      [tmpfs]$ cat ben.bak
      toto;titi;tata;...;2010-04-27 15:30:25.733695153 +0200
      dada; mimi;....;2010-04-27 15:30:25.733695153 +0200
      roro; riri; tomi;popo;...;2010-04-27 15:30:25.733695153 +0200
      
      [tmpfs]$

      :-))
      0
    3. bendjiz Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
       
      Merci beaucoup jipicy, est ce possible qu'on échange nos mails?
      0
    4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Re-

      Non ! Le forum est largement plus efficace qu'un individu tout seul ;-\
      0
    5. bendjiz Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
       
      ok! sans soucis merci encore
      0
  2. al_right Messages postés 142 Statut Membre 9
     
    en bash, je sais pas (bien que ce doit être similaire), mais en Perl

    #!/usr/bin/perl -w
    
    use strict;
    use warnings;
    
    my $file= "fichier.csv";
    my $fout = "sortie_$file";
    
    my $datefile = (stat($file))[9];
    
    open F, "$file" or die "ouverture de $file impossible $!";
    my @contenu = <F>;
    close F || die "Fermeture de $file impossible $!";
    
    foreach $l(@contenu) {
      chomp $l;
      #$nl.= "$datefile\n";
      $nl = "$l" . "$datefile\n"; 
      push @nwcontenu, $nl;
    }
    
    
    open FOUT, ">$fout" or die "Ouverture de $fout impossible $!";
    print FOUT @nwcontenu;
    close FOUT || die "Fermeture de $fout impossible $!";
    
    END;


    Voilà, j'ai pas testé mais ça devrai le faire.
    Si maintenant, c'est les toto ou rara qui représente les nom de fichiers que tu dois dater à leur dernière modif,
    adapte en placant dans la boucle foreach la ligne

    my $datefile = (stat($file))[9];
    en dégageant $file par une reconnaissance de motif ou un split(/;/, $l)
    0
    1. bendjiz Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
       
      Merci beaucoup pour ta reactivité al_right
      0
    2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      Si je peux me permettre

      #!/usr/bin/perl 
      
      use strict; 
      use warnings; 
      
      my $file= "fichier.csv"; 
      my $fout = "sortie_$file"; 
      
      open F, "$file" or die "ouverture de $file impossible $!"; 
      open FOUT, ">$fout" or die "Ouverture de $fout impossible $!"; 
      
      my $datefile = (stat($file))[9]; 
      my ($d,$m,$a)=(localtime($datefile))[3..5]; 
      
      $m=sprintf("%02d",$m+1); 
      $a+=1900; 
      
      foreach my $l(<F>) { 
        chomp $l; 
        print FOUT "$l;$d-$m-$a\n"; 
      } 
      END;
      0
    3. bendjiz Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
       
      merci
      0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    une version avec awk
    $ ls -ln a1
    -rw-r--r-- 1 1000 1000 61 1999-11-22 11:22 a1
    $ 
    $ awk '!x {a="date -r " FILENAME " +\"%d-%m-%Y\"";  a  |getline date ; x++};{ print $0 ";" date}' a1
    toto;titi;tata;...;22-11-1999
    dada; mimi;....;22-11-1999
    roro; riri; tomi;popo;...;22-11-1999
    $
    
    0
    1. bendjiz Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
       
      merci pour ta reponse
      0