считывать строку по услувию

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Mekhtiev
Постоянный гость
Сообщения: 92
Зарегистрирован: 24 янв 2013, 16:33

считывать строку по услувию

Сообщение Mekhtiev »

Не подскажете дорогие коллеги, как удалить или не считывать/считывать строку по условию? условие наличие в определяемой подстроке символа "."
2;Hyundai-R450LC-7_1867УА02;18.04.2013 8:08;180;794;
02.янв;Hyundai-R450LC-7_1867УА02;17.04.2013 7:57;180;334;
подстроку определяю с первого вхождения до символа ";" и если есть в этой подстроке "." то не считывать всю строку..
тоеть отбрасывать из моего цикла парсинга строки где есть бред типа "02.янв"
ВБР РУЛИТ)))ИС3
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: считывать строку по услувию

Сообщение edward_K »

А подробности - откуда чего запускаете? Если свой код то вообще проблем нет, если обмен бизнес документами то обычно решается предобработкой в специальном объектеном фейсе
Mekhtiev
Постоянный гость
Сообщения: 92
Зарегистрирован: 24 янв 2013, 16:33

Re: считывать строку по услувию

Сообщение Mekhtiev »

я написал интерфейс для загрузки csv в таблицу свою,

Код: Выделить всё

procedure LoadFile2;
{

      gfFile.OpenFile(filename2, stOpenRead);
      gfFile.ReadLn(str);
      while not gfFile.EOF() do

      {
        gfFile.ReadLn(str);
          str:=AnsiToOem(str);
          str:=Replace(str, '"', '');
          str:=Replace(str, 'л', '');
          str:=Replace(str, '*', '');
      f_TmarkaTS:=substr(str,1, instr('_',str)-1);
           str:=substr(str,(instr('_', str)+1), 60);
          f_TnumberTS:=substr(str,1, instr(';',str)-1);
       
               str:=substr(str,(instr(';', str)+1), 60);
    
  
     
   
       f_year:=substr(str,1, instr('-',str)-1);

       str:=substr(str,(instr('-', str)+1),60 );
			 f_month:=substr (str,1, instr('-',str)-1);

       str:=substr(str,(instr('-', str)+1),60 );
			 f_day:=substr (str,1, instr(' ',str)-1);

       str:=substr(str,(instr(' ', str)+1),60 );
       f_hour:=substr (str,1, instr(':',str)-1); //часы

       str:=substr(str,(instr(':', str)+1),60 );
			 f_min:=substr(str,1, instr(':',str)-1);

       str:=substr(str,(instr(':', str)+1),60 );
			
        f_dtime:= _datetime(f_day,f_month,f_year,f_hour,f_min,0,0);
          str:=substr(str,(instr(';', str)+1), 60);
      f_SLevel:=double(Trim(substr(str,1, instr(';',str)-1)));
      str:=substr(str,(instr(';', str)+1), 60);
      f_Fueling:=double(Trim(substr(str,1, instr(';',str)-1)));

   insert current wialonzapravki set
              wialonzapravki.Tmarka:=f_TmarkaTS,
              wialonzapravki.Tnumber:=f_TnumberTS,
              wialonzapravki.Dtime:=f_Dtime,
              wialonzapravki.SLevel:=f_SLevel,
              wialonzapravki.Fueling:=f_Fueling

      }      
ВБР РУЛИТ)))ИС3
Mekhtiev
Постоянный гость
Сообщения: 92
Зарегистрирован: 24 янв 2013, 16:33

Re: считывать строку по услувию

Сообщение Mekhtiev »

5;БеАЗ-7540А_1828УА02;17.04.2013 20:44;167;121; --------- такие строки не надо записывать
05.янв;БеАЗ-7540А_1828УА02;17.04.2013 14:44;167;65;--------- а вот такие читать
05.фев;БеАЗ-7540А_1828УА02;17.04.2013 20:44;194;56;;------- а вот такие читать
ВБР РУЛИТ)))ИС3
Mekhtiev
Постоянный гость
Сообщения: 92
Зарегистрирован: 24 янв 2013, 16:33

Re: считывать строку по услувию

Сообщение Mekhtiev »

готовой строковой функции нет, надо ципкл с условием написать, но я не понимаю что в условии делать парсинг искать эту точку, и только потом продолжать работать со строками? как это вообще будет выглядить не приходит в голову
ВБР РУЛИТ)))ИС3
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: считывать строку по услувию

Сообщение Den »

Не очень понятно в чем загвоздка...Что то вроде такого :
...
while not gfFile.EOF() do
{
gfFile.ReadLn(str);
if instr('.',substr(str,1,instr(';',str)-1))>0
continue;
...
Mekhtiev
Постоянный гость
Сообщения: 92
Зарегистрирован: 24 янв 2013, 16:33

Re: считывать строку по услувию

Сообщение Mekhtiev »

проблема то в том что я не прогер про образованию, и мне вообще всё это почти китайскай грамота, но мне это итересно, и занимать эту должность еще 1,5 года пока девушка на дикретном листе, вот как то так....спасибо, но
*******if instr('.',substr(str,1,instr(';',str)-1))>0
continue;******
для случая если наоборот неучитывать те строки где есть ".", а надо наоборот учитывать только те где есть точка.
подскажи уж дятлу еще раз?
if instr('.',substr(str,1,instr(';',str)-1))>0
нашел он точку и к следующей итерации перешел. а надо бы наоборот, чтоб если не нашел, либо может отталкиваться от длинны строки от первого вхождения до ";"
. если меньше 2 символов то переходить к следующей итерации
ВБР РУЛИТ)))ИС3
Mekhtiev
Постоянный гость
Сообщения: 92
Зарегистрирован: 24 янв 2013, 16:33

Re: считывать строку по услувию

Сообщение Mekhtiev »

разобрался я. спасибо EDWARD
тему считаю закрытой
ВБР РУЛИТ)))ИС3
Mekhtiev
Постоянный гость
Сообщения: 92
Зарегистрирован: 24 янв 2013, 16:33

Re: считывать строку по услувию

Сообщение Mekhtiev »

так и не получается при загрузке в мною написанном интерфейсе, проверять уже имеющиеся записи в таблице (тож моя). запись с проверкой на дубликатов чтоли получается, начальник настаивает что селект надо писать и после только инсерт, но что... какая функция должна сравнивать возвращенные в селекте и свежезаписываемыми.
ВБР РУЛИТ)))ИС3
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: считывать строку по услувию

Сообщение edward_K »

Код: Выделить всё

if getfirst wialonzapravki where ((
        f_TmarkaTS ==   wialonzapravki.Tmarka
and f_TmarkaTS ==              wialonzapravki.Tnumber
and f_Dtime   ==              wialonzapravki.Dtime
and f_SLevel ==              wialonzapravki.SLeve
and f_Fueling  ==             wialonzapravki.Fueling )) <>0
  Insert ...
после условий не подходящих под индекс написать (noindex). индекс подберите с максимально возможным совпадением условий
Mekhtiev
Постоянный гость
Сообщения: 92
Зарегистрирован: 24 янв 2013, 16:33

Re: считывать строку по услувию

Сообщение Mekhtiev »

Чет не получается, проект компилится, а в таблицу всё ровно залетают ранее записанные данные
Кто разбирается посмотрите где ошибка а?

Код: Выделить всё

function AnsiToOem (string) : string; external 'atlantis.rtl#CharToOemString';

table struct local wialonpoezdki  //ключевое слово для задания имени физической таблицы, которая является корневой для данного видимого элемента   Признак главного (внешнего) цикла по SQL-таблице. Используется в конструкции ".table blank".
   (nrec:comp,
    Tmarka:string,
    Tnumber:string,
    probeg:double
    )

    with index (uniqal=nrec);  // задаем индекс

table struct local wialonzapravki  //ключевое слово для задания имени физической таблицы, которая является корневой для данного видимого элемента   Признак главного (внешнего) цикла по SQL-таблице. Используется в конструкции ".table blank".
   (nrec:comp,
    Tmarka:string,
    Tnumber:string,
    Dtime:datetime,
    SLevel:double,
    Fueling:double
    )
    with index (uniqal=nrec);

Interface  Wialon 'Импорт данных с Wialon' EscClose;   //начало описания интерфейса.

show at (1,10,160,45);   //ключевое слово для задания размеров видимых элементов и окон.



var
    FileName:string;
    FileName2:string;       // раздел объявления переменных.
    str:string;
    f_nrec:comp;
    f_Tmarka:string;
    f_Tnumber:string;
    f_probeg:double;
    stmt:longint;
    f_TmarkaTS:string;
    f_TnumberTS:string;
    f_Dtime:datetime;
    f_Day:string;
    f_month:string;
    f_year:string;
    f_hour:string;
    f_min:string;
 //f_sec:string;
    f_SLevel:double;
    f_Fueling:double;
    stmt2:longint;
    Filename1K:string;
    Filename2K:string;


create view   //начало описания логической таблицы.
 as
 select *//Поле
 from wialonpoezdki,
      wialonzapravki; //из таблицы



 File gfFile, gfFile2;


procedure LoadFile;
{

      gfFile.OpenFile(filename, stOpenRead);
      gfFile.ReadLn(str);
      while not gfFile.EOF() do

      {
        gfFile.ReadLn(str);
          str:=AnsiToOem(str);
          str:=Replace(str, '"', '');
          f_Tmarka:=substr(str,1, instr('_',str)-1);
           str:=substr(str,(instr('_', str)+1), 50);
          f_Tnumber:=substr(str,1, instr(';',str)-1);
            str:=substr(str,(instr(';', str)+1), 50);
            str:=Replace(str, 'км', '');
          f_probeg:=double(Trim(substr(str,1, instr(';',str)-1)));

        if getfirst wialonzapravki where ((
               f_Tmarka ==   wialonpoezdki.Tmarka(noindex)
               and f_Tnumber   == wialonpoezdki.Tnumber(noindex)
               and f_probeg ==  wialonpoezdki.probeg(noindex))) <>0
       insert current wialonpoezdki set
              wialonpoezdki.Tmarka:= f_Tmarka,
              wialonpoezdki.Tnumber:= f_Tnumber,
              wialonpoezdki.probeg:= f_probeg

      }

      stmt:= sqlAllocStmt;
_loop wialonpoezdki
{
sqlPrepare(stmt, 'savefromwialonpoezdki(?,?,?)');
sqlBindParam(stmt, 1, wialonpoezdki.tmarka);
sqlBindParam(stmt, 2, wialonpoezdki.Tnumber);
sqlBindParam(stmt, 3, wialonpoezdki.probeg);


SqlExecute(stmt);
}
sqlFreeStmt(stmt);
      gfFile .Close();

}

procedure LoadFile2;
{

      gfFile.OpenFile(filename2, stOpenRead);
      gfFile.ReadLn(str);
      while not gfFile.EOF() do

      {
        gfFile.ReadLn(str);
        if instr('.',substr(str,1,instr(';',str)-1))=0
        continue;
          str:=AnsiToOem(str);
          str:=Replace(str, '"', '');
          str:=Replace(str, 'л', '');
          str:=Replace(str, '*', '');
          str:=substr(str,(instr(';', str)+1), 60);
      f_TmarkaTS:=substr(str,1, instr('_',str)-1);
          str:=substr(str,(instr('_', str)+1), 60);
      f_TnumberTS:=substr(str,1, instr(';',str)-1);
          str:=substr(str,(instr(';', str)+1), 60);

     //           "08.02.2013 16:59" дата выгружается по разному
       f_day:=substr  (str,1, instr('.',str)-1);
			     str:=substr(str,(instr('.', str)+1),60 );
			 f_month:=substr(str,1, instr('.',str)-1);
			     str:=substr(str,(instr('.', str)+1),60 );
			 f_year:=substr (str,1, instr(' ',str)-1);
           str:=substr(str,(instr(' ', str)+1),60 );
       f_hour:=substr (str,1, instr(':',str)-1); //часы
			     str:=substr(str,(instr(':', str)+1),60 );
			 f_min:=substr  (str,1, instr(';',str)-1);
       f_dtime:=_datetime(f_day,f_month,f_year,f_hour,f_min,0,0);
           str:=substr(str,(instr(';', str)+1), 60);
      f_SLevel:=double(Trim(substr(str,1, instr(';',str)-1)));
          str:=substr(str,(instr(';', str)+1), 60);
      f_Fueling:=double(Trim(substr(str,1, instr(';',str)-1)));

if getfirst wialonzapravki where ((
f_TmarkaTS ==   wialonzapravki.Tmarka(noindex)
and f_TmarkaTS ==  wialonzapravki.Tnumber(noindex)
and f_Dtime   == wialonzapravki.Dtime(noindex)
and f_SLevel ==  wialonzapravki.SLevel(noindex)
and f_Fueling  ==  wialonzapravki.Fueling(noindex) )) <>0





           insert current wialonzapravki set
              wialonzapravki.Tmarka:=f_TmarkaTS,
              wialonzapravki.Tnumber:=f_TnumberTS,
              wialonzapravki.Dtime:=f_Dtime,
              wialonzapravki.SLevel:=f_SLevel,
              wialonzapravki.Fueling:=f_Fueling

      }
      stmt2:= sqlAllocStmt;
      _loop wialonzapravki
{
sqlPrepare(stmt2, 'savefromwialonzapravki(?,?,?,?,?)');
sqlBindParam(stmt2, 1, wialonzapravki.Tmarka);
sqlBindParam(stmt2, 2, wialonzapravki.Tnumber);
sqlBindParam(stmt2, 3, wialonzapravki.Dtime);
sqlBindParam(stmt2, 4, wialonzapravki.SLevel);
sqlBindParam(stmt2, 5, wialonzapravki.Fueling);


SqlExecute(stmt2);
}
sqlFreeStmt(stmt2);
 gfFile.Close();
}

screen vibor; // вид окна
  show (,,,6);
 fields
 FileName :pickButton;
 fileName2 :pickButton;
 buttons
 cmBounds;
 cmBounds;



  <<
      Выбор файла Poezdki:   .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
      <. Загрузка .>
      Выбор файла Zapravki:  .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
      <. Загрузка .>
  >>
   end;



browse tab;
show at(,7,79,)
  table wialonpoezdki;

fields
    wialonpoezdki.Tmarka #3'Марка' ('Марка ТС',,) : [20], protect;
    wialonpoezdki.Tnumber #3'Номер' ('Номер ТС',,) : [20], protect;
    wialonpoezdki.probeg #3'Пробег' ('Пробег ТС',,) : [20.2], protect;


end;

browse tab2;
show at(80,7,,)
  table wialonzapravki;

fields
    wialonzapravki.Tmarka #3'Марка' ('Марка ТС',,):[20], protect;
    wialonzapravki.Tnumber #3'Номер' ('Номер ТС',,) : [20], protect;
    wialonzapravki.Dtime #3'дата' ('дата',,):[50], protect;
    wialonzapravki.SLevel #3'уровень топлива' ('уровень топлива',,):[20.2], protect;
    wialonzapravki.Fueling #3'заправка' ('заправка',,):[20.2], protect;

end;


handleEvent         //обработчик событий
 cmbounds:
{


}
cmInit: {
//задание ограничения в операторе


}
//end;


cmPick:
  {
    Case CurField of
        #FileName:
 {
          FileName:= GetFileName ('Poezdki.csv','Выберите файл с отчетом Poezdki');//= 'Poezdki.csv';
              LoadFile();
              Message('Файл загружен!!!');
              ReReadRecord(tnwialonpoezdki);
           };

          #FileName2:
         {
          FileName2:= GetFileName ('Zapravki.csv','Выберите файл с отчетом Zapravki');//= 'Zapravki.csv';
              LoadFile2();
              Message('Файл загружен!!!');
              ReReadRecord(tnwialonzapravki);
         };
   end;   //Case
  }
end;

end.
ВБР РУЛИТ)))ИС3
Mekhtiev
Постоянный гость
Сообщения: 92
Зарегистрирован: 24 янв 2013, 16:33

Re: считывать строку по услувию

Сообщение Mekhtiev »

видимо у меня проблема с индексами, их надо обозначить, но вот как пока инфу не найду
ВБР РУЛИТ)))ИС3
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: считывать строку по услувию

Сообщение edward_K »

скорей всего со скобками. Лучше не лениться а всегда использовать в If {} , кроме совсем простых строк. Noindex должен был прокатывать. Либо поля при вставке режуться.
logstrtofile вам поможет :).
Mekhtiev
Постоянный гость
Сообщения: 92
Зарегистрирован: 24 янв 2013, 16:33

Re: считывать строку по услувию

Сообщение Mekhtiev »

щяс попробую
ВБР РУЛИТ)))ИС3
Mekhtiev
Постоянный гость
Сообщения: 92
Зарегистрирован: 24 янв 2013, 16:33

Re: считывать строку по услувию

Сообщение Mekhtiev »

insert обрамил в { } не помогло.. всё после if как то нехорошо в скобки.
ВБР РУЛИТ)))ИС3
Ответить