http://forum.delphimaster.net/cgi-bin/forum.pl?id=1551736756&n=18

Замена LF на CRLF


валя ©   (05.03.19 00:59

Подскажите пожалуйста алгоритм.
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.
о!, точно, "вспомнил"... вордпадом открывал. ну это до того как через программу файл прошел, после пофиг, понятно.


http://forum.delphimaster.net/cgi-bin/forum.pl?id=1551736756&n=18