Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.14.141.228] |
|
Сообщ.
#1
,
|
|
|
Есть текстовый файл (База.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 Вот код и он работает все отлично - но: Как мне сохранить в отдельный файл те строки которые не подошли под конфигурацию ?. |
Сообщ.
#2
,
|
|
|
Можно
|
Сообщ.
#3
,
|
|
|
Цитата Gonarh @ Можно Вопрос как ? |
Сообщ.
#4
,
|
|
|
Читаем файл Конфигурация.txt построчно, режем строку по разделителю '=', по первому элементу ищем номер строки в файле База.txt, читаем её в переменную, конкатенируем со вторым элементом разрезки, результат пишем в Результат.txt
|
Сообщ.
#5
,
|
|
|
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; |
Сообщ.
#6
,
|
|
|
Код не универсален, если образцы в разнобой, то работать не будет.
|
Сообщ.
#7
,
|
|
|
Цитата Gonarh @ Код не универсален, если образцы в разнобой, то работать не будет. А как будет лучше сделать ? |
Сообщ.
#8
,
|
|
|
см. моё предыдущее сообщение
|
Сообщ.
#9
,
|
|
|
Добрый день.
Хм, я понял "Gonarh" хочет чтобы Kirilis2018, начал что-то делать, а не только писать односложные предложения Подитожим Скрытый текст 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'); |
Сообщ.
#10
,
|
|
|
Немного хардкора от Масты
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 ПС. Код максимально оптимизирован, но еще можно оптимизировать через словари. |
Сообщ.
#11
,
|
|
|
Цитата RusSun @ Хм, я понял "Gonarh" хочет чтобы Kirilis2018, начал что-то делать, а не только писать односложные предложения Всё верно, притчу про рыбу и удочку не стоит забывать. |