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

 Delphi Discussion :

Très gros fichier CSV


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut Très gros fichier CSV
    Bonjour à tous,

    je suis nouveau sur Delphi (une semaine tout juste) et je bute contre un gros problème (c'est loin d'être le premier mais les autres j'ai pu les résoudre grâce à ce forum).

    Je vous fais un court résumé de mon problème.
    Je dois analyser puis traiter des fichiers CSV en Delphi.
    Pour les fichiers de petites tailles (environ 5000 lignes), pas de problème, je passe par des TStringList qui marche du tonnerre. J'ouvre mes fichiers avec un:

    et tout est ok.

    Par contre, je dois traiter aussi des fichiers CSV de 90meg et là j'ai un gros problème de memoire. On m'a conseillé d'utiliser des fonction de bas niveau comme AssignFile,Reset,....

    Mais je me suis renseigné dessus et j'avoue être perdu...

    I need help please.

    ps: mon fichier d'ouverture (le csv) est non typé.

    Merci !

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    oui, donc 2 solutions

    1) tu passes par TFileStream et tu charges ton fichier par petit bouts en recherchant les CR/LF qui marquent les fins de ligne

    2) tu utilises l'antique TextFile

    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
     
    var
     f:TFileStream;
     b:string;
     i:integer;
     s:string;
    begin
     f:=TFileStream.Create('fichier.csv',fmOpenRead);
     try
      SetLength(b,1024);
      s:='';
      while f.Position<f.Size do begin
       i:=f.ReadBuffer(b[1],1024);
       if i<1024 then SetLength(b,i);
       s:=s+b;
       i:=pos(#13#10,s);
       while i>0 do begin
        TraiterLaligne(copy(s,1,i));
        delete(s,1,i+2);
        i:=pos(#13#10,s);
       end;
      end;
     finally
      f.Free;
     end;
    end;
    deuxième solution
    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
     
    var
     f:TextFile;
     s:string;
    begin
     AssignFile(f,'fichier.csv');
     Reset(f);
     try
      while not Eof(f) do begin
       ReadLn(f,s);
       TraiterLigne(s);
      end; 
     finally
      CloseFile(f); 
     end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Lit ce sujet "Ouvrir et lire un fichier .csv" mais surtout celui là : "Votre Avis : Optimisation des performances pour le chargement de fichier CSV", ma fonction explode que j'y ai mis, est l'une des plus rapide pour décomposer une chaine du type A;"B1;B2";C, typique du CSV ...

    pour ce qui concerne les gros fichiers en général :
    Manipuler un gros fichier texte
    Lecture et modification de gros fichier texte la plus rapide possible , ma classe TTextFileReader devrait t'interesser pour la lecture
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut
    Merci beaucoup pour vos réponses, je vais essayer tout ça ce matin et je vous tiens au courant.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut
    J'ai décidé de choisir la méthode de l'antique TextFile et ça marche comme sur des roulettes !

    Merci encore.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Attention, si tu as dans ton CSV un champ texte qui peut contenir des retours-charriot, il te faudra gérer différemment ta lecture, mais c'est un cas rarement géré ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Attention, si tu as dans ton CSV un champ texte qui peut contenir des retours-charriot, il te faudra gérer différemment ta lecture, mais c'est un cas rarement géré ...
    Oui en effet j'y ai pensé mais ce n'est pas mon cas, merci encore.

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 03/05/2012, 14h22
  2. [CSV] Traitement d'un très gros fichier XML ou CSV
    Par Paulux1 dans le forum Langage
    Réponses: 3
    Dernier message: 25/03/2008, 16h05
  3. [CSV] Traitement d'un gros fichier CSV
    Par Adrinou dans le forum Langage
    Réponses: 6
    Dernier message: 09/10/2007, 12h40
  4. [MySQL] Traitement de gros fichier CSV
    Par oceanbigone dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/07/2007, 11h40
  5. Transformer un très gros fichier XML avec XSL
    Par wozzz dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 30/05/2006, 10h57

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