считывать строку по услувию
Модераторы: m0p3e, edward_K, Модераторы
считывать строку по услувию
Не подскажете дорогие коллеги, как удалить или не считывать/считывать строку по условию? условие наличие в определяемой подстроке символа "."
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.янв"
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
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: считывать строку по услувию
А подробности - откуда чего запускаете? Если свой код то вообще проблем нет, если обмен бизнес документами то обычно решается предобработкой в специальном объектеном фейсе
Re: считывать строку по услувию
я написал интерфейс для загрузки 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
Re: считывать строку по услувию
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;;------- а вот такие читать
05.янв;БеАЗ-7540А_1828УА02;17.04.2013 14:44;167;65;--------- а вот такие читать
05.фев;БеАЗ-7540А_1828УА02;17.04.2013 20:44;194;56;;------- а вот такие читать
ВБР РУЛИТ)))ИС3
Re: считывать строку по услувию
готовой строковой функции нет, надо ципкл с условием написать, но я не понимаю что в условии делать парсинг искать эту точку, и только потом продолжать работать со строками? как это вообще будет выглядить не приходит в голову
ВБР РУЛИТ)))ИС3
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: считывать строку по услувию
Не очень понятно в чем загвоздка...Что то вроде такого :
...
while not gfFile.EOF() do
{
gfFile.ReadLn(str);
if instr('.',substr(str,1,instr(';',str)-1))>0
continue;
...
...
while not gfFile.EOF() do
{
gfFile.ReadLn(str);
if instr('.',substr(str,1,instr(';',str)-1))>0
continue;
...
Re: считывать строку по услувию
проблема то в том что я не прогер про образованию, и мне вообще всё это почти китайскай грамота, но мне это итересно, и занимать эту должность еще 1,5 года пока девушка на дикретном листе, вот как то так....спасибо, но
*******if instr('.',substr(str,1,instr(';',str)-1))>0
continue;******
для случая если наоборот неучитывать те строки где есть ".", а надо наоборот учитывать только те где есть точка.
подскажи уж дятлу еще раз?
if instr('.',substr(str,1,instr(';',str)-1))>0
нашел он точку и к следующей итерации перешел. а надо бы наоборот, чтоб если не нашел, либо может отталкиваться от длинны строки от первого вхождения до ";"
. если меньше 2 символов то переходить к следующей итерации
*******if instr('.',substr(str,1,instr(';',str)-1))>0
continue;******
для случая если наоборот неучитывать те строки где есть ".", а надо наоборот учитывать только те где есть точка.
подскажи уж дятлу еще раз?
if instr('.',substr(str,1,instr(';',str)-1))>0
нашел он точку и к следующей итерации перешел. а надо бы наоборот, чтоб если не нашел, либо может отталкиваться от длинны строки от первого вхождения до ";"
. если меньше 2 символов то переходить к следующей итерации
ВБР РУЛИТ)))ИС3
Re: считывать строку по услувию
так и не получается при загрузке в мною написанном интерфейсе, проверять уже имеющиеся записи в таблице (тож моя). запись с проверкой на дубликатов чтоли получается, начальник настаивает что селект надо писать и после только инсерт, но что... какая функция должна сравнивать возвращенные в селекте и свежезаписываемыми.
ВБР РУЛИТ)))ИС3
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: считывать строку по услувию
Код: Выделить всё
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 ...
Re: считывать строку по услувию
Чет не получается, проект компилится, а в таблицу всё ровно залетают ранее записанные данные
Кто разбирается посмотрите где ошибка а?
Кто разбирается посмотрите где ошибка а?
Код: Выделить всё
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
Re: считывать строку по услувию
видимо у меня проблема с индексами, их надо обозначить, но вот как пока инфу не найду
ВБР РУЛИТ)))ИС3
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: считывать строку по услувию
скорей всего со скобками. Лучше не лениться а всегда использовать в If {} , кроме совсем простых строк. Noindex должен был прокатывать. Либо поля при вставке режуться.
logstrtofile вам поможет .
logstrtofile вам поможет .
Re: считывать строку по услувию
insert обрамил в { } не помогло.. всё после if как то нехорошо в скобки.
ВБР РУЛИТ)))ИС3