Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле? / 17 сообщений из 17, страница 1 из 1
28.07.2016, 14:48:07
    #39281957
SDA_H
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
Подскажите плиз в проге текстовый файл отчета формируется в memo1 и потом сохраняется ф файл -
Код: pascal
1.
Memo1.Lines.SaveToFile(AFile....


Как сохранить файл в нескольких файлов например по 1000 строк из memo1 на один файл???
...
Рейтинг: 0 / 0
28.07.2016, 14:56:33
    #39281963
Товарищ младший сержант
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
SDA_H,

Перебрать исходный текст по строкам => если номер строки кратен 1000, то создать новый файл => Writeln(очередную строку)
...
Рейтинг: 0 / 0
28.07.2016, 16:38:49
    #39282062
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
Код: pascal
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.
Procedure SaveLog;
Const FileLines = 1000;
      FileName = 'c:\Windows\temp\Log_%d.txt';
Var FileContent: TStringList;
    LogContent: TStrings;
    FCount, LCount: integer;
.....
  procedure FlushFile;
  begin
     if FileContent.Count <= 0 then exit;
     
     Inc( FCount );
     FileContent.SaveToFile( Format( FileName, [ FCount ] ) );
     FileContent.Clear;
  end;
begin
  LogContent := Form1.Memo1.Lines;
  FCount := 0; 

  FileContent := TStringList.Create;
  try
    for LCount := 0 to LogContent.Count-1 do begin
       if 0 = (LContent mod FileLines) then
          FlushFile;
       FileContent.Add( LogContent[ LCount ] );
    end;
    FlushFile;
  finally 
    FileContent.Destroy;
  end;
end;
...
Рейтинг: 0 / 0
28.07.2016, 16:40:35
    #39282069
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
Небольшая правка для скорости ( хотя по большому счету пофигу: процессор все равно быстрее винчестера, если только его другие программы не сожрали )

Arioch
Код: pascal
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.
Procedure SaveLog;
Const FileLines = 1000;
      FileName = 'c:\Windows\temp\Log_%d.txt';
Var FileContent: TStringList;
    LogContent: TStrings;
    FCount, LCount: integer;
.....
  procedure FlushFile;
  begin
     if FileContent.Count <= 0 then exit;
     
     Inc( FCount );
     FileContent.SaveToFile( Format( FileName, [ FCount ] ) );
     FileContent.Clear;
  end;
begin
  LogContent := Form1.Memo1.Lines;
  FCount := 0; 

  FileContent := TStringList.Create;
  try
    FileContent.BeginUpdate;
    FileContent.Capacity := FileLines;
    for LCount := 0 to LogContent.Count-1 do begin
       if 0 = (LContent mod FileLines) then
          FlushFile;
       FileContent.Add( LogContent[ LCount ] );
    end;
    FlushFile;
  finally 
    FileContent.Destroy;
  end;
end;
...
Рейтинг: 0 / 0
28.07.2016, 17:11:14
    #39282091
SDA_H
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
СПАСИБО!
...
Рейтинг: 0 / 0
28.07.2016, 18:21:45
    #39282140
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
SDA_HСПАСИБО!Ладно, пожалею я тех чайников, которые забредут сюда и станут использовать эту порнографию
Код: pascal
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.
procedure SaveStrings(AStrings: TStrings; ALimit: Integer);
const 
  CFileNameFmt = 'c:\Windows\temp\Log_%d.txt';
var
  Li: Integer;
  LFile: TextFile;
  LIdx: Integer;
begin
  if ALimit <= 0 then
    ALimit := AStrings.Count;
  LIdx := 0;
  AssignFile(LFile, Format(CFileNameFmt, [LIdx]));
  Rewrite(LFile);
  for Li := 0 to AStrings.Count - 2 do begin
    Writeln(LFile, AStrings[Li]);
    if (Li + 1) mod ALimit = 0 then begin
      CloseFile(LFile);
      Inc(LIdx);
      AssignFile(LFile, Format(CFileNameFmt, [LIdx]));
      Rewrite(LFile);
    end;
  end;
  Writeln(LFile, AStrings[AStrings.Count - 1]);
  CloseFile(LFile);
end;
...
Рейтинг: 0 / 0
28.07.2016, 18:44:03
    #39282154
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
_Vasilisk_,

вместо быстрого и современного варианта вы показали медленный и устаревший

неумеющий юникодные имена также

ну... пусть будет, why not
...
Рейтинг: 0 / 0
28.07.2016, 18:57:56
    #39282161
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
Внезапно, Microsoft .NET style!

http://docwiki.embarcadero.com/VCL/XE/en/IOUtils.TFile.CreateText
http://docwiki.embarcadero.com/VCL/XE/en/Classes.TStreamWriter

Код: pascal
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.
Procedure SaveLog;
Const FileLines = 1000;
      FileName = 'c:\Windows\temp\Log_%d.txt';
Var LogContent: TStrings;
    Writer: TTextWriter;
    FCount, LCount: integer;
begin
  LogContent := Form1.Memo1.Lines;

  FCount := 0; 
  Writer := nil;
  try
    for LCount := 0 to LogContent.Count-1 do begin

       if 0 = (LCount mod FileLines) then
          FreeAndNil( Writer );

       if nil=Writer then begin
          Inc( FCount );
          Writer := TFile.CreateText( Format( FileName, [ FCount ] ) );
       end;

       Writer.WriteLine( LogContent[ LCount ] );

    end;
  finally 
    Writer.Free;
  end;
end;
...
Рейтинг: 0 / 0
29.07.2016, 14:51:17
    #39282819
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
Ariochвместо быстрого и современного варианта вы показали медленный и устаревшийСмешно! Очень! Возьмите потестируйте Ваш "быстрый" вариант на миллионе другом строк
Ariochнеумеющий юникодные имена такжеАсь? Это в каком месте?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
12.01.2018, 09:51:13
    #39583036
Jenyok2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
Вопрос в продолжение темы.
.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
// Заполнение текстом Memo2, TextString - текст заполнения,
procedure TForm1.FillStringsMemo(TextString : String);
begin
  if (TextString <> cEmptyString) then TextString:=TimeToStr(Time) + '     ' + TextString;
  Memo2.Lines.Add(TextString);
  Memo2.Update;
  try
    Memo2.Lines.SaveToFile(MainFormSaved.LogFileName_Saved);
  except on E:Exception do
    begin
      Memo2.Lines.Add('ОШИБКА ПРИ СОХРАНЕНИИ ФАЙЛА ОТЧЕТА: ' + MainFormSaved.LogFileName_Saved);
      Memo2.Lines.Add('ОШИБКА: ' + E.Message);
      Exit;
    end;   // except
  end;   // try
end;


.
При инициализации формы TForm1 пишется LOG в Memo2, который в свою очередь пишет файл с именем MainFormSaved.LogFileName_Saved .
Примерный размер файла LOG при инициализации формы TForm1 - 19 кБайт.
.
Далее в форме идет выполнение некоторых действий, которые меняют имя LOG файла MainFormSaved.LogFileName_Saved и очищают Memo2.Clear
.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
      Memo2.Clear;
{$IFDEF Debug_SendOtchetSVK_MPSO_MSG}
      FillStringsMemo(Format('!!! ВНИМАНИЕ !!! Программа %s запущена в ОТЛАДОЧНОМ РЕЖИМЕ', [ExtractFileName(Application.ExeName)]));
      FillStringsMemo(cEmptyString);
{$ENDIF}
// Имя LOG файла и LOG CRYPT файла для криптообработки
      MainFormSaved.LogFileName_Saved:=CheckBackSlash(MainFormSaved.LogFilePath_Saved) + CurrentDateTime;
      MainFormSaved.LogFileNameCrypt_Saved:=MainFormSaved.LogFileName_Saved + '_Crypt.log';
      MainFormSaved.LogFileName_Saved:=MainFormSaved.LogFileName_Saved + '.log';


.
НО !!!
Предыдущие данные в Memo2 до очистки, которые вроде как должны писаться в файл, исчезают.
Пишется ВСЕГО ЛИШЬ одна строка и все, т.е. НЕТ такого метода, как Flush для Memo2.Lines.SaveToFile(MainFormSaved.LogFileName_Saved);

.
Попробовал изменить алгоритм записи Memo2.Lines.SaveToFile(MainFormSaved.LogFileName_Saved); следующим образом.
.
Код: pascal
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.
// Заполнение текстом Memo2, TextString - текст заполнения,
procedure TForm1.FillStringsMemo(TextString : String);
Var
  FileContent : TStringList;
  LogContent  : TStrings;
begin
  if (TextString <> cEmptyString) then TextString:=TimeToStr(Time) + '     ' + TextString;
  Memo2.Lines.Add(TextString);
  Memo2.Update;
    LogContent:=Memo2.Lines;
    FileContent:=TStringList.Create;
    try
      try
        FileContent.BeginUpdate;
        FileContent.AddStrings(LogContent);
        FileContent.SaveToFile(MainFormSaved.LogFileName_Saved);
//        FileContent.EndUpdate;
      except on E:Exception do
        begin
          Memo2.Lines.Add('ОШИБКА ПРИ СОХРАНЕНИИ ФАЙЛА ОТЧЕТА: ' + MainFormSaved.LogFileName_Saved);
          Memo2.Lines.Add('ОШИБКА: ' + E.Message);
          FileContent.Free;
          Exit;
        end;   // except
      end;   // try
    finally
      FileContent.Free;
    end;
end;


.
Результат тот же.
.
...
Рейтинг: 0 / 0
12.01.2018, 10:31:18
    #39583076
Jenyok2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
Jenyok2,
.
Подумал, последний вариант в таком виде точно не будет работать.
.
...
Рейтинг: 0 / 0
12.01.2018, 10:33:20
    #39583082
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
Зачем создавать дополнительный TStringList, переписывать в него Memo и сохранять в файл ?
Сразу нельзя писать Memo ?
...
Рейтинг: 0 / 0
12.01.2018, 11:11:26
    #39583144
Jenyok2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
DimaBr,
.
Внимательно читали сообщение ?
.
Именно так и делаем, пишем напрямую Memo2.Lines.SaveToFile(MainFormSaved.LogFileName_Saved);
Но при условии, что далее в программе есть Memo2.Clear, не вся информация попадает в файл, А ТОЛЬКО одна строка ~ 100 байт, должно быть много строк ~ 19 кБайт.
.
...
Рейтинг: 0 / 0
12.01.2018, 12:15:28
    #39583216
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
Причём здесь Memo.Clear и SaveToFile если эти операции последовательны ?
Если конечно они не дёргаются из потоков, например.
...
Рейтинг: 0 / 0
12.01.2018, 12:43:41
    #39583243
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
Jenyok2,

авторНо при условии, что далее в программе есть Memo2.Clear, не вся информация попадает в файл,

что-то у тебя не так, SaveToFile TStrings'а всегда синхронно сбрасывает весь TStrings в файл.
...
Рейтинг: 0 / 0
12.01.2018, 15:53:30
    #39583366
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
Дозапись в существующий файл
Код: pascal
1.
2.
3.
4.
5.
6.
7.
LFile := TFileStream.Create('mtfile.log', fmOpenWrite);
try
  LFile.Seek(0, soFromEnd);
  Memo2.Lines.SaveToStream(LFile);
finally
  LFile.Free;
end;
...
Рейтинг: 0 / 0
12.01.2018, 17:15:56
    #39583425
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?
Jenyok2,

Поставь брекпоинт на строку
Код: pascal
1.
 Memo2.Lines.SaveToFile(MainFormSaved.LogFileName_Saved);

и после её выполнения посмотри что в файле. Заодно не выскакивает ли исключение при сохранении.

Ещё вопрос: не открыт ли ещё где-нибудь этот файл на неисключительную запись.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]