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 :

Importer un fichier .txt


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Par défaut Importer un fichier .txt
    bonjour,


    Je souhaiterais comparer deux fichiers (de type .txt) entre eux et ensuite afficher les différences qu'il y a entre ces deux fichiers.

    Pour cela, j'ai commencé par essayer d'envoyer le premier fichier vers une ztable (qui serait donc "temporaire"). Cette ztable est reliée à un fichier Acess(vide) et c'est dans ce fichier que je voudrais que soient enregistrées les informations venant du fichier .txt. Mais je ne sais pas du tout comment faire. Quelqu'un pourrait me donner une piste?

    Donc pour l'instant j'ai juste ceci, où je sélectionne le premier fichier via le bouton rechercher.
    Nom : Capture.PNG
Affichages : 523
Taille : 3,9 Ko


    D'avance merci!

  2. #2
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 510
    Par défaut
    Bonjour,
    tu peux lire chaque fichier ligne à ligne, et les comparer avec les fonctions CompareText ou CompareStr (sensible à la casse ou non)

    A+
    Charly

  3. #3
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Par défaut
    D'accord merci, je ne connaissais pas cette fonction.

    Donc pour l'instant j'ai ceci, qui me permets de sélectionner les deux fichiers à comparer
    Nom : Capture.PNG
