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

Bases de données Delphi Discussion :

Rapatriement d'un fichier csv assez volumineux


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Rapatriement d'un fichier csv assez volumineux
    Mesdames, Messieurs, bien le bonjour.

    Jusqu'à présent je n'ais pas eu beaucoup de problème avec la gestion des fichiers textes. En effet je découpais mes zones que je mettais dans un stringrid et j'en faisais ce que je voulais.

    Hors, je me retrouve à importer journalièrement un fichier CSV avec délimiteur ';' d'environ 90000 lignes (quatre vingt dix mille eh oui) à mettre dans une base pour traitement.

    Ce qui rend ma méthode complètement obsolète.

    Mon chef qui ne jure que par DBase, me fait cette manip en une seule ligne : append from c:\fichier.csv delimited with ";"

    Et hop 10 secondes après le 90000 lignes sont dans la table !

    J'ai essayé par readln, par stringgrid, par plusieurs méthode sans arriver à la rapidité et la simplicité d'un DBase outrecuidant !

    Je souhaite une aide de la communauté afin de réduire au silence le méprisable DBase travaillant en 3 bit et demi au lieu du superbe et flamboyant Delphi en 32 et magnifique bits !

    Vous aurez compris que sous la plaisanterie se cache l'importation simplifié d'un fichier CSV avec délimiteur point-virgule d'une taille qui peut atteindre 1 millon de lignes !

    Merci beaucoup par avance.

    Rickless

    PS : J'oubliais que les zones n'ont pas toutes la même largeur.
    exemple de 2 lignes)
    (...;................;.......;....
    .........;.....;..............;..)

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Avec la suite de composants JVCL , tu a les JvCsvDataSet qui permet de traiter les fichiers CSV directement comme une base de données.
    Donc après tu en fais ce que tu veux ^^
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Bonjour,

    Si tu nous disais déjà de quelle base il s'agit

    Il semblerait que DBase ait une facilité pour l'insertion de données au format CSV dans une base (un peu comme MySQL facilite l'import des données d'un fichier dans une table).

    Sinon, de prime à bord, une solution à mon avis serait de parser ton fichier CSV afin de pouvoir extraire les données enregistrements par enregistrements, posté les enregistrements dans le cache de ton dataset puis faire un ApplyUpdates pour valider en une fois les données.

    A+

    [Edit]
    pour le compo de la JVCL. Je ne l'avais pas encore testé

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par King Kaiser
    [Edit]
    pour le compo de la JVCL. Je ne l'avais pas encore testé
    J'ai pas encore fait de gros truc dessus donc, sur un gros fichier je sais pas comment il va réagir. Mais vu que les composants pour transferer d'un grid vers un CSV sont assez rapide et fonctionnel, je pense que lui aussi fera l'affaire.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 23
    Points : 16
    Points
    16
    Par défaut résolution
    Messieurs,

    Tout d'abord merci pour les réponses.

    J'ai (partiellement résolu la situation par un readln avec copy, pos et delete. Je sais la méthode n'est pas excelente mais je ne connais pas le composant JVCL et en général je ne manipule pas encore les composants correctement. ! Mais cela va venir !

    Merci encore

    voila pour ceux que cela interresse mon bout de programme
    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
    29
    30
    31
    32
    33
     
    procedure TForm1.Button4Click(Sender: TObject);
    Var F: TextFile;
        XCHAINE:String;  // ma ligne
        XX, lg: integer; // la valeur psuique je connais le nombre de champ (43)
        var_temp:string;  // ma variable que je vais poster dans mes champs
        compteur:integer; // le compteur pour les champs de 1 à 43
    begin
    XX:=1;             // j'initialise
    compteur:=1;       // j'initialise
    Table1.close;
    Table1.emptytable; // Je vide la table
    table1.open;
    //Lire le contenu du fichier
    AssignFile(F,ExtractFilePath(Application.ExeName)+'test.txt'); // je vais chercher le fichier test.txt
    Reset(F);
    repeat    //Repeter...
    Readln(F,XCHAINE); //Lit une ligne du fichier texte jusqu'au prochain sut de ligne
    Table1.Append;   // je prépare à faire mon post
    for xx := 1 to 42 do
        begin
        lg := Pos(';', XCHAINE);  // je cherche la position du point virgule
        Table1.fieldbyname('CH_'+inttostr(compteur)).asstring := copy(XCHAINE,0,lg-1); //je met dans mon champ CH_et le nombre
        Delete(XCHAINE,1,lg);  // j'enlève la partie lu
        compteur:=compteur+1;  // on passe au champ suivant de la table receveuse
    next;   // et je recommence
    end;
    Table1.post;
    compteur:=1; // je reviens sur le champ 1 de ma table receveuse pour la ligne suivante
    until EOF(F);// ...jusqu'à ce que la position en cours du pointeur se trouve en fin de fichier
    CloseFile(F);   // je close la table
    showmessage('fini');  // et c'est fini
    end;
    Rickless

Discussions similaires

  1. [OpenOffice][Tableur] Comment lire un fichier .csv volumineux
    Par Derfh dans le forum OpenOffice & LibreOffice
    Réponses: 6
    Dernier message: 16/04/2015, 11h11
  2. [MySQL] Imports de fichiers csv très volumineux
    Par kazabandi dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/12/2010, 17h24
  3. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  4. Sortir un fichier csv sur base d une requete
    Par Freeman_80 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 12/01/2005, 11h21
  5. Réponses: 2
    Dernier message: 14/05/2004, 12h55

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