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 :

Stringreplace CR par CRLF


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 476
    Par défaut Stringreplace CR par CRLF
    Hello,
    Je tente de remplacer dans un string les CR par CRLF à l'aide de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CRLF := chr(13) + chr(10);
    CR := chr(13);
    T  := stringreplace(S, CR, CRLF,[rfReplaceAll, rfIgnoreCase]);
    ou via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T  := stringreplace(S, #13, #13#10,[rfReplaceAll, rfIgnoreCase]);
    Mais sans résultat

    J'ai bien vérifié que ma chaine initiale contient bien des CR (Notepad++)


    Merci pour vos idées...

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 489
    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 489
    Par défaut
    salut

    essai ceci est dis moi si cela fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      S  := stringreplace(S, #13, #0,[rfReplaceAll, rfIgnoreCase]); 
      T  := stringreplace(S, #0, #13#10,[rfReplaceAll, rfIgnoreCase]);

  3. #3
    Membre éclairé
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 476
    Par défaut
    Salut Anapurna et merci pour ta réponse ;-)
    J'ai testé dans ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
          AssignFile(F,Opendialog1.FileName);
          Reset(F);
           Readln(F,S);
           if pos(#13#10,S)=0 then
           begin
           S  := stringreplace(S, #13, #0,[rfReplaceAll, rfIgnoreCase]);
           T  := stringreplace(S, #0, #13#10,[rfReplaceAll, rfIgnoreCase]);
           rewrite(F);
           Writeln(F,T);
           Closefile(F);
    Le résultat me renvoie le fichier supprimé de tous ces CR et terminé par CR/LF

    Idem quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    S  := stringreplace(S, #13, '??',[rfReplaceAll, rfIgnoreCase]);
    T  := stringreplace(S, '??', #13#10,[rfReplaceAll, rfIgnoreCase]);
    Le fichier initial contient 1 ligne contenant des CR
    Je souhaite les remplacer par des CR/LF

    Merci pour ton aide...
    ;-)

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 675
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    Il me semble qu'en passant par un TStringList, ça remplace par défaut les #13 en #13#10.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var
      t : TStringlist;
      s : string;
    begin
      s := 'ma chaine'+#13+'suite';
      t := TStringList.Create;
      t.Text := s;
      s := t.text;
      t.Free;
    end;
    Si tu veux lire un fichier, lancer la conversion et écrire le résultat dans le fichier, tu peux aussi passer par le TStringList : il suffit d'appeler sa méthode LoadFromFile pour charger le fichier puis tout de suite après sa méthode SaveToFile pour enregistrer...
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 489
    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 489
    Par défaut
    salut

    tu ecrit :
    AssignFile(F,Opendialog1.FileName);
    Reset(F);
    Readln(F,S);
    if pos(#13#10,S)=0 then
    begin

    S := stringreplace(S, #13, #0,[rfReplaceAll, rfIgnoreCase]);
    T := stringreplace(S, #0, #13#10,[rfReplaceAll, rfIgnoreCase]);
    rewrite(F);
    Writeln(F,T);
    Closefile(F);
    eu le test sert a quoi ?
    imaginons que tu veuille remplacer tout les CR selon le system ou tu te trouve
    je ferais comme ceci

    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
     
    const
        sLineBreak = {$IFDEF LINUX} AnsiChar(#10) {$ENDIF} 
                            {$IFDEF MSWINDOWS} AnsiString(#13#10) {$ENDIF};
     
      // sous Windows
        CRLF =  #13#10;
        CR    =  #13 ;// (carriage return)
        LF     = #10  ;//(line feed)
     
     Begin
        AssignFile(F,Opendialog1.FileName);
        Reset(F);
        Readln(F,S);
        S  := stringreplace(S, CRLF, LF,[rfReplaceAll, rfIgnoreCase]);
        S  := stringreplace(S, CR , LF,[rfReplaceAll, rfIgnoreCase]);
        T  := stringreplace(S, LF, sLineBreak,[rfReplaceAll, rfIgnoreCase]);
        rewrite(F);
        Writeln(F,T);
        Closefile(F);
    end;

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    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
    19
    var
      S, S2: string;
      T, T2: string;
      I: Integer;
    begin
      S := 'ABC'#13'DEF'#13#10'GHI'#13'JKL'#13#10'MNO';
      T := StringReplace(S, #13, #13#10, [rfReplaceAll, rfIgnoreCase]);
      for I := 1 to Length(T) do
        if Ord(T[I]) >= 32  then
          T2 := T2 + T[I]
        else
          T2 := T2 + '#' + IntToStr(Ord(T[I]));
      for I := 1 to Length(S) do
        if Ord(S[I]) >= 32  then
          S2 := S2 + S[I]
        else
          S2 := S2 + '#' + IntToStr(Ord(S[I]));
      ShowMessage(S2 + ' -> ' + T2);
    end;
    Cela fonctionne parfaitement pourtant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ABC#13DEF#13#10GHI#13JKL#13#10MNO -> ABC#13#10DEF#13#10#10GHI#13#10JKL#13#10#10MNO

    Sinon c'est pour cela que dans ma classe TSLTTextFileReader de lecture de fichier j'ai prévu la lecture en CR ou en LF (implicitement CRLF)

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    //------------------------------------------------------------------------------
    function TSLTTextStreamReaderAnsi.ReadLineRaw(AIndexFile: TFileStream; AUseCROnly: Boolean; const Index, OffSet: Int64): string;
    const
      BUF_SIZE = 1024;
      LF: Byte = 10;
      CR: Byte = 13;
    var
      TextBuf: array[0..BUF_SIZE-1] of Byte;
      IndexRec: TSLTTextFileReaderIndex;
      iBuf, Readed: Integer;
      AByte: Byte;
      LastIsCR: Boolean;
      LineReaded: Int64;
      EndOfLine: Byte;
    begin
      // Positionnement au début du Fichier ou sur le Curseur de lecture linéaire
      FTextStream.Seek(OffSet, soBeginning);
     
      // Compteur/Index/Drapeau à Zéro
      IndexRec.OffSet := OffSet;
      IndexRec.Length := 0;
      LastIsCR := False;
      if AUseCROnly then
        EndOfLine := CR // Compatible MacOS avec CR isolé
      else
        EndOfLine := LF; // Compatible Windows couple CR LF et Linux LF
      LineReaded := 0;
      // Boucle jusqu'à la fin
      while (FTextStream.Position < FTextSize) do
      begin
        Readed := FTextStream.Read(TextBuf, BUF_SIZE);
        for iBuf := 0 to Readed - 1 do
        begin
          AByte := TextBuf[iBuf];
          if (AByte = EndOfLine) then
          begin
            FLinearPosition := FTextStream.Position - Readed + iBuf;
            IndexRec.Length := FLinearPosition - IndexRec.OffSet;
            Inc(FLinearPosition); // car on n'inclu pas la fin de ligne dans la prochaine ligne
            if not AUseCROnly and LastIsCR then
              Dec(IndexRec.Length); // -1 car on inclu pas le CR dans un couple CR LF
     
            // Si l'on trouve la fin de ligne, on récupère directement les données
            if (LineReaded = Index) then
            begin
              Result := ReadLineFromIndexRec(IndexRec);
              Exit;
            end;
            // la prochaine ligne commencera après ce dernier séparateur de ligne
            IndexRec.OffSet := FLinearPosition;
            Inc(LineReaded);
          end;
          if not AUseCROnly then
            LastIsCR := (AByte = CR);
        end;
      end;
      // On a pas trouvé de fin de ligne, il est fort possible que ce soit la dernière sans fin de ligne
      // On récupère l'ensemble de la fin du fichier, on lit (Fin - Offset) Byte à partir de Offset
      if IndexRec.OffSet < FTextSize then
      begin
        IndexRec.Length := FTextStream.Position - IndexRec.OffSet;
        FLinearPosition := FTextStream.Position + 1; // + 1 ainsi on sera définitivment en dehors !
        if (LineReaded = Index) then
        begin
          Result := ReadLineFromIndexRec(IndexRec);
          Exit;
        end;
      end;
      Result := '';
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 506
    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 506
    Par défaut
    Bonjour,

    D'accord avec ShaiLeTroll, bêtement avec la fonction Pos, j'ai testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s := StringReplace(s, #13, #13#10,[rfReplaceAll]);
    StringReplace remplace bien #13 par #13#10 et aussi #13#10 par #13#10#10

    A+
    Charly

  8. #8
    Membre éclairé
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 476
    Par défaut
    Bonjour Gbegreg,
    J'ai testé ceci et différentes variantes...
    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
    var CR2CRLF : TStringlist;
          T:='';
          AssignFile(F,Opendialog1.FileName);
          Reset(F);
           Readln(F,S);
           if pos(#13#10,S)=0 then
           begin
             CR2CRLF := TStringList.Create;
             CR2CRLF.LineBreak := #13;
             CR2CRLF.Text := S;
             CR2CRLF.LineBreak := #13#10;
             Closefile(F);
             CR2CRLF.SaveToFile(Opendialog1.FileName); 
             CR2CRLF.free;
           end;
    mais pas mieux... :-(

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

Discussions similaires

  1. Replacer CRLF et les Tabulations par un espace
    Par Invité dans le forum Langage
    Réponses: 12
    Dernier message: 06/01/2016, 18h10
  2. Afficher remplacer les fins de lignes CRLF par LF sous AIX
    Par doudou8mc dans le forum Shell et commandes POSIX
    Réponses: 20
    Dernier message: 16/06/2015, 16h40
  3. [CR 2008] remplacer les 'crlf' par des espaces dans un texte de "type" RTF
    Par digitfree dans le forum Formules
    Réponses: 5
    Dernier message: 02/04/2013, 11h18
  4. isoler 2 chaines séparées par un CRLF
    Par secretman dans le forum Delphi
    Réponses: 2
    Dernier message: 26/05/2007, 16h33

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