На главную Наши проекты:
Журнал   ·   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_
  
> Сортировка строк в указанном порядке
    Как можно сортировать строки из текстового файла в указанном порядке. То есть указываю порядок (к примеру в MEMO1) в котором должны идти строки - Brend потом Nomer_tovara потом Year потом Garantiya.

    Для примера (Входной файл):
    ExpandedWrap disabled
      Nomer_tovara: 557436
      Brend: VMS
      Garantiya: 2343454
      Year : 2019
      Nomer_tovara: 557436
      Brend: ORP
      Garantiya: 78788777
      Year : 2019


    Выходной файл:
    ExpandedWrap disabled
      Brend: VMS
      Nomer_tovara: 557436
      Year : 2019
      Garantiya: 2343454
      Brend: ORP
      Nomer_tovara: 557436
      Year : 2019
      Garantiya: 78788777
    Сообщение отредактировано: Kirilis2018 -
      Если во входном файле чётко по N строк, то можно так:
      - в какой-нибудь СтрингЛист считывай N строк;
      - по строкам в Мемо:
      -- ищешь Brend в СтринпЛисте, находишь, записываешь на выход, удаляешь строку из СтрингЛиста
      -- ищешь Nomer_ ...
      -- СтрингЛист стал пустым - читаешь следующие N строк из входного файла.
        LMMLMM, Возможно сделать реализацию ? Если можно.
          Kirilis2018
          У тебя все для реализации есть, просто подумать не хочешь.

          Что мешает взять предыдущий код и минимально дополнить его, например так:
          ExpandedWrap disabled
            Var
              FIn,FOut:TextFile;
              I,I1:Integer;
              s:String;
              Sl:TStringList;
             
            begin
              memo1.Lines.Clear;
              memo1.Lines.Add('Year ');
              memo1.Lines.Add('Brend');
              memo1.Lines.Add('Nomer_tovara');
              memo1.Lines.Add('Garantiya');
             
             
              Sl:=TStringList.Create;
              Sl.NameValueSeparator := ':';
             
              AssignFile(FIn,'C:\1.txt');
              Reset(FIn);
              AssignFile(FOut,'C:\2.txt');
              Rewrite(FOut);
              I:=0;
             
                while not EOF(FIn) do
                  Begin
                    Inc(I);
                    ReadLn(FIn,S);
                    Sl.Add(S);
                      if Trim(sl.Names[I-1])='Year' then
                        begin
                            for I1 := 0 to memo1.Lines.Count-1 do Writeln(Fout,Memo1.Lines.Strings[I1]+':'+Sl.ValueFromIndex[  Sl.IndexOfName(Memo1.Lines.Strings[I1])]);
                          I:=0;
                          sl.Clear;
                        end;
             
             
                  End;
             
              CloseFile(FIn);
              CloseFile(FOut);
             
              Sl.Free;
             
            end;

          Единственное что у тебя между элементами не будет лишних строк, т.е. не сохраниться оригинальная структура.

          Можно не через stringlist а через массив строк и Pos сделать

          Добавлено
          Через Pos
          ExpandedWrap disabled
            Const
              EndElementSign = 'Year';
              MaxPosCount = 5;
            Var
              FIn,FOut:TextFile;
              I,I1,I2:Integer;
              s:array[1..MaxPosCount] of String;
             
            begin
              memo1.Lines.Clear;
              memo1.Lines.Add('Year');
              memo1.Lines.Add('Brend');
              memo1.Lines.Add('Nomer_tovara');
              memo1.Lines.Add('Garantiya');
             
             
              AssignFile(FIn,'C:\1.txt');
              Reset(FIn);
              AssignFile(FOut,'C:\2.txt');
              Rewrite(FOut);
              I:=0;
             
                while not EOF(FIn) do
                  Begin
                    Inc(I);
                    ReadLn(FIn,S[I]);
                      if Pos(EndElementSign,S[I])>0 then
                        begin
                            for I1 := 0 to memo1.Lines.Count-1 do
                            for I2 := 1 to MaxPosCount do
                              if Pos(Memo1.Lines.Strings[I1],S[I2])>0 then
                                Begin
                                  Writeln(Fout,S[I2]);
                                  Break;
                                End;
             
                          I:=0;
                        end;
             
             
                  End;
             
              CloseFile(FIn);
              CloseFile(FOut);
             
             
            end;
            ^D^ima, Вот это реально круто. Код неоценимо полезный! :good:
            Сообщение отредактировано: Kirilis2018 -
              ExpandedWrap disabled
                var
                  L, M: TStrings;
                  s: string;
                  fin, fout: TextFile;
                  i: integer;
                 
                begin
                  M := TstringList.Create;
                  m.Add('Year');
                  m.Add('Brend');
                  m.Add('Nomer_tovara');
                  m.Add('Garantiya');
                 
                  L := TStringList.Create;
                  L.NameValueSeparator:=':';
                  AssignFile(fin, 'data.txt');
                  AssignFile(fout, 'data_out.txt');
                  try
                    Reset(fin);
                    Rewrite(fout);
                    while not Eof(fin) do
                    begin
                      Readln(fin, s);
                      if Trim(s) <> '' then L.Add(s);
                      if L.Count = 4 then
                      begin
                        for s in M do
                        begin
                          i := L.IndexOfName(s);
                          if i <> -1 then Writeln(fout, Format('%s: %s', [Trim(L.Names[i]), Trim(L.ValueFromIndex[i])]));
                        end;
                        L.Clear;
                        Writeln(fout, '');
                      end;
                    end;
                  finally
                    L.Free;
                    CloseFile(fin);
                    CloseFile(fout);
                  end;
                end.

              Ай малаца! :D
                Упрощаем код с помощью словаря :D
                ExpandedWrap disabled
                  type
                    TStringMap = specialize TDictionary<string, string>;
                   
                  var
                    L, M: TStrings;
                    s: string;
                    fin, fout: TextFile;
                    K: TStringMap;
                   
                  begin
                    M := TstringList.Create;
                    m.Add('Year');
                    m.Add('Brend');
                    m.Add('Nomer_tovara');
                    m.Add('Garantiya');
                   
                    K := TStringMap.Create;
                    L := TStringList.Create;
                    AssignFile(fin, 'data.txt');
                    AssignFile(fout, 'data_out.txt');
                    try
                      Reset(fin);
                      Rewrite(fout);
                      while not Eof(fin) do
                      begin
                        Readln(fin, s);
                        if ExtractStrings([':'], [], PChar(Trim(s)), L) <> 0 then
                        begin
                          K.Add(Trim(L[0]), Trim(L[1]));
                          L.Clear;
                        end;
                   
                        if K.Count = 4 then
                        begin
                          for s in M do Writeln(Format('%s: %s', [s, K[s]]));
                          K.Clear;
                          writeln('');
                        end;          
                      end;
                    finally
                      L.Free;
                      M.Free;
                      K.Free;
                      CloseFile(fin);
                      CloseFile(fout);
                    end;
                   
                    readln;
                  end.

                Гениально! :D
                  Цитата Cfon @
                  Гениально!

                  В чем гениальность? По мне ненужное усложнение кода
                    Цитата ^D^ima @
                    В чем гениальность? По мне ненужное усложнение кода

                    На несколько строк код уменьшился и стал более чистым.
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0317 ]   [ 17 queries used ]   [ Generated: 26.04.24, 19:04 GMT ]