Affichages : 520
Taille : 7,0 Ko

    J'ai beau lire la doc qu'il y a sûr embarcadero et sur Google, je ne comprends pas comment utiliser comparetext... . Et comme je débute, c'est pas évident ... .


    function CompareText(const S1, S2: string): Integer;
    function CompareText(const S1, S2: string; LocaleOptions: TLocaleOptions): Integer;

    Je dois remplacer S1 et S2 par les noms des fichiers respectifs que je souhaite analyser?


    Ce que j'avais essayé c'était quelque chose comme ça :
    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
    procedure TFprinc.btnOkClick(Sender: TObject);
    begin
      fichier1 := OpenDialog1.Files;
      fichier2 := OpenDialog2.Files;
         while EOF(fichier1)=false DO
              begin
              Readln(fichier1);
              reset(fichier2);
                  while EOF(fichier2)=false do
                  begin
                    Readln(fichier2);
                    if (fichier1 = fichier2) then
                        begin
                          ShowMessage('test');
                        end;
    	          end;
    	closefile(fichier2);
    end;
    closefile(fichier1);

  4. #4
    Membre très actif
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Par défaut
    Salut je croix que tu vas tous trouver ici sur la manipulation des fichier txt.

  5. #5
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Par défaut
    Citation Envoyé par bm1990 Voir le message
    Salut je croix que tu vas tous trouver ici sur la manipulation des fichier txt.
    edit : ok j'avais pas vu le lien, merci. Je vais essayer ça

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 598
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    ce que bm1990 tente de dire avec sa croix c'est que tu manques de connaissance de traitement sur les fichiers text et comme il a oublié d'indiquer le lien c'est sur que c'est moins évident encore
    donc voici au moins un lien sur un tutoriel http://bodman.developpez.com/ESdelphi/
    et le lien sur l'aide de référence http://docwiki.embarcadero.com/RADSt...d_Input-Output

    pour en revenir à ton "squelette" de code la première chose est d'ouvrir les fichiers : assignfile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var fichier1,fichier2 : TextFile;
     ...
    begin 
      AssignFile(fichier1,OpenDialog1.FileName);
      AssignFile(fichier2,OpenDialog2.FileName);
    et ne pas oublier de positionner au début
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    reset(fichier1);
    reset(fichier2);
    une fois ceux-ci il faut récupérer la "même" ligne sur chacun des deux fichiers et ce dans des variables soit l'utilisation de Readln
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
     ligne1,ligne2 : String;
     ...
    begin
      ....  // les ouvertures
      Readln(Fichier1,ligne1);
      Readln(Fichier2,ligne2);
    ainsi tu pourras utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if CompareText(ligne1,ligne2) then .....
    reste la logique de la boucle, telle qu'indiquée dans ton squelette tu ne fait pas une comparaison ligne par ligne mais plutôt une recherche d'une ligne du fichier1 dans le fichier2. Mais ça c'est une question de logique de programmation à revoir

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par bertrantitude Voir le message
    edit : ok j'avais pas vu le lien, merci. Je vais essayer ça
    Quel lien ? Quelqu'un a vu un lien ?

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    procedure TFdeux.CompareStringLists(List1, List2: TStringList; Missing1, Missing2: TStrings);
      var
    ...

  9. #9
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Par défaut
    Désolé j'aurai du le voir qu'il manquait tfdeux... . J'étais persuadé que ça venait du ";" de procedure CompareStringLists(List1, List2: TStringList; Missing1, Missing2: TStrings);



    @goustifruit Ben je t'assure qu'avec le code précédent, qui fonctionnait, pour comparer deux fichiers de 10.000 (longues) lignes c'était parti pour prendre (au moins) 4 heures... .


    Maintenant j'ai droit à un un "valeur de propriété incorrect"

    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
    program Project1;
    
    uses
      Forms,
      uprinc in 'uprinc.pas' {FPrinc},
      udeux in 'udeux.pas' {Fdeux},
      udatamod in 'udatamod.pas' {DataMod: TDataModule};
    
    {$R *.res}
    
    begin
      Application.Initialize;
      Application.CreateForm(TFPrinc, FPrinc);
      Application.CreateForm(TFdeux, Fdeux);
      Application.CreateForm(TDataMod, DataMod); // c'est ici que ça bloque
      Application.Run;
    end.
    alors que pourtant il n'y a rien de spécial dans le datamodule

    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
    unit udatamod;
     
    interface
     
    uses
      SysUtils, Classes;
     
    type
      TDataMod = class(TDataModule)
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      DataMod: TDataMod;
     
    implementation
     
    {$R *.dfm}
     
    end.

    J'en déduis que ça doit venir de ceci mais je ne trouve pas d'où...

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    procedure tfdeux.CompareStringLists(List1, List2: TStringList; Missing1, Missing2: TStrings);
      var
      i, j   : Integer ;
       begin
            List1.Sort;                                                               //on trie la list1
            List2.Sort;                                                                //on trie la list1
            I := 0;                                                                      //on initialise i à 0
            J := 0;                                                                             //on initialise j à 0
                    while (I < List1.Count) and (J < List2.Count) do        // tant qu'on est pas à la fin de list1 et list2
                             begin
                                      if List1[I] < List2[J] then
                                             begin
                                             Missing2.Add(List1[I]);               // on ajoute ce qu'il manque dans missing2 ce qu'il manque dans la list1
                                             Inc(I);                                     //  Un passe au suivant(incrémente i)
                                             end
                                     else if List1[I] > List2[J] then
                                             begin
                                             Missing1.Add(List2[J]);               // on ajoute ce qu'il manque dans missing2 ce qu'il manque dans la list1
                                             Inc(J);                                         // on passe au suivant
                                             end
                                     else
                                             begin
                                             Inc(I);
                                             Inc(J);
                                             end;
                             end;
                   for I := I to List1.Count - 1 do                              // le -1 je suppose que c'est pcq on commence à compter à partir de 0
                              Missing2.Add(List1[I]);                                                       // ces 4 lignes servent à quoi?
                    for J := J to List2.Count - 1 do
                              Missing1.Add(List2[J]);
       end;
    procedure TFdeux.btncompareclickClick(Sender: TObject);
    var
      List1: TStringList;
      List2: TStringList;
    begin
      List1 := TStringList.Create;                          // on créée un stringlist list 1
      List2 := TStringList.Create;                           // on créée un stringlist list 2
      
    
      try
        List1.LoadFromFile(nom1);                      // on charge le fichier nom1
        List2.LoadFromFile(Nom2);                      // on charghe le fichier nom2
        Memo2.Lines.Assign(List1);                     // on envoie la list1 dans le memo2
        Memo3.Lines.Assign(List2);                     // on envoie la list2 dans le memo3
        CompareStringLists(List1, List2, Memo2.Lines, Memo3.Lines); // on compare le tout
    
      finally
        List2.Free;                              // on vide
        List1.Free;                              // on vide
      end;
    
    end;

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par bertrantitude Voir le message
    Maintenant j'ai droit à un un "valeur de propriété incorrect"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                   for I := I to List1.Count - 1 do                              // le -1 je suppose que c'est pcq on commence à compter à partir de 0
                              Missing2.Add(List1[I]);                                                       // ces 4 lignes servent à quoi?
                    for J := J to List2.Count - 1 do
                              Missing1.Add(List2[J]);
    Y a rien qui te choque, ci-dessus ? Je le refais en plus court :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      for I := I to List1.Count - 1 do    // le -1 je suppose que c'est pcq on commence à compter à partir de 0 --> YES
    Et donc tu commences à compter à partir de ???


    Citation Envoyé par bertrantitude Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    // ces 4 lignes servent à quoi?
    Je ne sais pas, ça dépend de ce que fait le prog, et la procédure Missing1

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    Pourrait-on avoir un extrait de chaque fichier à comparer ?

  12. #12
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2016
    Messages : 73
    Par défaut
    Citation Envoyé par GoustiFruit Voir le message
    Pourrait-on avoir un extrait de chaque fichier à comparer ?
    test1.txt
    test2.txt

    Voici le type de fichier (avec beaucoup moins de ligne car sinon ça dépasse les 64ko). Ici comme je n'avais qu'un seul fichier, j'ai fait des modifications mineures afin d'en avoir un second. Mais de toute façon, ce sont rarement des changements de plusieurs caractères.


    @jipité : c'est le fait qu'au dessus, j'ai déjà "I := 0; J := 0;" et que donc ils ont déjà été initialisés? Sinon je vois pas

  13. #13
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par bertrantitude Voir le message
    @jipité : c'est le fait qu'au dessus, j'ai déjà "I := 0; J := 0;" et que donc ils ont déjà été initialisés? Sinon je vois pas
    J'ai dû très mal m'exprimer, désolé, plus le fait que j'étais persuadé qu'on ne pouvait pas modifier une variable de boucle (et je viens de faire un test et, oui, c'est possible), donc mettons que je n'ai rien dit.

    Par contre, j'ai déjà "I := 0; J := 0;", non, car ton code au début des boucle "For" est avant truffé de Inc(I) et Inc(J) donc, non, tu ne dois pas commencer à zéro, là (je n'avais pas regardé au-dessus, ce midi, persuadé qu'on ne pouvait pas modifier la variable).

    Pas d'autre idée, je passe (pas confortable du tout de regarder du code dans ces petites fenêtres du forum).

  14. #14
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Citation Envoyé par Jipété Voir le message
    pas confortable du tout de regarder du code dans ces petites fenêtres du forum
    le 'Visualiser dans une fenêtre à part' ne sert que pour les chiens

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

Discussions similaires

  1. [SQLServer]Script import fichier .txt
    Par Jenbi dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/08/2006, 16h49
  2. Importer fichiers txt d'un dossier dans une table
    Par avantoux dans le forum Access
    Réponses: 16
    Dernier message: 28/12/2005, 12h13
  3. import fichier TXT via ACCESS
    Par lepierre dans le forum Access
    Réponses: 4
    Dernier message: 03/12/2005, 06h52
  4. import fichier txt
    Par nogood1 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 05/10/2005, 11h33
  5. Pb import fichier txt avec lignes de longueurs diverses
    Par zebulon90 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/12/2004, 08h32

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