IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

Traitement des fichiers(cat)


Sujet :

Shell et commandes POSIX

  1. #1
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 13
    Par défaut Traitement des fichiers(cat)
    Bonjour,
    Je suis en train de faire un script shell, j'aimerais faire quelque chose si quelqu'un pouvait m'aider.
    J'ai un fichier csv et je veux récupérer que les lignes qui respectent mon critère de filtre (ou de supprimer les lignes qui ne respectent pas mon critère de filtre).
    Voici un extraire de mon fichier csv.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AZERTYUIOPQSDF               02  20110921014732000000000111111111111111                4444444444444               AAAAAAA             AAAAAAA
           QSDFGHJ               03  20110923014553741244444444444444444444                1111111111111                                   ZZZZZZZ
    AAAAAAA                      06  20110921014524000000000000000000000000                000000000                   ZZZZZZZ
    Critère de filtre : date_csv doit être entre date_début et date_fin.
    date_csv : commence à partir de la position 34 jusqu'à la position 42 sous forme AAAAMMJJ.
    date_début : sous forme AAAAMMJJ.
    date_fin : sous forme AAAAMMJJ.
    J'ai développé un script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #!/bin/ksh
    rep_f="echantillon_fichier"
    rep_f_R="echantillon_fichier_R"
    date_d=20110921
    date_f=20110921
    echo "1"
    ls $rep_f | while read nom_f
    do
    echo "2"
    	nb_ligne=0
    	cat -v $rep_f/$nom_f | while read ligne_f
    	do
    	echo "3"
    		date_l=`echo $ligne_f | awk -F" " '{print $3}'|cut -c1-8`
    		if [ $date_d -ge $date_l ] && [ $date_l -ge $date_f ] 
    		then
    			echo $ligne_f>>"${rep_f_R}/${nom_f}.temp"
    			 nb_ligne=`expr $nb_ligne + 1 `
    		fi
     
    	done
    	if [ $nb_ligne != 0 ]
    	then
    		echo "nb: ${nb_ligne}">>"${rep_f_R}/${nom_f}.temp"
     
    	fi
    done
    problème la commande cat transforme les lignes résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AZERTYUIOPQSDF 02 20110921014732000000000111111111111111 4444444444444 AAAAAAA AAAAAAA
    AAAAAAA 06 20110921014524000000000000000000000000 000000000 ZZZZZZZ
    merci d'avance

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonsoir.

    Plutôt que ls |*while read tu peux utiliser la wildcard qui est directement interprété par bash comme la liste des fichiers du répertoire courant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for file in *; do #for file in *quelque chose, for file in chemin/* etc c'est assez souple ;)
        # traitements sur $file
    done
    Plutôt que d'utiliser cat $fichier |*while read tu peux utiliser les rédirection de la façon suivante (ça économise un processus) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while read ligne; do
    done < $fichier
    Et ça devrait aussi régler ton problème de tabulation/espace (à tester).

    Cordialement,
    Idriss

  3. #3
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 13
    Par défaut
    Merci infiniment pour votre réponse et les consignes, mais les espace blanche au début et à la fin ils ont été supprimé, même quand j’ajout les guillemets.




    Citation Envoyé par ok.Idriss Voir le message
    Bonsoir.

    Plutôt que ls |*while read tu peux utiliser la wildcard qui est directement interprété par bash comme la liste des fichiers du répertoire courant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for file in *; do #for file in *quelque chose, for file in chemin/* etc c'est assez souple ;)
        # traitements sur $file
    done
    Plutôt que d'utiliser cat $fichier |*while read tu peux utiliser les rédirection de la façon suivante (ça économise un processus) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while read ligne; do
    done < $fichier
    Et ça devrait aussi régler ton problème de tabulation/espace (à tester).

    Cordialement,
    Idriss

  4. #4
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 13
    Par défaut
    je viens de trouver la solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #vider l'IFS pour read
    while IFS='' read line...
    merci à tous

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Je ne pense pas que ce soit un problème d'IFS, mais plutôt lié à 'echo' et aux guillemets.

    Compare, avec et sans guillemets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo 'a   b' | { read line ; echo "${line}" ; }
    a   b
     
    $ echo 'a   b' | { read line ; echo ${line} ; }   
    a b
    C'est très souvent une sage habitude que d'entourer toutes les variables de guillemets (sauf raison valable! (genre variable entière)).

    Dans ton cas, c'est "$ligne_f" aux lignes 15 et 18 de ton post initial.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Traitement des fichiers textes
    Par Julien Dufour dans le forum VBA Access
    Réponses: 3
    Dernier message: 15/08/2008, 15h50
  2. Traitement des fichiers
    Par ouadie99 dans le forum C#
    Réponses: 5
    Dernier message: 17/04/2008, 15h49
  3. traitement des fichiers
    Par stanley1415 dans le forum Informix
    Réponses: 2
    Dernier message: 30/01/2008, 22h07
  4. DEV-C++ et le traitement des fichiers EXCEL
    Par titos09 dans le forum Dev-C++
    Réponses: 0
    Dernier message: 22/10/2007, 17h11
  5. Réponses: 1
    Dernier message: 24/07/2005, 22h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo