На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Работа с TFile.ReadAllLines
Предоставлен, полностью, рабочий код:

У меня возник вопрос: Как правильно переделать код (ПОД ЧТЕНИЕ ПОСТРОЧНО) что бы место TFile.ReadAllLines('all.txt'); - был OpenDialog1.FileName. И сохранения шло через writeln();

Рабочий код:

ExpandedWrap disabled
     uses System.IOUtils, System.Types;
     
    procedure TForm1.Button1Click(Sender: TObject);
     
    var
      A: TStringDynArray;
      Index: array of integer;
      Unic, Rez: TStringList;
      i, j, k: integer;
      s: String;
     
    begin
      A := TFile.ReadAllLines('all.txt');
      SetLength(Index, Length(A));
      Unic := TStringList.Create;
      for i := Low(A) to High(A) do
      begin
        s := Copy(A[i], Pos('№', A[i]) + 1, Pos('>', A[i]) - Pos('№', A[i]) - 1);
        k := Unic.IndexOf(s);
        if k = -1 then
          Index[i] := Unic.Add(s)
        else
          Index[i] := k;
      end;
      for i := 0 to Unic.Count - 1 do
      begin
        Rez := TStringList.Create;
        for j := Low(Index) to High(Index) do
          if Index[j] = i then
            Rez.Add(A[j]);
        Rez.SaveToFile(Format('%s%s.txt', [ExtractFilePath(ParamStr(0)),
          Unic.Strings[i]]));
        Rez.Free;
      end;
      Unic.Free;
    end;
Сообщение отредактировано: Kirilis2018 -
Друзья, выручайте кто более опытный... В долгу не останусь...
Первое как-то так:
ExpandedWrap disabled
    if OpenDialog1.Execute(Handle) = idOK then
        begin
            A := TFile.ReadAllLines(OpenDialog1.FileName);// 'all.txt');
    ...


Добавлено
Это было просто открытие такого-то файла. Запись как-то из:
ExpandedWrap disabled
    var
    ...
      bsF : System.Text;
      outFile:string;
    begin
    ...
    outFile := Format(...); // получаем имя
    if FileExists(outFile) then // есть - допишем
        System.Append(bsF)
      else // новый - сначала
        System.Rewrite(bsF);
      for ...
      begin
        str := rez.Strings[j];
        writeln( bsF, str);
      end;
Славян, Благодарен за подсказку, но при таком варианте не проходит, точнее не работает код. Буду думать, спасибо.
Да, то была схема, полезные мысли. Детали бесспорно надо доделывать и додумывать. :blush:
Kirilis2018
Ты опиши словами что делает код, так будет проще его переписать
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
^D^ima, Вот полное описание кода:
Сохранение строк, в один файл, с одинаковым текстом, между знаками.

Есть текстовый файл, в котором (пример) строк:
Text6№111>Text1
Text5№111>Text2
Text4№222>Text3
Text3№222>Text4
Text2№333>Text5
Text1№333>Text6

Что делает код: Сохраняет, все строки, по разным, текстовым файлам, где между символами и > встречаются одинаковый (идентичный) текст.

В данном случае:

В текстовый файл с именем 111.txt сохранится результат (поскольку текст 111 между знаками № и > одинаковый):
Text6№111>Text1
Text5№111>Text2

В текстовый файл с именем 222.txt сохранится результат (поскольку текст 222 между знаками № и > одинаковый):
Text4№222>Text3
Text3№222>Text4

В текстовый файл с именем 333.txt сохранится результат (поскольку текст 333 между знаками № и > одинаковый):
Text2№333>Text5
Text1№333>Text6

Код то работает, но нужно через построчное чтение (AssignFile, writeln()), поскольку, если файл большой то (код что выше) просто загружает оперативную память (и после происходит ошибка нехватки памяти).
Сообщение отредактировано: Kirilis2018 -
Что сложного?
ExpandedWrap disabled
    Var
      FIn,FOut:TextFile;
      SIn,FOutName:String;
    begin
      AssignFile(FIn,'C:\In.txt');
      Reset(FIn);
        While not EOF(FIn) do
          Begin
            Readln(FIn,SIn);
            FOutName:='C:\'+Copy(SIn, Pos('№', SIn) + 1, Pos('>', SIn) - Pos('№', SIn) - 1)+'.txt';
     
            AssignFile(FOut,FOutName);
              IF FileExists(FOutName) then Append(FOut) else Rewrite(FOut);
              Writeln(FOut,SIn);
            CloseFile(FOut);
     
          End;
      CloseFile(FIn);
    end;
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
^D^ima, Именно то что нужно было! Дмитрий спасибо ОГРОМНЕЙШЕЕ!
Kirilis2018
Пожалуйста.

Как скорость работы кода, намного медленнее чем в 1 посте?
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1180 ]   [ 20 queries used ]   [ Generated: 21.01.19, 16:16 GMT ]