Перебор строк в файле и замена определенных значений

RichardIV
Дата: 16.06.2019 18:11:34
Привет!
Имеются файлы по 20-25 тысяч строк. Надо программно в каждом файле перебрать все строки (каждая запись - одна строка) и в случае наличия в строке определенного сочетания символов заменить их на другие из справочника соответствии.

Пример одной записи:
tovar=pmd;data=10.10.2018;price=150

Так вот, надо найти код товара, в данном примере - pmd, проверить есть ли на наго код в таблице соответвия и если есть, то заменить на помидор.

Должна получиться строка
tovar=помидор;data=10.10.2018;price=150

Пока планирую каждый файл через AssignFile цеплять и через WriteLn перебирать строки.
Затем буду вычлинять код товара и искать его в таблице соответствий. Правда, не знаю как её оформить - через dbf или ini файл.

Какие будут предложения - как лучше сделать требуемое мне? Чтобы скорость обработки была высокая и память не сильно расходовалась.
Dimitry Sibiryakov
Дата: 16.06.2019 18:24:07

RichardIV
как лучше сделать требуемое мне? Чтобы скорость обработки была высокая и память не сильно
расходовалась.

Для высокой скорости используй SetTextBuf. О памяти не беспокойся, она не сожрётся.

Posted via ActualForum NNTP Server 1.5

Gerasimenko
Дата: 16.06.2019 21:45:47
Dimitry Sibiryakov
RichardIV
как лучше сделать требуемое мне? Чтобы скорость обработки была высокая и память не сильно
расходовалась.

Для высокой скорости используй SetTextBuf. О памяти не беспокойся, она не сожрётся.

а я больше к субд склонен в этих вопросах...
Dmitry Arefiev
Дата: 16.06.2019 22:48:53
Странный формат. Есть возможность его изменить ?

PS:
RichardIV
tovar=помидор;data=10.10.2018;price=150

Дорого за гниль ...
ёёёёё
Дата: 16.06.2019 23:26:38
RichardIV
...
Затем буду вычлинять код товара и искать его в таблице соответствий. Правда, не знаю как её оформить - через dbf или ini файл.

Какие будут предложения - как лучше сделать требуемое мне? Чтобы скорость обработки была высокая и память не сильно расходовалась.

Нафик тебе эти dbf. Прямо в коде замену делай. Понадобится расширить или исправить - по-быстрому исправишь, перкомпилишь - и всё.

Вот, очень быстро и вообще ни одного байта памяти не расходуется:
var
  fFSrc: TextFile;
  fFTrg: TextFile;
  fOff1: Integer;
  fOff2: Integer;
  fOrig: string;
  fSrcStr: string;
begin
  fOff1 := Length('tovar=') + 1;
  AssignFile(fFSrc, 'src.txt');
  Reset(fFSrc);
  AssignFile(fFTrg, 'trg.txt');
  Rewrite(fFTrg);
  while not Eof(fFSrc) do begin
    Readln(fFSrc, fSrcStr);
    fOff2 := PosEx(';', fSrcStr, fOff1);
    if fOff2 > fOff1 then begin
      fOrig := Copy(fSrcStr, fOff1, fOff2 - fOff1);
      if fOrig = 'pmd' then
        fSrcStr := StuffString(fSrcStr, fOff1, fOff2 - fOff1, 'пындыром')
      else if fOrig = 'ogur' then
        fSrcStr := StuffString(fSrcStr, fOff1, fOff2 - fOff1, 'огурец')
      else if fOrig = 'arb' then
        fSrcStr := StuffString(fSrcStr, fOff1, fOff2 - fOff1, 'арбус')
      else if fOrig = 'kolb' then
        fSrcStr := StuffString(fSrcStr, fOff1, fOff2 - fOff1, 'колбас')
    end;
    Writeln(fFTrg, fSrcStr);
  end;
  CloseFile(fFSrc);
  CloseFile(fFTrg);
alekcvp
Дата: 17.06.2019 10:16:47
ёёёёё,

AssignFile и быстро в 2019м... спорно, НМВ.
Василий 2
Дата: 17.06.2019 10:33:45
alekcvp
ёёёёё,
AssignFile и быстро в 2019м... спорно, НМВ.

А в чем претензия к AssignFile? Один фиг через те же API работает. Или ты имеешь в виду загружать целиком? Если все строки порядка 30 байт, то 25 тыс строк это всего лишь 30*2*25000 = 1.5 Мб, полная ерунда для нынешних машин. В самом деле не стоит морочиться с поточной обработкой
Dimitry Sibiryakov
Дата: 17.06.2019 12:15:28

alekcvp
быстро в 2019м...

Не перевелись ещё наивные вьюноши, полагающие, что новые технологии могут быть быстрее
старых...

Posted via ActualForum NNTP Server 1.5

Valery_B
Дата: 17.06.2019 12:23:02
RichardIV
как лучше сделать требуемое мне?

Создай объектную модель, и загружай файл в неё.
Потом сохрани эту модель, причём желательно в другой формат, например - Json.

Если в файлах 25к строк, то создание словарей "пмд=помидор" займёт 99% времени.