Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
SDA_H
Member

Откуда:
Сообщений: 275
Подскажите плиз в проге текстовый файл отчета формируется в memo1 и потом сохраняется ф файл -
Memo1.Lines.SaveToFile(AFile....

Как сохранить файл в нескольких файлов например по 1000 строк из memo1 на один файл???
28 июл 16, 14:48    [19467914]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
Товарищ младший сержант
Member [заблокирован]

Откуда:
Сообщений: 5126
SDA_H,

Перебрать исходный текст по строкам => если номер строки кратен 1000, то создать новый файл => Writeln(очередную строку)
28 июл 16, 14:56    [19467982]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
Arioch
Member

Откуда:
Сообщений: 9650
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;
28 июл 16, 16:38    [19468823]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
Arioch
Member

Откуда:
Сообщений: 9650
Небольшая правка для скорости ( хотя по большому счету пофигу: процессор все равно быстрее винчестера, если только его другие программы не сожрали )

Arioch
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;
28 июл 16, 16:40    [19468841]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
SDA_H
Member

Откуда:
Сообщений: 275
СПАСИБО!
28 июл 16, 17:11    [19469071]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10308
SDA_H
СПАСИБО!
Ладно, пожалею я тех чайников, которые забредут сюда и станут использовать эту порнографию
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;
28 июл 16, 18:21    [19469488]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
Arioch
Member

Откуда:
Сообщений: 9650
_Vasilisk_,

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

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

ну... пусть будет, why not
28 июл 16, 18:44    [19469606]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
Arioch
Member

Откуда:
Сообщений: 9650
Внезапно, Microsoft .NET style!

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

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;
28 июл 16, 18:57    [19469649]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10308
Arioch
вместо быстрого и современного варианта вы показали медленный и устаревший
Смешно! Очень! Возьмите потестируйте Ваш "быстрый" вариант на миллионе другом строк
Arioch
неумеющий юникодные имена также
Ась? Это в каком месте?
29 июл 16, 14:51    [19473068]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
Jenyok2
Member

Откуда:
Сообщений: 20
Вопрос в продолжение темы.
.
// Заполнение текстом 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
.
      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); следующим образом.
.
// Заполнение текстом 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;

.
Результат тот же.
.
12 янв 18, 09:51    [21099937]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
Jenyok2
Member

Откуда:
Сообщений: 20
Jenyok2,
.
Подумал, последний вариант в таком виде точно не будет работать.
.
12 янв 18, 10:31    [21100204]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
DimaBr
Member

Откуда:
Сообщений: 10533
Зачем создавать дополнительный TStringList, переписывать в него Memo и сохранять в файл ?
Сразу нельзя писать Memo ?
12 янв 18, 10:33    [21100219]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
Jenyok2
Member

Откуда:
Сообщений: 20
DimaBr,
.
Внимательно читали сообщение ?
.
Именно так и делаем, пишем напрямую Memo2.Lines.SaveToFile(MainFormSaved.LogFileName_Saved);
Но при условии, что далее в программе есть Memo2.Clear, не вся информация попадает в файл, А ТОЛЬКО одна строка ~ 100 байт, должно быть много строк ~ 19 кБайт.
.
12 янв 18, 11:11    [21100477]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
DimaBr
Member

Откуда:
Сообщений: 10533
Причём здесь Memo.Clear и SaveToFile если эти операции последовательны ?
Если конечно они не дёргаются из потоков, например.
12 янв 18, 12:15    [21100858]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2574
Jenyok2,

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


что-то у тебя не так, SaveToFile TStrings'а всегда синхронно сбрасывает весь TStrings в файл.
12 янв 18, 12:43    [21100965]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10308
Дозапись в существующий файл
LFile := TFileStream.Create('mtfile.log', fmOpenWrite);
try
  LFile.Seek(0, soFromEnd);
  Memo2.Lines.SaveToStream(LFile);
finally
  LFile.Free;
end;
12 янв 18, 15:53    [21102029]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить текст в memo в нескольких файлах по n-строк в каждом файле?  [new]
alekcvp
Member

Откуда:
Сообщений: 921
Jenyok2,

Поставь брекпоинт на строку
 Memo2.Lines.SaveToFile(MainFormSaved.LogFileName_Saved);
и после её выполнения посмотри что в файле. Заодно не выскакивает ли исключение при сохранении.

Ещё вопрос: не открыт ли ещё где-нибудь этот файл на неисключительную запись.
12 янв 18, 17:15    [21102445]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить