Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с TStringList, Не перемещается “указатель” 
:(
    Опции темы
Martin_8
Дата 22.12.2008, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 16.10.2006
Где: Минск

Репутация: нет
Всего: нет



Здравствуйте.
Помогите, пожалуйста, разобраться с TStringList. Статью о TStringList я прочитал, но всё равно не могу понять, почему происходит так, как описанное ниже.

У меня есть txt файл, который мне необходимо обработать. Скажем, записать результат его парсинга в memo.
Файл состоит из двух секций [IN_PARAM] и [OUT_PARAM]. 
В секции [OUT_PARAM] содержится информация в формате “^имя” = “значение^”. Причём блоки параметров “^имя” = “значение^” периодически (через 12 строк) повторяются (начало 12-и строчного блока это ^DocDate, а конец это ^Num ). Первые 12 строк описывают одну организацию, следующие 12 строк описывают вторую организацию и т.д.
На выходе, я хочу получить только “значения”.

txt файл прикреплён.

Разбор я выполняю так.
Код

procedure TForm1.Button2Click(Sender: TObject);
var
  s : TStringList;
  i,k,b,l,h,j,f : integer;
  a,ss:string;
begin
  s := TStringList.Create;
  try
   if dlgOpen1.Execute then Memo1.Lines.LoadFromFile(dlgOpen1.FileName);
   Memo1.Lines.LoadFromFile(dlgOpen1.FileName);
   s.LoadFromFile(dlgOpen1.FileName);

   k:=s.IndexOf('[OUT_PARAM]');  // определяем номер строки, где находится [OUT_PARAM]

   f:=0;
   l:=k+1;
   // В этом while ищем номер строки, где находится ^DocDate именно с ^DocDate начинаются те самые 12 строк
   while f=0 do
    begin
     If (Pos('^DocDate',s.Names[l])<>0) then
      begin
        ShowMessage(IntToStr(l));
        h:=l; // номер строки, где находится ^DocDate
        f:=1;
      end;
     l:=l+1;
    end;

    // Выводим в мемо по 12 строк
    while h<s.Count-1 do
     begin
       for j:= h to h+12 do
        begin
          b:= Pos('^',s.Values[s.Names[j]]); // определяю позицию нахождения в строке символа ^
          ss:=s.Values[s.Names[j]];          // переписываем строку
          Delete(ss,b,1);                    // удаляем символ ^
          Memo2.Lines.Add(ss);               // выводим результат в memo
          h:=h+1;
        end;
     end
  finally
    s.Free;
  end;

end;

Вся проблема во втором while: 
Первый 12 итераций в for выполняются нормально, и я получаю данные об первой организации. Но следующие 12 итераций for опять выводят информацию о первой организации, а не о следующей. С третей та же проблема и т.д. Хотя я вижу, что переменная j меняется. 
Возникает такое ощущение, что “указатель  строки” не перемещается дальше, а остаётся на первом блоке из 12-записей.
Покажите, где здесь ошибка и как её исправить?

P.S. 
Потом, если удастся побороть описанную проблему, нужно будет вносить “значения” в БД, Insert запросом по 12 за раз. 
Посоветуйте, как и куда лучше сохранять мои “значения”, для последующей вставки в БД через Insert ?



Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  document1.txt 1,81 Kb
PM   Вверх
Данкинг
Дата 22.12.2008, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(Martin_8 @  22.12.2008,  01:59 Найти цитируемый пост)
Код

if dlgOpen1.Execute then Memo1.Lines.LoadFromFile(dlgOpen1.FileName);
   Memo1.Lines.LoadFromFile(dlgOpen1.FileName);
   s.LoadFromFile(dlgOpen1.FileName)
;

А зачем дважды грузить в Memo1, но в результате всё равно работать с S ? smile Кстати, я даже боюсь представить, что будет, если пользователь всё же не выберет файла через OpenDialog!  smile Впрочем, ошибка через try...finally всё равно отловится, согласен.

Честно говоря, ничего из кода не понял, но могу посоветовать использовать не StringList, а TextFile, т.е. читать строки напрямую из текста. smile Да и "значения" я бы брал, просто отсекая всё слева, что идёт за "равно", а потом удаляя ^.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Martin_8
Дата 22.12.2008, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 16.10.2006
Где: Минск

Репутация: нет
Всего: нет



Данкинг, Спаибо за ответ, особоеено в такое время.
Я в принципе, делаю всё так, как Вы написали.

Цитата(Данкинг @  22.12.2008,  03:07 Найти цитируемый пост)
Да и "значения" я бы брал, просто отсекая всё слева

Я так и делаю, вот здесь, как раз и нахдится "значение"
Код

Values[s.Names[j]]

Цитата(Данкинг @  22.12.2008,  03:07 Найти цитируемый пост)
то идёт за "равно", а потом удаляя ^

Вот это делается здесь:

Код

b:= Pos('^',s.Values[s.Names[j]]); // определяю позицию нахождения в строке символа ^
ss:=s.Values[s.Names[j]];          // переписываем строку
Delete(ss,b,1);                    // удаляем символ ^
// Теперь в ss чистая строка со "значением" без ^ 


Но я хочу понять, почему в моём случаи, не перемещается "указатель" строк в TStringList. 
Я просто зашёл в тупик.  smile 


Это сообщение отредактировал(а) Martin_8 - 22.12.2008, 10:04
PM   Вверх
NewDima
Дата 22.12.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



не совсем вкуриваю, о каком указателе речь...
PM ICQ   Вверх
NewDima
  Дата 22.12.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



 smile 

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  migli.rar 3,26 Kb
PM ICQ   Вверх
TRS743
Дата 22.12.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.12.2008

Репутация: нет
Всего: нет



for j:= h to h+12 do
        begin
          b:= Pos('^',s.Values[s.Names[j]]); // определяю позицию нахождения в строке символа ^
          ss:=s.Values[s.Names[j]];          // переписываем строку
          Delete(ss,b,1);                    // удаляем символ ^
          Memo2.Lines.Add(ss);               // выводим результат в memo
          h:=h+1;
        end;
Не совсем понял смысл проги, но выделенное красным цветом вызывает подозрения
PM MAIL   Вверх
Martin_8
Дата 22.12.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 16.10.2006
Где: Минск

Репутация: нет
Всего: нет



NewDima, Спасибо! 
А я как-то не заметил свойство ValueFromIndex у TStringList. С ним всё работает. Честно говоря, я не понял, почему не работает мой код, ну да ладно.

Посоветуйте, пожалуйста, ещё по поводу этого:
Цитата(Martin_8 @  22.12.2008,  01:59 Найти цитируемый пост)
P.S. 
Потом, если удастся побороть описанную проблему, нужно будет вносить “значения” в БД, Insert запросом по 12 за раз. 
Посоветуйте, как и куда лучше сохранять мои “значения”, для последующей вставки в БД через Insert ?



Это сообщение отредактировал(а) Martin_8 - 22.12.2008, 12:02
PM   Вверх
Данкинг
Дата 22.12.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(Martin_8 @  22.12.2008,  12:02 Найти цитируемый пост)
Потом

Когда "потом" - сразу и вноси.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
NewDima
Дата 22.12.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Цитата(Martin_8 @ 22.12.2008,  19:02)
Посоветуйте, пожалуйста, ещё по поводу этого:
Цитата(Martin_8 @  22.12.2008,  01:59 Найти цитируемый пост)
P.S. 
Потом, если удастся побороть описанную проблему, нужно будет вносить “значения” в БД, Insert запросом по 12 за раз. 
Посоветуйте, как и куда лучше сохранять мои “значения”, для последующей вставки в БД через Insert ?

это уже следующая тема и другой раздел
базы данных
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.