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 GNU Discussion :

Division d'un fichier csv et nouveaux champs


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 21
    Par défaut Division d'un fichier csv et nouveaux champs
    Bonjour à tous,
    J'ai fait un script php pour l'upload d'une base de données. Seulement après avoir eu connaissance de la taille de la base à insérer (par fichiers csv de 160 000 lignes) j'ai vite compris que le serveur allait être dépassé par les commandes lourdes (allocation d'un tableau, etc...).
    J'ai donc décidé de faire les mêmes opérations en commandes linux mais hélas je ne les connais pas du tout et donc je risque de faire quelque chose de très mal optimisé, c'est pourquoi je me tourne vers vous.

    Shéma du fichier csv de départ :
    FICHIER RAPPORT;champ2;champ3;
    FICHIER TYPE2;champ2;champ3;champ4;
    FICHIER TYPE3;champ2,;champ3;champ4;champs5;
    FICHIER TYPE4;champ2,;champ3;champ4;champs5;

    Deux choses doivent être faites :

    -Isoler chaque type de de ligne (FICHIER RAPPORT, FICHIER TYPE2...) dans d'autres fichiers csv (s'appellant par exemple "rapport.csv","type2.csv"...)

    -Ajouter deux champs à la fin de chaque ligne (le mois et l'année) dans chacun de ces fichiers.

    La première opération je ne trouve pas vraiment comment la faire efficacement.
    La deuxième est bien plus simple mais je ne sais pas ce qui serait le plus optimisé.


    Merci d'avance de votre aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,

    Pour générer tes fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sed -n "/RAPPORT/p" fichier_csv_depart > rapport.csv
    sed -n "/TYPE2/p" fichier_csv_depart > type2.csv
    sed -n "/TYPE3/p" fichier_csv_depart > type2.csv
    sed -n "/TYPE4/p" fichier_csv_depart > type2.csv
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 21
    Par défaut
    Merci beaucoup c'est parfait.
    Et pour rajouter par exemple "08;2009;" à la fin de chaque ligne quel est le plus efficace? utiliser awk?

    Sinon il peut arriver que dans le ficher csv de départ il y ai à la fin d'une ligne plein de ;;;;;;;; (car il y a des cases vides dans le fichier de départ), est-il possible de rajouter le "08;2009;" tout en retirant les ";" en trop avant? (donc en n'en gardant qu'un).

    En reprenant l'exemple :
    FICHIER RAPPORT;champ2;champ3;;;;;;;;;

    le remplacer par :
    FICHIER RAPPORT;champ2;champ3;08;2009;

  4. #4
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Si tu dois faire des traitements particulier, il y deux possibilités:
    1) utilisé sed avec des expressions regulières parenthèsées qui permettent de faire un epu de traitement
    2) utiliser awk qui permet de faire des traitements complexes.

    Personnellement j'ai eu a faire la même chose une fois, je préfère awk

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 21
    Par défaut
    N'ayant pas vu ta réponse je me suis tourné vers du sed avec :
    sed 's/$/08\/2009;/' <titi.csv> tata.csv pour l'ajout.
    Une meilleure idée?

    Pour les ;;;;; en trop ça ne peut se produire que sur un petit fichier (pas celui avec des centaines de milliers de lignes) donc je peux le faire à part mais j'aurais bien voulu trouver une astuce.

    Peut être avec un "remplacement" de tous les ;;;; quel que soit leur nombre à la fin du fichier par ;08/2009; . Mais d'une part ça peut peut être devenir lourd? et d'autre part je dois réviser mes expressions réguliaires pour pouvoir le faire

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    echo "FICHIER RAPPORT;champ2;champ3;;;
    FICHIER TYPE2;champ2;champ3;champ4;;
    FICHIER TYPE3;champ2,;champ3;champ4;champs5;
    FICHIER TYPE4;champ2,;champ3;champ4;champs5;" | sed -n 's/;*$/;08;2009;/
    /RAPPORT/wrapport.csv
    /TYPE2/wtype2.csv'
    cat rapport.csv
    FICHIER RAPPORT;champ2;champ3;08;2009;
    cat type2.csv
    FICHIER TYPE2;champ2;champ3;champ4;08;2009;
    /!\ les alinéas sont essentiels dans la commande sed.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/06/2012, 11h34
  2. Réponses: 11
    Dernier message: 27/10/2008, 09h15
  3. [CSV] Modifier un champ d'un fichier CSV
    Par BernardT dans le forum Langage
    Réponses: 3
    Dernier message: 04/07/2007, 10h13
  4. Réponses: 3
    Dernier message: 11/06/2007, 11h20
  5. Réponses: 3
    Dernier message: 26/04/2006, 11h52

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