На главную Наши проекты:
Журнал   ·   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_
  
> Склеить строки используя файл конфигураций
    Есть текстовый файл (База.txt) в котором подана вот такая информация:

    Вот тут изменились условия то есть поиск конфигурации между знаками № и :

    Doc12№ver.01:От 01.01.2020
    Doc24№ver.02:От 02.01.2020
    Doc15№ver.03:От 03.01.2020
    Doc18№ver.04:От 04.01.2020
    Doc22№ver.05:От 05.01.2020
    А файл (Конфигурация.txt), в котором указаны конфигурации - выглядит вот так:

    №ver.01=\0021
    №ver.02=\0034
    №ver.03=\0070
    №ver.04=\0072
    №ver.05=\0871
    Программа заходит в текстовый документ Конфигурация.txt и смотрит что написано напротив №ver.01, №ver.02, №ver.03, №ver.04,№ver.05: И подставляет результаты в файл (База.txt) выходя из конфигурации. На выходе получается текстовый файл - Результат.txt в котором информация сохранена уже в таком виде:

    Doc12№ver.01:От 01.01.2020\0021
    Doc24№ver.02:От 02.01.2020\0034
    Doc15№ver.03:От 03.01.2020\0070
    Doc18№ver.04:От 04.01.2020\0072
    Doc22№ver.05:От 05.01.2020\0871
    Вот код и он работает все отлично - но: Как мне сохранить в отдельный файл те строки которые не подошли под конфигурацию ?.
    Сообщение отредактировано: Kirilis2018 -
      Можно
        Цитата Gonarh @
        Можно

        Вопрос как ?
          Читаем файл Конфигурация.txt построчно, режем строку по разделителю '=', по первому элементу ищем номер строки в файле База.txt, читаем её в переменную, конкатенируем со вторым элементом разрезки, результат пишем в Результат.txt
            ExpandedWrap disabled
              function Parse2(S: string; const Separators: string): string;
              var
                P: Integer;
              begin
               
                P := Pos(Separators, S);
                if P = 0 then
                begin
                  Result := S;
                  S := '';
                end
                else begin
                  Result := Copy(
                  S,
                  P+ Length(Separators),
                  Length(S)- P+ Length(Separators)
                  );
                end;
              end;
              procedure TForm1.Button1Click(Sender: TObject);
              var
              StrList: TStringList;
              StrList2: TStringList;
               I:integer;
              begin
                StrList:=TStringList.Create;
                StrList.LoadFromFile('1.txt');
               
                StrList2:=TStringList.Create;
                StrList2.LoadFromFile('2.txt');
               
                for I := 0 to StrList2.Count - 1 do
                    StrList[I]:= StrList[I]+Parse2(StrList2[I],'=');
               
                StrList2.Free;
                StrList.SaveToFile('3.txt');
                StrList.Free;
                memo1.lines.LoadFromFile('3.txt');
              end;
              Код не универсален, если образцы в разнобой, то работать не будет.
              Сообщение отредактировано: Gonarh -
                Цитата Gonarh @
                Код не универсален, если образцы в разнобой, то работать не будет.

                А как будет лучше сделать ?
                  см. моё предыдущее сообщение
                    Добрый день.
                    Хм, я понял "Gonarh" хочет чтобы Kirilis2018,
                    начал что-то делать, а не только писать односложные предложения :D

                    Подитожим
                    Скрытый текст

                    1 Первое получаем список из DocNN№ver.Num:От nn.nn.nnnn.
                    2 Сортируем.
                    3 Извлекаем условие для сравнения, ver.Num
                    ("Parsim" на пример до ":")
                    "Parsim" на пример всё после "№"(Result от(Parsim на пример до ":"))
                    --> список из ver.Num
                    4 Получаем второй список.
                    5 Идем в цикле по "списку из ver.Num" Если есть соответствие, то
                    "то создается новый элемент 'Итогового списка' " (тут же удаляем из списка "списку из ver.Num" данный элемент)
                    и когда мы пройдем все элементы, то в списке останется остаток из того на что не нашлось соответствия.
                    Это сохраняем отдельно "StrList~".SaveToFile('Остаток.txt');

                    :crazy:
                    Сообщение отредактировано: RusSun -
                      Немного хардкора от Масты :D
                      ExpandedWrap disabled
                        uses Spring.Collections;
                         
                        procedure ProcessList;
                        begin
                          const baza = TCollections.CreateList<string>([
                            'Doc#ver.01: 01.01.2020',
                            'Doc#ver.02: 02.01.2020',
                            'Doc#ver.03: 03.01.2020',
                            'Doc#ver.04: 04.01.2020',
                            'Doc#ver.05: 05.01.2020'
                          ]);
                         
                          const config = TCollections.CreateList<string>([
                            'Doc#ver.01=\0021',
                            'Doc#ver.02=\0034',
                            'Doc#ver.03=\0070',
                            'Doc#ver.04=\0072',
                            'Doc#ver.05=\0871'
                          ]);
                         
                          // lazy function
                          const LazyConvert = function (AList: IList<string>; ADelim: string):
                            IEnumerable<TPair<string, string>>
                          begin
                            Result := TEnumerable.Select<string, TPair<string, string>>(
                              AList,
                              function (s: string): TPair<string, string>        
                              begin        
                                var LA := s.Trim.Split(ADelim);
                                Result := TPair<string, string>.Create(LA[0], LA[1]);
                              end
                            );
                          end;
                         
                          const Output = TEnumerable.Select<TPair<string, string>, string>(
                            LazyConvert(baza, ':'),
                            function (p1: TPair<string, string>): string
                              var Ls: string;
                            begin
                              Result := p1.Key + ':' + p1.Value;
                              if LazyConvert(config, '=').Any(
                                function (const p2: TPair<string, string>): Boolean
                                begin
                                  Ls := p2.Value;
                                  Result := p1.Key = p2.Key;
                                end
                              ) then
                              begin
                                Result := Result + Ls;
                              end;
                            end
                          );
                         
                          // Output
                          Output.ForEach(procedure (const s: string)
                            begin
                              Log(s);
                            end
                          );
                        end;
                         
                        // OUTPUT
                        //Doc#ver.01:01.01.2020\0021
                        //Doc#ver.02:02.01.2020\0034
                        //Doc#ver.03:03.01.2020\0070
                        //Doc#ver.04:04.01.2020\0072
                        //Doc#ver.05:05.01.2020\0871

                      ПС. Код максимально оптимизирован, но еще можно оптимизировать через словари.
                      Сообщение отредактировано: Cfon -
                        Цитата RusSun @
                        Хм, я понял "Gonarh" хочет чтобы Kirilis2018,
                        начал что-то делать, а не только писать односложные предложения :D

                        :jokingly: Всё верно, притчу про рыбу и удочку не стоит забывать.
                        Сообщение отредактировано: Gonarh -
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0304 ]   [ 16 queries used ]   [ Generated: 16.04.24, 18:07 GMT ]