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 :

LineBreak d'un TStringList uniquement aux caractères #13#10


Sujet :

Delphi

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut LineBreak d'un TStringList uniquement aux caractères #13#10
    Bonjour,

    J'ai un fichier de 66 Mega et je l'ajoute dans un tstringlist, malheureusement il fait un LineBreak suplémentaire au caractère (#13 carriage return) et j'aimerai bien qu'il fasse uniquement un LineBreak aux caractères (#13#10 carriage return and line feed combination).
    example:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var
    ..
    SL2: TStringList; 
    ..
    begin
    ...
     SL2 := TStringList.Create;  
     SL2.Delimiter := #13; //  => ?? #13#10
     SL2.DelimitedText := #13#10;
     SL2.text :=  StreamToString(FileStream) ; <= fichier rechercher et ajouter dans la liste en block 
    ...
    end;
    Est-ce possible de dire dans un tstringlist d'ignorer le Delimiter caractère (#13 carriage return) et de dire de réagir uniquement aux caractères (#13#10) ?

    Je ne peux pas retirer le caractère (#13 seul) il doit être présent dans la liste.
    Quelle solution pouvez-vous me proposer, merci beaucoup pour l'aide.
    Ardely

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 549
    Par défaut
    salut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SL2.LineBreak = #13#10;

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut
    Merci pour ta réponse.
    En mettant LineBreak := #13#10 sa ne régle pas le problème j'ai toujours une ligne supplémentaire au caractère #13 !!

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 549
    Par défaut
    salut

    as tu pensé a vider le délimiter ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SL2.Delimiter :='';
    SL2.LineBreak = #13#10;

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut
    Si je mets rien dans le Delimiter j'ai une erreur de compilation, je pense que le Delimiter exige un caractère!

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 549
    Par défaut
    salut


    autre solution histoire de voir si il y a pas un autre soucis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var
    ..
    SL2: TStringList; 
    ..
    begin
    ...
     SL2 := TStringList.Create;  
     SL2.Delimiter := #13; //  => ?? #13#10
     SL2.text :=  StringReplace(StreamToString(FileStream),#10,'',  [rfReplaceAll, rfIgnoreCase]); 
    ...
    end;

  7. #7
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Bonsoir.

    As-tu essayé simplement SL2.LoadFromStream ?
    Sous Windows, tu n'auras une nouvelle ligne qu'après #13#10

    Remplir par "Text" : pas besoin de modifier le délimiteur, mais j'ai vu cette remarque (!??) :
    http://www.freepascal.org/docs-html/...ings.text.html

    Je programme sous Lazarus. Désolé, je ne peux pas t'en dire plus.

    Cordialement
    Thierry

  8. #8
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut
    Salut,
    J'ai fait ce que tu m'as proposer, en ramplacent #10 par '', j'ai toujours une autre ligne au caractère #13.
    J'ai testé également avec SL2.LoadFromStream et avec Listbox1.Items.LoadFromFile en ayant aussi toujours le même problème.

    J'ai essayé une autre solution qui fonctionne, que voici, mais cette Fonction dure extrêmement très très long pour 66 MB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var
    str : string;
     ....
     while not Eof(myFile) do
     begin
      ReadLn(myFile, str);
      SL2.Add(str);
      end;
      for I := 0 to SL2.Count - 1 do  Listbox1.Items.Add(SL2.Strings[i]); // Listbox1 pour voir si toute la ligne jusqu'au 1310 est bien prise
     ....
    Je conclu que ReadLn lit uniquement les caractères #13#10 et ignore les caractères #13 sans le #10 après !

    Si je regarde les caractères dans la listbox je vois bien un chr #13 en forme d'un petit carreau et le texte qui suit.
    Je ne comprend pas pourquoi ca ne fonctionne pas pour un TStringList ??

    Merci pour l'aide, salutations

  9. #9
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Bonjour.

    En examinant avec un editor hexadecimal un fichier texte provenant soit du bloc notes windows, soit d'un programme pascal , il n'y a jamais de #13 seul.
    Sauf bien sûr en cas de mauvaise manipulation : si dans un TextFile, j'écris : writeln('Bonjour' + #13) --> 13#13#10 !!!

    Je ne connais pas l'origine de ton fichier, mais il me semble évident qu'il devrait être réparé une fois pour toutes.
    Le plus simple est d'utiliser ta dernière méthode (readln), puis de supprimer les #13 du Listbox, ensuite de sauvegarder sur fichier le Listbox.
    Seuls les #13 non suivis d'un #10 devraient être supprimés.
    Par précaution : backup de ton fichier !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: integer;
    begin
      with ListBox1 do
        for i:= 0 to Count-1 do
          Items[i]:= StringReplace(Items[i], #13, '', [rfReplaceAll, rfIgnoreCase]);
    end;
    Cordialement
    Thierry

  10. #10
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 304
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 304
    Par défaut
    En regardant les sources, La TStringList analyse le texte que tu lui passes, et crée des lignes s'il y a un #13 et/ou un #10, si LineBreak est égal à #13#10 (sûrement pour une interropérabilité avec linux).
    Tu peux mettre LineBreak à #10, ça convient à peut près.

  11. #11
    Membre émérite
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 942
    Par défaut
    Citation Envoyé par Ardely Voir le message
    Je conclu que ReadLn lit uniquement les caractères #13#10 et ignore les caractères #13 sans le #10 après !
    #13 = Carriage return ( CR ) retour chariot : cela place le curseur en début de ligne

    #10 = Line Feed ( LF ) saut de ligne : cela place le curseur à la ligne suivante.

    Donc pour passer en début de ligne suivante, le #13 et le #10 sont indissociables.

  12. #12
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 549
    Par défaut
    salut

    s'est pour cela que j'avait demandé un test avec la suppression des #10

    en regardant de plus prés la TStringlist et en cherchant la mises a jour du text on vois très bien
    qu'il ne by-passe qu'une fois le #13#10
    tout se passe là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            Start := P;
            while not (P^ in [#0, #10, #13]) do 
             Inc(P);
            ...
            if P^ = #13 then Inc(P);
            if P^ = #10 then Inc(P);
    ce qui me met un doute sur ce que tu écrit
    comment peut tu avoir un #13 dans une zone de texte de ton Tstringlist est tu sur de la valeur du caractère ?

    si c'est le cas pour le coup je serais beaucoup plus violent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      StringReplace(StringReplace(StreamToString(FileStream),#10,'',  [rfReplaceAll, rfIgnoreCase]),#13,#13#10,[rfReplaceAll, rfIgnoreCase]);
    ou pour allez jusqu'au fond des chose on peut overrider la methode protected SetTextStr de la class TString

  13. #13
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut
    Merci beaucoup pour vos propositions.

    Les caractères qui sont dans un bloc-ligne, sont des caractères ASCI de 0-255, c’est-à-dire jusqu'au 1310 (exemple*: cryptage d'une ligne où sont permis tous les caractères à l'exception de 1310 qui définit la fin du bloc) c'est pour cette raison que je ne peux pas retirer les #13 seuls, mais qui me posent un problème dans un Tstringlist et qui réagi aussi aux #13 seuls.*!!!!

    Salutations
    Ardely

  14. #14
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    @Ardely

    Bon sang, n'as-tu pas vu mon post ?
    Sous Windows, tu ne peux pas avoir de #13 seul (non suivi par un #10) dans un fichier texte !
    Tu ne m'as pas répondu sur l'origine de ton fichier, mais il est certain qu'il a été drôlement manipulé ! (ou écrit sur un autre OS).
    C'est pour cette raison que je te proposais de le reconstituer à partir de ton ListBox dans lequel tu vois apparaître un caractère bizarre.

    Ceci étant dit, je ne m'explique pas le fait de la "présence visible" d'un #13.

    Cordialement
    Thierry

  15. #15
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 605
    Par défaut
    Est-on sûr que le "petit carré" visible est bien un #13 et non un autre caractère ?
    Le fichier a t-il été ouvert dans un simple éditeur de texte pour voir à quoi ressemble ce fichu caractère ?

  16. #16
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 569
    Billets dans le blog
    10
    Par défaut quelques problèmes
    Ta demande semble poser quelques problème.
    Tu ne peux pas traiter dans un string qui contient #0 d'autant plus dans un TstringList.
    Si tu as la maitrise du cryptage tu peux travailler sur 2-255 et réserver le #1 pour le traitement de CRLF #13#10
    Ais je été clair dans mes explications ?

  17. #17
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut
    Voici mes tests une après l'autre ...
    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
     
        for I := 1 to 255 do  str :=  str + Char((integer(ord(i)))) ;
        SL2.Text := str;
        showmessage(inttostr(SL2.count)) ; // count a le nombre trois
        SL2.SaveToFile('Sltest.AS');  // ouvrir fichier sous windows  // résultat trois lignes
        ...
        listbox1.Items.LoadFromFile('Sltest.AS'); // résultat trois lignes
        ...
        listbox1.Items.Add(str); // résultat (aucune LineBreak) une ligne complète   <=== (?)
        ...
        RichEdit1.Lines.Add(str);  // résultat trois lignes  <==== (?)
        ...    
        listbox1.Items.Text := str;  // résultat trois lignes
     
        // analyse des chr
        for I := 1 to length(SL2.text) do  showmessage(SL2.text[i]+ ' - ' +  inttostr(ord(SL2.text[i])));
    Si ce n'est pas posible avec un tstringlist je dois chercher une autre solution
    Merci pour votre aide

Discussions similaires

  1. Appliquer une macro uniquement aux lignes visibles
    Par Mickrey dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/10/2007, 14h26
  2. [MySQL] Problème de requête dû aux caractères accentués
    Par conics dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 10/08/2007, 16h35
  3. [PHP-JS] passer de UTF8 aux caractères grecs ?
    Par caillon dans le forum Langage
    Réponses: 2
    Dernier message: 08/12/2006, 10h50
  4. [deb]Accéder aux caractères d'une string
    Par Raideman dans le forum C++
    Réponses: 4
    Dernier message: 22/08/2006, 15h28
  5. SELECT insensible aux caractères accentués
    Par kaptnkill dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 26/05/2006, 15h24

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