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

Langage Delphi Discussion :

Importer un fichier texte


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 19
    Points : 12
    Points
    12
    Par défaut Importer un fichier texte
    Bonjour à tous,
    plusieurs jours de recherche donc je me permets de poster...

    Mon problème :
    j'ai un fichier texte qui ce présente comme ça :

    S T1 09:10:54 ID0350 0001 12345 1 25/11/2005
    M T1 09:10:57 ID0350 0001 12345 1 25/11/2005
    ...

    (8 colonnes séparées par des espaces).

    Je ne peux pas modifier ce fichier et je dois l'importer dans access.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Var St:TStringList;
    i : integer;
    begin
      St:=TStringList.Create;
      St.LoadFromFile('D:\IN\test.txt');
      st.Delimiter := ' ';
      For i := 0 to st.Count-1 do
      begin
          st.DelimitedText := st[i];
          ADOQuery1.SQL.Add('INSERT INTO Importation ([NoId]) VALUES ("'+st[i]+'")');
      end;
    end;
    Mais je ne récupère que le premier caractère et Delphi affiche : indice de liste hors limites (1).

    Des idées ?
    Merci d'avance.

  2. #2
    Membre expérimenté
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Points : 1 392
    Points
    1 392
    Par défaut
    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
    for j:=2 to iNbreLignes -1 do
              begin
               _slMvt.ValueFromIndex[j];
               S:=_slMvt.Strings[j];
               with TbStock do begin
                   active:=true;
                   insert;
                   FieldByName('nDateFichier').Value:=lDateFichier;
                   FieldByName('nDateMVT').Value:=strtoint(copy(S,6,8));
                   FieldByName('sCdeMag').Value:=copy(S,16,2);
                   FieldByName('sCdeMvt').Value:=copy(S,53,2);
                   FieldByName('sSigne').Value:= copy(S,55,1);
                   FieldByName('sCdePdt').Value:=copy(S,18,12);
                   FieldByName('sNumLot').Value:=copy(S,30,15);
                   FieldByName('nDatePer').Value:=strtoint(copy(S,45,8));
                   FieldByName('iQte').Value:=strtoint(copy(S,63,5));
                   post;
               end;
    _slMvt est mon TStringList.
    iNbreLignes représente le nombre de lignes présentes dans le TStringList.
    S est une variable de type String qui récupère toute la ligne en fonction de la valeur de j.
    La seule différence avec toi c'est que je découpe chaque ligne en fonction des longueurs de chaque champ que je veux intégrer.

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Merci Frank pour ta réponse rapide.
    Super idée, ça fonctionne !!!

    Par contre je veux récupérer toutes les lignes de mon fichier,
    donc normalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    j := 0 to iNbreLignes -1 do
    seulement j'ai toujours le message 'Indice de liste hors limites'.
    Par contre les enregistrements sont bien dans ma table.

    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 St:TStringList;
    j, inbrelignes : integer;
    s : string;
    begin
    for j:=0 to iNbreLignes -1 do
        begin
             St:=TStringList.Create;
             St.LoadFromFile('D:\IN\test.txt');
             st.ValueFromIndex[j];
             S:=st.Strings[j];
             ADOQuery1.SQL.Clear;
             ADOquery1.SQL.Add('INSERT INTO Importacion ([NoIdentificador]) VALUES ("'+copy(S,3,5)+'");');
             ADOQuery1.ExecSQL;
        end;
    end;
    Là, ça dépasse mes capacités de débutant !

  4. #4
    Membre expérimenté
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Points : 1 392
    Points
    1 392
    Par défaut
    L'indice doit commencer à 1 et pas à 0.

    Le mein commence à 2 parce que la première ligne correspond à l'entête du fichier.

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Rien à faire...
    Si je mets l'indice à 1, il me manque la première ligne (mon fichier n'a pas d'en-tête).
    Dans tous les cas, la dernière ligne n'est jamais prise en compte.

    Si je prend le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For j := 0 to inbrelignes -1 Do
    J'ai bien ma première ligne mais toujours pas la dernière ?!?

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 68
    Points : 66
    Points
    66
    Par défaut Re: Importer un fichier texte
    Citation Envoyé par po.lombard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Var St:TStringList;
    i : integer;
    begin
      St:=TStringList.Create;
      St.LoadFromFile('D:\IN\test.txt');
      st.Delimiter := ' ';
      For i := 0 to st.Count-1 do
      begin
          st.DelimitedText := st[i];
          ADOQuery1.SQL.Add('INSERT INTO Importation ([NoId]) VALUES ("'+st[i]+'")');
      end;
    end;
    Mais je ne récupère que le premier caractère et Delphi affiche : indice de liste hors limites (1).

    Des idées ?
    Merci d'avance.
    Tu as oublié d'indiquer quel était le texte à délimiter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Var St:TStringList;
    i : integer;
    begin
      St:=TStringList.Create;
      St.LoadFromFile('D:\IN\test.txt');
      st.Delimiter := ' ';
      st.DelimitedText(st.text);
      For i := 0 to st.Count-1 do
      begin
          st.DelimitedText := st[i];
          ADOQuery1.SQL.Add('INSERT INTO Importation ([NoId]) VALUES ("'+st[i]+'")');
      end;
    end;
    [/code]

  7. #7
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 19
    Points : 12
    Points
    12
    Par défaut Re: Importer un fichier texte
    Citation Envoyé par Harvester

    Tu as oublié d'indiquer quel était le texte à délimiter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Var St:TStringList;
    i : integer;
    begin
      St:=TStringList.Create;
      St.LoadFromFile('D:\IN\test.txt');
      st.Delimiter := ' ';
      st.DelimitedText(st.text);
      For i := 0 to st.Count-1 do
      begin
          st.DelimitedText := st[i];
          ADOQuery1.SQL.Add('INSERT INTO Importation ([NoId]) VALUES ("'+st[i]+'")');
      end;
    end;
    ce code ne semble pas fonctionner non plus,
    st.DelimitedText(st.text) ne semble pas fonctionner.

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 68
    Points : 66
    Points
    66
    Par défaut
    C'est normal, je n'a ipas corrigé jusqu'au bout désolé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Var St:TStringList;
    i : integer;
    begin
      St:=TStringList.Create;
      St.LoadFromFile('D:\IN\test.txt');
      st.Delimiter := ' ';
      st.DelimitedText(st.text);
      For i := 0 to st.Count-1 do
      begin
          ADOQuery1.SQL.Add('INSERT INTO Importation ([NoId]) VALUES ("'+st[i]+'")');
      end;
    end;

  9. #9
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Désolé, mais ça ne marche toujours pas.
    Lors de la compil, il m'indique qu'il manque un point virgule ou un opérateur à ligne "st.delimitedtext(st.text)".

  10. #10
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 68
    Points : 66
    Points
    66
    Par défaut
    Hm ? Plus qu'étrange, vérifie bien si ton copier coller était bon, étonnant

  11. #11
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Harvester,
    je te confirme que ce code ne fonctionne pas :

    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
    procedure TTransfert.FormShow(Sender: TObject);
    Var St:TStringList;
    i : integer;
    s : string;
    begin
      St:=TStringList.Create;
      St.LoadFromFile('D:\IN\test.txt');
      st.Delimiter := ' ';
      s := st.DelimitedText(st.text);
      For i := 0 to st.Count-1 do
      begin
          st.DelimitedText := st[i];
          showmessage('INSERT INTO Importation ([NoId]) VALUES ("'+st[i]+'")');
      end;
    end;
    [Erreur] apli_transfert.pas(79): E2066 Opérateur ou point-virgule manquant.

    Pour des raisons de formatage de mon fichier texte, j'utilise la méthode de Frank, ce qui donne :
    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
    begin
             St:=TStringList.Create;
             St.LoadFromFile('D:\IN\02132.txt');
             showmessage(inttostr(st.Count+1));
    for j:=0 to iNbreLignes do
        begin
             st.ValueFromIndex[j];
             S:=st.Strings[j];
     
             NoIdentificador := Copy(S,3,5);
             Hora := Copy(S,10,8);
             NoLote := Copy(S,19,6);
             Posicion := Copy(S,26,4);
             Referencia := Copy(S,31,13);
             Cantidad := Copy(S,59,1);
             Fecha := Copy(S,61,10);
             ModoRegistro := Copy(S,1,1);
     
             ADOQuery1.SQL.Clear;
             ADOquery1.SQL.Add('INSERT INTO Importacion ([NoIdentificador], [Hora], [NoLote], [Posicion], [Referencia], [Cantidad], [Fecha], [ModoRegistro]) VALUES ("'+NoIdentificador+'", "'+Hora+'", "'+NoLote+'", "'+Posicion+'", "'+Referencia+'", "'+Cantidad+'", "'+Fecha+'", "'+ModoRegistro+'");');
             ADOQuery1.ExecSQL;
        end;
    end;
    L'importation se fait correctement mais je reçois toujours le message "Indice de liste hors limites" et il me manque la dernière ligne de mon fichier,
    qu'en pensez-vous?

  12. #12
    Membre expérimenté
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Points : 1 392
    Points
    1 392
    Par défaut
    Combien de lignes contient ton Tstringlist une fois le fichier importé ? (cela doit correspondre à la valeur de iNbreLignes )

    A quoi sert le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    showmessage(inttostr(st.Count+1))
    ?

  13. #13
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    showmessage(inttostr(st.Count+1))
    ne sert à rien, c'était justement pour voir le nombre de ligne du TstringList.

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    begin
             St:=TStringList.Create;
             St.LoadFromFile('D:\IN\02132.txt');
             showmessage(inttostr(st.Count));
             showmessage(inttostr(iNbreLignes));
    for j:=0 to iNbreLignes do
    ...
    st.Count = 186
    iNbreLignes = 4637624 ???

  14. #14
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 68
    Points : 66
    Points
    66
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TTransfert.FormShow(Sender: TObject);
    Var St:TStringList;
    i : integer;
    s : string;
    begin
      St:=TStringList.Create;
      St.LoadFromFile('D:\IN\test.txt');
      st.Delimiter := ' ';
      st.DelimitedText(st.text);
      For i := 0 to st.Count-1 do
          showmessage('INSERT INTO Importation ([NoId]) VALUES ("'+st[i]+'")');
    end;
    Hum hum...

  15. #15
    Membre expérimenté
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Points : 1 392
    Points
    1 392
    Par défaut
    Humm, inbreslignes doit être initialisé à 0 en début de traitement.

    Cela doit être ça, ton problème.

  16. #16
    Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 71
    Points : 43
    Points
    43
    Par défaut
    salut !
    j'ai exactement le mm prob. dès que le user appuis sur Ok de mon formulaire, les valeurs saisies sont insérées ds une base "interbase" via une procédure stockée. voici le code :
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
     
    // déclaration des variables
    var tPrenom: ShortString;
    var tNom: ShortString;
    var tAge: ShortString;
     
    begin
     
         // affectation des variables
         tPrenom := Edit1.Text;
         tNom := Edit2.Text;
         tAge := Edit3.Text;
     
         // préparation des paramètres
         StoredProc1.Params[1].AsString := Edit1.Text;
         StoredProc1.Params[2].AsString := Edit2.Text;
         StoredProc1.Params[3].AsString := Edit3.Text;
         //StoredProc1.Params[2].AsInteger := StrToInt(Edit3.Text);
     
         // appel de la procédure INSERT_DATA
         StoredProc1.Prepare;
         StoredProc1.ExecProc;
         StoredProc1.UnPrepare;
     
    end;
     
    end.
    dès que je valide le formulaire, j'ai le mesage d'erreur "indice de liste hors limites(1)"
    idem si je commence par 0 (StoredProc1.Params[0] ...) j'ai l'erreur "indice de liste hors limites(0)"

    merci de votre aide

  17. #17
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Bonjour à tous,
    Pour ce que ça intéresse, j'ai trouvé le bon code.
    Merci pour vos réponses qui m'ont mises sur la bonne voix !

    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
    Var St:TStringList;
    i : integer;
    s : string;
    NoIdentificador : string;
    Hora : string;
    NoLote : string;
    Posicion : string;
    Referencia : string;
    Cantidad : string;
    Fecha : string;
    ModoRegistro : string;
    begin
             St:=TStringList.Create;
             St.LoadFromFile('D:\IN\02132.txt');
     
    for i:=0 to st.Count-1 do
        begin
             st.ValueFromIndex[i];
             S:=st.Strings[i];
     
             NoIdentificador := Copy(S,3,5);
     
             ADOQuery1.SQL.Clear;
             ADOquery1.SQL.Add('INSERT INTO Importacion ([NoIdentificador]) VALUES ("'+NoIdentificador+'");');
             ADOQuery1.ExecSQL;
        end;
    end;

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

Discussions similaires

  1. [VB6]Importer un fichier texte dans une table ACCESS
    Par jean-pierre96 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 26/02/2013, 15h55
  2. Réponses: 4
    Dernier message: 27/10/2005, 11h05
  3. Pb pour importer un fichier texte
    Par sam01 dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/09/2005, 13h16
  4. [VB.NET] Importation de fichier texte
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/05/2004, 09h39
  5. Importer des fichiers textes délimités
    Par Invité dans le forum Outils
    Réponses: 2
    Dernier message: 23/09/2002, 13h56

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