-
Подскажите пожалуйста алгоритм. ReplaceAll тут не подойдёт - получится CRCRLF
-
1. если скорость не важна, то CRLF -> LF LF -> CRLF
2. свою процедуру написать
-
re = CreateOleObject("VBScript.RegExp")
re.Pattern = '[^\r]\n'
Result = re.Replace(srcString, '')
-
S := StringReplace(S, #10, #13#10, [rfReplaceAll]); S := StringReplace(S, #13#13, #13, [rfReplaceAll]);
-
aka © (05.03.19 10:12) [3] ИМХО, так будет чуть быстрее, т.к. первый проход скорее всего ничего не найдет, значит не будет перераспределения памяти. S := StringReplace(S, #13#10, #10, [rfReplaceAll]); S := StringReplace(S, #10, #13#10, [rfReplaceAll]);
а вообще смысл такой замены? блокнот, стринглист, ... понимают и так и так, т.е. при отображении ничего не изменится, а для чего еще?
-
Блокнот который MicroSoft нифига не понимает. Можно ещё StringReplace(S, <...>, '',
А руками For не котируется?
-
> Sha © (05.03.19 09:02) [1] > 2. свою процедуру написать
Так бы и сказал, что объявляется конкурс на написание самой оптимальной процедуры.
> Сапёр (05.03.19 19:11) [5] > А руками For не котируется? >
Я бы так и попытался бы сделать, если бы приспичило. Использовал бы цикл for по символам исходной строки с добавлением символов в результирующую строку. С проверкой предыдущего символа исходной строки. А возможно и цикл while с проверкой предыдущего и последующего символа исходной строки.
-
> Блокнот который 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
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');
end;
procedure TForm1.Button2Click(Sender: TObject); begin
with TStringList.Create do
try
Text:= StringReplace(Memo1.Lines.Text, #13#10, #10, [rfReplaceAll]);
SaveToFile('Check2.txt');
finally
Free;
end;
end;
procedure TForm1.Button3Click(Sender: TObject); begin
SaveToFile('Check3.txt', StringReplace(Memo1.Lines.Text, #13#10, #10, [rfReplaceAll]));
end;
end.
-
да, там чтение через TStringList и через строку - st:= Text;, чисто чтобы в дебаге посмотреть, что уже в ней текст уже "виндовый".
и вот смысл чего-то заменять? тут скорее нужен вопрос "как оставить текст с линуксовыми разделителями строк".
-
> перепроверил, все понимает, винда 10ка.
Вот только десятка и понимает, и совсем недавно - кажется, с какого-то обновления прошлого года. На более ранних линуховые концы строк понимал только WordPad.
-
var L: TStringList; S: String;
L.Text := S; S := L.Text;
-
Может он строку получает из сети, а VCL вовсе не использует?
[OFF] Win10 обновляется как захочет, не запрещаю. И до сих пор Блокнот встречая #13#10 тупо в одну строку выводит. Любой XML открываешь - и каша. А обновление Блокнота да, обещали. Вкладки ему приделать, ещё всякого... [/OFF]
-
> На более ранних линуховые концы строк понимал только WordPad. о!, точно, "вспомнил"... вордпадом открывал. ну это до того как через программу файл прошел, после пофиг, понятно.
|