На главную Наши проекты:
Журнал   ·   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_
  
> Разбор строки
    Есть строки такого типа:
    ExpandedWrap disabled
      Nomer_tovara: 557436
      Brend: VMS
      Garantiya: 2343454
      Year : 2019
       
      Nomer_tovara: 557436
      Brend: ORP
      Garantiya: 78788777
      Year : 2019

    Cтроки постоянно повторяются. Как вытянуть текст после Brend: и Garantiya: и Соединить их через знак двоеточие :.

    Выходной файл должен быть:
    VMS:2343454
    ORP:78788777

    Cделан код, работает:
    ExpandedWrap disabled
      var
        sl, sl_out: TStringList;
        i: Integer;
        s: string;
      begin
        sl := TStringList.Create;
        sl_out := TStringList.Create;
        sl.NameValueSeparator := ':';
        sl.LoadFromFile(...);
        for i := 0 to sl.Count - 1 do
        begin
          if sl.Names[i] = 'Brend' then
            s := Trim(sl.ValueFromIndex[i]);
          if sl.Names[i] = 'Garantiya' then
          begin
            s := s + ':' + Trim(sl.ValueFromIndex[i]);
            sl_out.Add(s);
          end;
        end;
        sl_out.SaveToFile(...);
        sl_out.Free;
        sl.Free;
      end;


    Как сделать код через AssignFile , writeln(f1, S);. Делаю вот так:

    Набросал заготовку: (Помогите допилить код :wall: )

    ExpandedWrap disabled
      procedure TForm1.Button1Click(Sender: TObject);
      var
      fall, f1: TextFile;
      S,sl: string;
      mas: array of string;
      Found: Boolean;
      i: integer;
      begin
      //Открываем диалог выбора файла
      if OpenDialog1.Execute then
      begin
           AssignFile(fall, OpenDialog1.FileName);
           reset(fall);
           AssignFile(f1, ExtractFileDir(OpenDialog1.FileName)+'\Result.txt');
           rewrite(f1);
           end;
       
      //работаем по строкам в файле
       while not Eof(fall) do
        begin
       //читаем строку
        ReadLn(fall, S);
       
       // Вот тут как правильно прописать цикл ?
       
        writeln(f1, S);
         end;
       
      CloseFile(fall);
      CloseFile(f1);
      end;
    Сообщение отредактировано: Kirilis2018 -
      Цитата Kirilis2018 @
      Есть строки такого типа:

      Т.е. каждый тип в отдельной строке и между каждыми элементами пустая строка?
        ^D^ima, Каждый тип в отдельной строке. А вот между каждыми элементами не всегда пустая строка.
          ExpandedWrap disabled
            Var
              FIn,FOut:TextFile;
              I:Integer;
              SPart1,SPart2,S:String;
            begin
              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);
                     if Pos('Brend:',S)<>0 then SPart1:=Copy(S,Pos(':',S)+1,Length(S)-Pos(':',S)+2);
                     if Pos('Garantiya:',s)<>0 then
                       Begin
                         SPart2:=Copy(S,Pos(':',S)+1,Length(S)-Pos(':',s)+2);
                         WriteLn(FOut,Trim(SPart1)+':'+Trim(SPart2));
                       End;
             
             
             
                  End;
             
              CloseFile(FIn);
              CloseFile(FOut);
             
            end;
            ^D^ima, Идеальная работа кода, Спасибо Дмитрий!
              Цитата Kirilis2018 @
              Как сделать код через AssignFile , writeln(f1, S);

              ExpandedWrap disabled
                var
                  L: TStrings;
                  s, s1, s2: string;
                  fin, fout: TextFile;
                begin
                  L := TStringList.Create;
                  try
                    AssignFile(fin, 'data.txt');
                    try
                      Reset(fin);
                      AssignFile(fout, 'data_out.txt');
                      try
                        Rewrite(fout);
                        while not Eof(fin) do
                        begin
                          Readln(fin, s);
                          L.Clear;
                          if ExtractStrings([':'], [], PChar(s), L) <> 0 then
                          begin
                            if L[0] = 'Brend' then s1 := Trim(L[1]);
                            if L[0] = 'Garantiya' then s2 := Trim(L[1]);
                            if (s1 <> '') and (s2 <> '') then
                            begin
                              Writeln(fout, Format('%s:%s', [s1, s2]));
                              s1 := '';
                              s2 := '';
                            end;
                          end;
                        end;
                      finally
                        CloseFile(fout);
                      end;
                    finally
                      CloseFile(fin);
                    end;
                  finally
                    L.Free;
                  end;
                end.

              С уважением ваш дельфист :D
              Сообщение отредактировано: Cfon -
                ^D^ima, А еще такой вопрос по вашему коду:

                А если текст такого же плана:
                ExpandedWrap disabled
                  Nomer_tovara: 557436
                  Brend: VMS
                  Garantiya: 2343454
                  Year : 2019
                   
                  Nomer_tovara: 557436
                  Brend: ORP
                  Garantiya: 78788777
                  Year : 2019


                Но нужно соединить вот так Garantiya + Nomer_tovara + Year: То есть на выходе:
                ExpandedWrap disabled
                  2343454:557436:2019
                  78788777:557436:2019


                То есть по сути дела как соединить данные в строках не по порядку. Что бы можно было любые данные соединять в любом порядке.
                Сообщение отредактировано: Kirilis2018 -
                  меняйте местами SPart в любом порядке
                  WriteLn(FOut,Trim(SPart1)+':'+Trim(SPart2));
                    vasya2019, Это понял. А как то задать программно, что бы автоматически, программа определяла порядок нельзя ?
                      какой порядок должна программа определить автоматически?
                        vasya2019, к примеру текст в файле:
                        ExpandedWrap disabled
                          Nomer_tovara: 557436
                          Brend: VMS
                          Garantiya: 2343454
                          Year : 2019
                           
                          Nomer_tovara: 557436
                          Brend: ORP
                          Garantiya: 78788777
                          Year : 2019


                        В Memo1 прописываю порядок (Настройки) - Garantiya + Nomer_tovara + Year:

                        Получаю Результат текстовый файл:
                        ExpandedWrap disabled
                          2343454:557436:2019
                          78788777:557436:2019
                          Kirilis2018
                          У тебя строки точно не фиксированной длины?
                          Между элементами в любом случаи строка?
                            ^D^ima, Строки точно (100% не фиксированной длины). Между элементами (не всегда пустая строка) бывает и слитно то есть вот так:
                            ExpandedWrap disabled
                              Nomer_tovara: 557436
                              Brend: VMS
                              Garantiya: 2343454
                              Year : 2019
                              Nomer_tovara: 557436
                              Brend: ORP
                              Garantiya: 78788777
                              Year : 2019
                              Миксуй как хочешь
                              ExpandedWrap disabled
                                Var
                                  FIn,FOut:TextFile;
                                  I:Integer;
                                  s:String;
                                  Sl:TStringList;
                                 
                                begin
                                  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
                                              WriteLn(FOut,
                                              Sl.Names[I-4]+':'+Trim(Sl.ValueFromIndex[I-4])+//Nomer_tovara
                                              Sl.Names[I-3]+':'+Trim(Sl.ValueFromIndex[I-3])+//Brend
                                              Sl.Names[I-2]+':'+Trim(Sl.ValueFromIndex[I-2])+//Garantiya
                                              Sl.Names[I-1]+':'+Trim(Sl.ValueFromIndex[I-1])//Year
                                              );
                                              I:=0;
                                              sl.Clear;
                                            end;
                                 
                                 
                                      End;
                                 
                                  CloseFile(FIn);
                                  CloseFile(FOut);
                                 
                                  Sl.Free;
                                 
                                end;
                                ^D^ima, Все разобрался. СПАСИБО!
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1895 ]   [ 16 queries used ]   [ Generated: 25.04.24, 09:45 GMT ]