Конференция "Начинающим" » Замена LF на CRLF [D7]
 
  • валя © (05.03.19 00:59) [0]
    Подскажите пожалуйста алгоритм.
    ReplaceAll тут не подойдёт - получится  CRCRLF
  • Sha © (05.03.19 09:02) [1]
    1. если скорость не важна, то
    CRLF -> LF
    LF -> CRLF

    2. свою процедуру написать
  • xls (05.03.19 09:42) [2]
    re = CreateOleObject("VBScript.RegExp")

    re.Pattern = '[^\r]\n'

    Result = re.Replace(srcString, '')
  • aka © (05.03.19 10:12) [3]
    S := StringReplace(S, #10, #13#10, [rfReplaceAll]);
    S := StringReplace(S, #13#13, #13, [rfReplaceAll]);
  • sniknik © (05.03.19 15:20) [4]
    aka ©   (05.03.19 10:12) [3]
    ИМХО, так будет чуть быстрее, т.к. первый проход скорее всего ничего не найдет, значит не будет перераспределения памяти.
    S := StringReplace(S, #13#10, #10, [rfReplaceAll]);
    S := StringReplace(S, #10, #13#10, [rfReplaceAll]);

    а вообще смысл такой замены? блокнот, стринглист, ... понимают и так и так, т.е. при отображении ничего не изменится, а для чего еще?
  • Сапёр (05.03.19 19:11) [5]
    Блокнот который MicroSoft нифига не понимает.
    Можно ещё StringReplace(S, <...>, '',

    А руками For не котируется?
  • Германн © (05.03.19 23:22) [6]

    > Sha ©   (05.03.19 09:02) [1]
    > 2. свою процедуру написать

    Так бы и сказал, что объявляется конкурс на написание самой оптимальной процедуры.


    > Сапёр   (05.03.19 19:11) [5]
    > А руками For не котируется?
    >  

    Я бы так и попытался бы сделать, если бы приспичило. Использовал бы цикл for по символам исходной строки с добавлением символов в результирующую строку. С проверкой предыдущего символа исходной строки. А возможно и цикл while с проверкой предыдущего и последующего символа исходной строки.
  • sniknik © (06.03.19 18:47) [7]
    > Блокнот который MicroSoft нифига не понимает.
    ???
    перепроверил, все понимает, винда 10ка. может на старых... хотя нет, смутно помню еще в семерке использовал, приходили тексты с юниксовых серваков, и никаких замен не делал.

    в дельфе Memo, RichEdit, StringList как только туда попадает все с #13#10 становится.


    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls;

    type
     TForm1 = class(TForm)
       Memo1: TMemo;
       Button1: TButton;
       Button2: TButton;
       Button3: TButton;
       RichEdit1: TRichEdit;
       procedure Button1Click(Sender: TObject);
       procedure Button2Click(Sender: TObject);
       procedure Button3Click(Sender: TObject);
     private
     public
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure SaveToFile(const sFileName, sText: string); //старые надежные методы, сохраняет что даш, без самостоятельных преобразований
    var
     F: TextFile;
    begin
     AssignFile(F, sFileName);
     Rewrite(F);
     Write(F, sText);
     CloseFile(F);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
     st: string;
    begin
     Memo1.Lines.LoadFromFile('Check.txt');    //открываем файл содержащий #13#10, после сохраняем 3й кнопкой, 2я убедится что не получится
     //Memo1.Lines.LoadFromFile('Check3.txt'); //после коментарим певую строку, и раскоментариваем любую открывающую 3 файл который чисто с #10
     {with TStringList.Create do               //видим что ничего не поменялось, хотя текст "линуксовый"
     try
       LoadFromFile('Check3.txt');
       st:= Text;
       Memo1.Lines.Text:= st;
     finally
       Free;
     end;}

     //RichEdit1.Lines.LoadFromFile('Check3.txt');
    end;

    procedure TForm1.Button2Click(Sender: TObject); //TStringList сохраняет, и держит с #13#10, т.е. это чисто чтобы убедится
    begin
     with TStringList.Create do
     try
       Text:= StringReplace(Memo1.Lines.Text, #13#10, #10, [rfReplaceAll]);
       SaveToFile('Check2.txt');
     finally
       Free;
     end;
     //Memo1.Lines.LoadFromFile('Check2.txt'); //так кстати тоже
    end;

    procedure TForm1.Button3Click(Sender: TObject); //только так можно сохранить с #10
    begin
     SaveToFile('Check3.txt', StringReplace(Memo1.Lines.Text, #13#10, #10, [rfReplaceAll]));
    end;

    end.

  • sniknik © (06.03.19 18:52) [8]
    да, там чтение через TStringList и через строку - st:= Text;, чисто чтобы в дебаге посмотреть, что уже в ней текст уже "виндовый".

    и вот смысл чего-то заменять? тут скорее нужен вопрос "как оставить текст с линуксовыми разделителями строк".
  • Styx © (07.03.19 00:09) [9]

    > перепроверил, все понимает, винда 10ка.

    Вот только десятка и понимает, и совсем недавно - кажется, с какого-то обновления прошлого года. На более ранних линуховые концы строк понимал только WordPad.
  • Dimka Maslov © (07.03.19 11:32) [10]
    var
     L: TStringList;
     S: String;

    L.Text := S;
    S := L.Text;
  • Сапёр (07.03.19 16:57) [11]
    Может он строку получает из сети, а VCL вовсе не использует?

    [OFF]
    Win10 обновляется как захочет, не запрещаю. И до сих пор Блокнот встречая #13#10 тупо в одну строку выводит. Любой XML открываешь - и каша.
    А обновление Блокнота да, обещали. Вкладки ему приделать, ещё всякого...
    [/OFF]
  • sniknik © (09.03.19 18:59) [12]
    > На более ранних линуховые концы строк понимал только WordPad.
    о!, точно, "вспомнил"... вордпадом открывал. ну это до того как через программу файл прошел, после пофиг, понятно.
 
Конференция "Начинающим" » Замена LF на CRLF [D7]
Есть новые Нет новых   [118240   +20][b:0][p:0.002]