На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное 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 посте?
                        ^D^ima, Скорость медленней но за то размеры побольше принимает. Еще раз спасибо!
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0302 ]   [ 17 queries used ]   [ Generated: 19.04.24, 15:02 GMT ]