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 :

Rechercher une chaine dans un fichier


Sujet :

Langage Delphi

  1. #1
    Membre du Club Avatar de bigey3
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2007
    Messages : 124
    Points : 50
    Points
    50
    Par défaut Rechercher une chaine dans un fichier
    salut,

    j'ai fichier que je souhaiterais parcourir à la recherche d'une valeur commencant par [228
    chaque chaine commencant par [228 trouvé devra etre écrit sur une ligne dans un autre fichier txt.

    voici un extrait du fichier.

    Removed 0 records from the SubscriberDisconnect table for subscribers that do not exist on AccountMSISDN.
    DisconnectSubscriber SUCCESS for SubscriberID [4856] PhoneNumber [2289405374].
    DisconnectSubscriber SUCCESS for SubscriberID [6332] PhoneNumber [2289408833].
    DisconnectSubscriber SUCCESS for SubscriberID [8108] PhoneNumber [2289413143].
    DisconnectSubscriber SUCCESS for SubscriberID [11035] PhoneNumber [2289421386].

    merci de me donner un coup de main

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 790
    Points : 25 779
    Points
    25 779
    Par défaut
    SearchStringInFile ou SearchStringInBigFile , la 2nde étant plus rapide ...

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Tu fais SearchString='PhoneNumber [228' pour appeler SearchStringInBigFile cité par ShaiLeTroll qui te renverra le tableau 'OffSets' qui contiendra les positions des occurences trouvées dans le fichier
    et ensuite ça oblige à relire le fichier une deuxième fois pour en extraire les numéros de téléphone (10 caractères) à partir des positions + length('PhoneNumber [');

    Mais si ton fichier n'est pas trop long tu peux lire ton fichier texte ligne par ligne dans une boucle dans laquelle tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    po:=pos('PhoneNumber [228',maLigne);
    if po>0 then
    begin numero:=copy(maLigne, po+length('PhoneNumber [', 10);
            StringListNum.Add(numero);
    end;
    ... et ensuite à la sortie de la boucle tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    StringListNum.SaveToFile();
    pour sauver sur le disque le résultat accumulé dans la stringList.
    ( ne pas oublier avant la boucle de faire StringListNum:=TStringList.create);

    A+

  4. #4
    Membre du Club Avatar de bigey3
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2007
    Messages : 124
    Points : 50
    Points
    50
    Par défaut j'ai rien pigé
    salut

    j'avoue n'avoir rien compris.
    comment rassembler tout sa pour faire un code cohérent.

    merci de me donner un coup de pouce.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 790
    Points : 25 779
    Points
    25 779
    Par défaut
    Tu ne fais aucun effort, allez, je ponds ça directement sur le forum, surement erreur de syntaxe et erreur de runtime, tu peux au moins debugger ... c'est ni plus ni moins l'algo présenté par Gilbert Geyer à partir de ma fonction SearchStringInBigFile

    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 ExtractPhone(const SourceFileName, PhoneFileName: string);
    const
      PHONE_LEN = 10;
    var
      OffSets: TIntegerDynArray; // uses Types;
      I: Integer;
      StreamSrc, StreamDest: TFileStream;
      gap: Integer;
      Phone: string[PHONE_LEN];
    begin
      if SearchStringInBigFile(SourceFileName, 'PhoneNumber [228', OffSets, True, MaxInt, False, False) > 0 then
      begin
        gap := Length('PhoneNumber ['); // Si 228 inclu !
        StreamSrc := TFileStream.Create(SourceFileName, fmOpenRead);
        try
          DeleteFile(PhoneFileName);
          StreamDest := TFileStream.Create(PhoneFileName, fmCreate);
          try
            for I := Low(OffSets) to High(OffSets) do
            begin
              StreamSrc.Seek(OffSets[I] + gap, soBeginning);
              StreamSrc.Read(Phone[1], PHONE_LEN);
              StreamDest.Write(Phone[1], PHONE_LEN);
              StreamDest.Write(BreakLine[1], Length(BreakLine)); // BreakLine: string = #13#10; existe dans delphi, je sais plus où
            end;
          finally
            StreamDest.Free();
          end;
        finally
          StreamSrc.Free();
        end;
      end;
    end;

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Je me permet juste d'ajouter que la constante pour le retour chariot est sLineBreak, disponible dans l'unité System donc partout par défaut

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 790
    Points : 25 779
    Points
    25 779
    Par défaut
    Merci Aka, je savais bien que ça existait ... , je ne savais plus où, et je n'avais pas delphi sur le poste où j'était lorsque je tapais ce message ...

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Bizarre : J'ai testé la procedure ExtractPhone(const SourceFileName, PhoneFileName: string); de ShaiLeTroll qui utilise la version SearchStringInBigFile qui permet , si besoin est, de comptabiliser les occurrences de cheveauchement et ça n'a pas marché.
    Après avoir galéré pour trouver le bug j'ai remplacé cette version de SearchStringInBigFile par sa version N-1 qui ne gère pas les occurrences de cheveauchement et enfin ça a marché.
    Donc je signale à toutes fins utiles qu'il doit y avoir un bug de nature inconnue (pas de message d'erreur) dans la version qu'on trouve via le lien cité plus haut dans le message de ShaiLeTroll du 27/05/2008 18h37.

    A+

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 790
    Points : 25 779
    Points
    25 779
    Par défaut
    tu as testé en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if SearchStringInBigFile(SourceFileName, 'PhoneNumber [228', OffSets, True, MaxInt, False, False) > 0 then
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if SearchStringInBigFile(SourceFileName, 'PhoneNumber [228', OffSets, True, MaxInt, False) > 0 then
    Sinon, si cela fonctionne au moins avec l'une des variantes, c'est que mon code fonctionne, tu as du corrigé autre chose ?

    EDIT : Tient, sur le forum, ce n'est pas la dernière version de BigFile !
    Yep, c'est un bug de Casse, j'étais en train de la modifier pour l'optimiser quand je l'ai mise sur le forum, et j'avais pas fini ! voici la bonne version de SearchStringInBigFile (j'ai mis à jour aussi le lien, pour qu'il pointe ici, autant ne pas mutiplier les version) :


    EDIT 2 : Code Effacé car Incorrect voir ICI

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    A ShaiLeTroll :
    tu as testé en remplaçant ... par ...
    ... exact.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tu as du corrigé autre chose ?
    ... oui, mais c'est des broutilles : pour faire marcher le code sous Delphi-5 j'ai été obligé :
    - de déclarer le Type TIntegerDynArray = array of Integer;
    - et de remplacer dans la procedure ExtractPhone le BreakLine puis le sLineBreak(*) par une constante locale (const CRLF = #13#10; ) et du coup j'ai également remplacé StreamDest.Write(BreakLine[1], Length(BreakLine)) par StreamDest.Write(CRLF[1], 2) puisque le Length est constant et égal à 2.

    En plus le compilo a trébuché sur la ligne StreamSrc.Seek(OffSets[i] + gap, soBeginning); : avec soFromBeginning le pb est réglé.

    Je viens de tester ta dernière mouture de SearchStringInBigFile : cette fois-ci ça a marché immédiatement.

    (*) A propos de sLineBreak : sous Delphi-5 il décleche le message d'erreur Identificateur non déclaré : 'sLineBreak' et si j'ajoute 'System' dans le uses c'est le message d'erreur Identificateur redéclaré : 'System' qui bloque : d'où la création de la constante locale CRLF.

    A+

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 790
    Points : 25 779
    Points
    25 779
    Par défaut
    Ah oui, moi aussi, parfois il m'ajoute SysInit ou System dans les uses parce que j'ai utilisé le CTRL+ESPACE, alors que ces deux unités sont implicites, très con ... bon, sinon ça doit ça pour D6 ... (pour D5 semble falloir suivre les modifs de Gilbert Geyer)

    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 ExtractPhone(const SourceFileName, PhoneFileName: string);
    const
      PHONE_LEN = 10;
    var
      OffSets: TIntegerDynArray; // uses Types;
      I: Integer;
      StreamSrc, StreamDest: TFileStream;
      gap: Integer;
      Phone: string[PHONE_LEN];
    begin
      if SearchStringInBigFile(SourceFileName, 'PhoneNumber [228', OffSets, True, MaxInt, False, False) > 0 then
      begin
        gap := Length('PhoneNumber ['); // Si 228 inclu !
        StreamSrc := TFileStream.Create(SourceFileName, fmOpenRead);
        try
          DeleteFile(PhoneFileName);
          StreamDest := TFileStream.Create(PhoneFileName, fmCreate);
          try
            for I := Low(OffSets) to High(OffSets) do
            begin
              StreamSrc.Seek(OffSets[i] + gap, soBeginning);
              StreamSrc.Read(Phone[1], PHONE_LEN);
              StreamDest.Write(Phone[1], PHONE_LEN);
              StreamDest.Write(sLineBreak[1], Length(sLineBreak));
            end;
          finally
            StreamDest.Free();
          end;
        finally
          StreamSrc.Free();
        end;
      end;
    end;
    pour le Stream, l'enum aurait été ajouté en D6 ? c'est pour forcer la version Int64 du Seek, il différencie un entier d'une enum lors du lien de la méthode ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    { TStream seek origins }
     
      soFromBeginning = 0;
      soFromCurrent = 1;
      soFromEnd = 2;
     
    type
    { TStream seek origins }
      TSeekOrigin = (soBeginning, soCurrent, soEnd);

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-bonjour,

    pour le Stream, l'enum aurait été ajouté en D6 ? C'est con, c'est redondant ...
    ... ça peut aussi résulter d'une sorte d'harmonisation lors du passage de D5 vers D6 vu que d'autres paramètres d'autres méthodes ou fonctions sont souvent encapsulés dans une énum.
    ... mais heureusement que le compilo détecte le problème si on confond soFromBeginning avec soBeginning.

    A+

  13. #13
    Membre du Club Avatar de bigey3
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2007
    Messages : 124
    Points : 50
    Points
    50
    Par défaut merci
    merci à tous pour votre participation.j'ai appris à travrs les échanges un peu plus.

    je crois très bientot j'aurais plus d'expérience en delphi avec nos échanges sur le forum.

Discussions similaires

  1. Rechercher une chaine dans un fichier
    Par kali38 dans le forum Général Python
    Réponses: 8
    Dernier message: 27/05/2011, 22h56
  2. Recherche d'une chaine dans un fichier distant
    Par nitramm dans le forum ASP
    Réponses: 3
    Dernier message: 20/08/2008, 17h49
  3. Rechercher une chaine dans un fichier Excel
    Par matcram dans le forum ASP
    Réponses: 1
    Dernier message: 03/10/2007, 22h59
  4. [code]Recherche d'une chaine dans des fichiers
    Par guillaume_pays_ceven dans le forum Contribuez
    Réponses: 5
    Dernier message: 21/06/2007, 15h32

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