Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Замена LF на CRLF [D7]


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


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо