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 :

Récuperer les données d'un fichier txt pour les insérer dans une Table


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut Récuperer les données d'un fichier txt pour les insérer dans une Table
    Bonjour,
    voilà j'ai un fichier txt (forme.txt), et j'aime bien savoir s'il y a une méthode pour récupérer les données de ce fichier et les insérer dans une Table.
    à vrai dire mon problème c'est que je ne sais pas comment les enregistrements dans ce fichier txt sont organisés (Records ou tout simplement séparés par des Tabulations).

    Merci d'avance.
    Fichiers attachés Fichiers attachés

  2. #2
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    A ouvrir avec un éditeur de texte et là on voit que le prmeier 'champ' est sur 3 caractère puis le deuxième sur 49 caractères et le dernier sur 20 caractères

    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
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    Var F: TextFile;
    Stg,stg1,stg2,stg3:String;
    begin
    Memo1.Clear;
    Memo2.clear;
    Memo3.clear;
    AssignFile(F,ExtractFilePath(Application.ExeName)+'forme.txt');
    Reset(F);
    repeat
    Readln(F,Stg);
    stg1:=copy(stg,1,3);
    stg2:=copy(stg,4,49);
    stg3:=copy(stg,54,20);
    Memo1.Lines.Add(Stg1);
    Memo2.Lines.add(stg2);
    Memo3.Lines.add(stg3);
    until EOF(F);
    CloseFile(F);
    end;
    Sur le Form il y a un SpeedButton et 3 Memos. Le fichier Formes.txt est dnas le même répertoire que le projet.
    avec stg1 stg2 et stg3 qui contiennent les 3 valeurs de chacune des lignes à inclure après dans les champs de la table.

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Fxg Voir le message
    A ouvrir avec un éditeur de texte et là on voit que le prmeier 'champ' est sur 3 caractère puis le deuxième sur 49 caractères et le dernier sur 20 caractères

    Sur le Form il y a un SpeedButton et 3 Memos. Le fichier Formes.txt est dnas le même répertoire que le projet.
    avec stg1 stg2 et stg3 qui contiennent les 3 valeurs de chacune des lignes à inclure après dans les champs de la table.
    Je vous remercie... mais c vraiment astucieux ...de manipuler directement les Strings.

  4. #4
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    un petit clic sur [Resolu] alors ?

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    j'ai essayé la méthode sur un fichier de 8Mo de données... ça marche mais l'opération d'insertion des données dans la table est très très lente....donc la question se pose... est-ce qu'il y a un remède pour accélérer le traitement des Strings et les insérer dans la Table ?

  6. #6
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    1 - Tu utilises quoi comme base?
    2 - Un bout de code de ce que tu fais actuellement pourrais nous aider...à t'aider.
    Pensons bien, pensons bio

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par samaury Voir le message
    1 - Tu utilises quoi comme base?
    2 - Un bout de code de ce que tu fais actuellement pourrais nous aider...à t'aider.
    -- benn...j'utilise Absolute Database (Édition personnelle).

    -- Pour le code... j'utilise le même code écrit par Fxg.

    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
    //////////// Medic.txt
      AssignFile(F,ExtractFilePath(Application.ExeName)+'Medic.txt');
      Reset(F);
      repeat
      Readln(F,Stg);
      N_Enregistrement:=copy(stg,1,5);
      Nom_commercial:=copy(stg,6,49);
      Nom_DCI:=copy(stg,56,49);
      Dosage:=copy(stg,106,28);
      Unite:=copy(stg,136,19);
      Conditionnement:=copy(stg,156,20);
      Remoursable:=copy(stg,176,1);
      Date_remboursement:=Copy(Stg,178,8);
      date_arret_remboursement:=Copy(Stg,186 ,8);
      Tarif_de_reference:=copy(stg,194,20);
      Forme:=copy(stg,216,6);
      Observation:=copy(stg,243,1000);
      DataModule2.ABSTable1.AppendRecord([nil, N_Enregistrement,Nom_commercial, Nom_DCI, Dosage, Unite, Conditionnement, Remoursable,Tarif_de_reference, Forme, Observation]);
      DataModule2.ABSTable1.Edit;
      DataModule2.ABSTable1Date_remboursement.Value:=Date_remboursement;
      DataModule2.ABSTable1Date_arret_remboursement.Value:=date_arret_remboursement;
      DataModule2.ABSTable1.Post;
      until EOF(F);
      CloseFile(F);

  8. #8
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    Je ne connais pas cette base mais je ne pense pas écrire une trop/très grosse con...rie en te suggerant de ne faire ton "post" que une fois que tu as ajouter tous tes enregistrements.
    En disant ça je fais l'hypothèse que le "AppendRecord" met les données en cache et le "post" envoie tout en une seule fois dans la base.
    Concrètement ça donnerait un truc du genre
    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
     
      AssignFile(F,ExtractFilePath(Application.ExeName)+'Medic.txt');
      Reset(F);
      repeat
      Readln(F,Stg);
      N_Enregistrement:=copy(stg,1,5);
      Nom_commercial:=copy(stg,6,49);
      Nom_DCI:=copy(stg,56,49);
      Dosage:=copy(stg,106,28);
      Unite:=copy(stg,136,19);
      Conditionnement:=copy(stg,156,20);
      Remoursable:=copy(stg,176,1);
      Date_remboursement:=Copy(Stg,178,8);
      date_arret_remboursement:=Copy(Stg,186 ,8);
      Tarif_de_reference:=copy(stg,194,20);
      Forme:=copy(stg,216,6);
      Observation:=copy(stg,243,1000);
      DataModule2.ABSTable1.AppendRecord([nil, N_Enregistrement,Nom_commercial, Nom_DCI, Dosage, Unite, Conditionnement, Remoursable,Tarif_de_reference, Forme, Observation]);
      DataModule2.ABSTable1.Edit;
      DataModule2.ABSTable1Date_remboursement.Value:=Date_remboursement;
      DataModule2.ABSTable1Date_arret_remboursement.Value:=date_arret_remboursement;
    //  DataModule2.ABSTable1.Post;//Le Post se fait plus bas
      until EOF(F);
      DataModule2.ABSTable1.Post;
      CloseFile(F);
    Pensons bien, pensons bio

  9. #9
    Membre régulier
    Inscrit en
    Août 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 158
    Points : 80
    Points
    80
    Par défaut
    Bon Soir

    Pourquoi pas utiliser smIWizardDlg

    C'est trés efficace pour ton problème ;

    Tu le trouve http:////www.scalabium.com/

  10. #10
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par samaury Voir le message
    Je ne connais pas cette base mais je ne pense pas écrire une trop/très grosse con...rie en te suggerant de ne faire ton "post" que une fois que tu as ajouter tous tes enregistrements.
    En disant ça je fais l'hypothèse que le "AppendRecord" met les données en cache et le "post" envoie tout en une seule fois dans la base.
    Concrètement ça donnerait un truc du genre
    Oui...ça a accéléré un petit peu l'opération.. je vous remercie...mais ça n'empêche d'utiliser une transaction car le chargement des données prend quand même quelque minutes...je dit bien minutes.

  11. #11
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    et voila ce fameux fichier texte de 8 Mo ...si peut être quelqu'un veut essayer avec...TELECHARGER ICI. (compressé par 7zip).

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 69
    Points : 57
    Points
    57
    Par défaut
    Salut

    je pense savoir d'où vient ton problème ^^.
    J'utilise cette base de donnée pour mon projet.

    Avant l'ajout des données il faut ajouter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ABSDatabase1.StartTransaction;
    et une fois que tout est ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ABSDatabase1.Commit(False);
    Ca donne ca : (l'exemple vient du fichier d'aide)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     ABSDatabase1.StartTransaction;  
     for i:=1 to 2000 do  
      with ABSTable1 do  
       begin  
         Insert;  
         FieldByName('Name').AsString := 'John';  
         Post;  
       end;  
     ABSDatabase1.Commit(False);

  13. #13
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    J'aurais mis le "post" en dehors de la boucle, juste avant le "commit(False)".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     ABSDatabase1.StartTransaction;  
     for i:=1 to 2000 do  
      with ABSTable1 do  
       begin  
         Insert;  
         FieldByName('Name').AsString := 'John';  
    //     Post;  
       end;  
     Post;  
     ABSDatabase1.Commit(False);
    Pensons bien, pensons bio

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 69
    Points : 57
    Points
    57
    Par défaut
    Tu vas avoir que des erreurs en faisant ca.
    Insert, edit s'accompagne toujours de post.

    Essayes d'appeler insert et de l'appeler à nouveau ^^.

    Sinon cette méthode est ultrarapide.
    J'avais essayé avec des fichiers de 50 mo (ca tournait dans les 1 minutes je crois).

  15. #15
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Un Post doit être effectué pour chaque Insert (ou Edit).
    Le fait de sortir le Post de la boucle ne change rien puisqu'il sera implicitement appelé lors du déplacement effectué sur le DataSet (déclenché par le Insert de la boucle suivante).

    Par contre appelé 2000 fois le FieldByName, là tu perds énormément de temps.
    C'est lui qu'il faut sortir de la boucle.

    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
    var
      I: Integer;
      F: TField;
    begin
      ABSDatabase1.StartTransaction;
      with ABSTable1 do
      begin
        F := FieldByName('NAME');
        for I := 1 to 2000 do
        begin
          Insert;
          F.AsString := 'John';
          Post;
        end;
      end;
      ABSDatabase1.Commit(False);
    end;
    @+ Claudius

  16. #16
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    Oki
    Ca veut dire que le ".Insert()" ne marche pas comme le ".AppendRecord +.Edit "
    Je note...je note
    Citation Envoyé par Fenix01 Voir le message
    Tu vas avoir que des erreurs en faisant ca.
    Insert, edit s'accompagne toujours de post.

    Essayes d'appeler insert et de l'appeler à nouveau ^^.

    Sinon cette méthode est ultrarapide.
    J'avais essayé avec des fichiers de 50 mo (ca tournait dans les 1 minutes je crois).
    Pensons bien, pensons bio

  17. #17
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Pour trancher sur la quelles des méthodes est le plus rapide.. j'ai décidé tout simplement d'utiliser mon chronomètre...
    et, voilà les résultats :
    -- La méthode de samaury (le post en dehors la boucle) : 1' 53''
    -- La méthode de Fxg (le post dans la boucle) : 1' 57''
    -- La méthode de Cl@udius : 2' 03''


  18. #18
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    Je suis un peu largué: le "Post" hors de la boucle ne bug pas?
    Tu récupères bien toutes tes données dans la base?
    Citation Envoyé par sandokhane Voir le message
    Pour trancher sur la quelles des méthodes est le plus rapide.. j'ai décidé tout simplement d'utiliser mon chronomètre...
    et, voilà les résultats :
    -- La méthode de samaury (le post en dehors la boucle) : 1' 53''
    -- La méthode de Fxg (le post dans la boucle) : 1' 57''
    -- La méthode de Cl@udius : 2' 03''

    Pensons bien, pensons bio

  19. #19
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par samaury Voir le message
    Je suis un peu largué: le "Post" hors de la boucle ne bug pas?
    Non (cf mon explication) puisque que le Post est implicite.

    Par contre je suis étonné que le FieldByName dans la boucle ne soit pas plus pénalisant.

  20. #20
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par samaury Voir le message
    Je suis un peu largué: le "Post" hors de la boucle ne bug pas?
    Tu récupères bien toutes tes données dans la base?
    Non y a aucun bug....et les données sont toutes postées sans aucun problème..
    Malheureusement le problème de la lenteur existe toujours puisque l'opération du parsing du fichier texte prend beaucoup de temps.

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/05/2014, 23h01
  2. [XL-2007] Récuperer les données d'un fichier et traiter les données
    Par kekefff dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/05/2014, 20h29
  3. [OpenOffice][Base de données] Récupérer les données d'un fichier .txt et les insérer dans une base de données
    Par frack dans le forum OpenOffice & LibreOffice
    Réponses: 9
    Dernier message: 05/08/2009, 10h52
  4. Réponses: 2
    Dernier message: 20/07/2008, 11h29
  5. Importer fichiers txt d'un dossier dans une table
    Par avantoux dans le forum Access
    Réponses: 16
    Dernier message: 28/12/2005, 12h13

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