Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

Поиск и замена символа в строке содержащей n символов   Найти похожие ветки 

 
Serjio77 ©   (2006-09-06 14:42) [0]

Здравствуйте глубокоуважаемые программеры!!!

У меня возникла проблема при перегонке данных из XML в DBF следующего плана. Я распарсил XML файл при помощи утилиты XML Mapper, подключил получившийся файл через ClientDataSet к DBGrid. Получилось так, что в табличном виде я таблицу увидел. После этого я при помощи Query и вот такого кода
begin
while not DBGrid2.DataSource.DataSet.Eof do
 begin
  with Query2 do
   begin
    Query2.Close;
    Query2.SQL.Clear;
    Query2.SQL.Add("Insert into RIV_M_68034_060613_1 (IDDOK)");
    Query2.SQL.Add("Values (""+DBGrid2.Fields[0].AsString+"")");
    Query2.ExecSQL;
  end;
DBGrid2.DataSource.DataSet.Next;
end;
попытался перегнать данные в таблицу RIV_M_68034_060613_1.dbf. И получился у меня облом. Все дело в том, что в поле DBGrid2.Fields[0].AsString встретилось значение типа 10 "в". У меня здесь все кричит благим матом, что мол символ в""это ошибка природы и быть его в этой строке не должно и делайте чего хотите, а я его грузить в базу не буду.
Грустно мне стало и я стал мучиться и читать книги, как мне из этой ситуации выйти. И набрёл я на алгоритм Боеля-Мура, который говорит что беду эту надо посимвольно шерстить (прямо символ за символом) и только тогда будет мне счастье. Но вот только я хотелбы узнать как этот код, который я приведу ниже и который я напишу в некотором unit.pas влепить в код который приведён выше?
type
 TIntVect = array [0..255] of Integer;
 TBMTable = array [0..0] of TIntVect;
 PBMTable = ^TBMTable;
function FindRightmost( const S, P : String;   n : Integer) : Integer;
var  i, j, lp : Integer;
begin
 Result := 0;
 lp := Length(P);
 if lp > n then Exit;
 for i := n - lp + 1 downto 1 do
 for j := 1 to lp do
 if P[j] <> S[i+j-1] then Break
 else if j = lp then
 begin    Result := i;
   Exit;
 end;
end;
procedure MakeBMTable( var BMT : PBMTable; const P : String);
var  i, j, lp, MaxShift, CurShift, SufPos : Integer;
 Suffix : String;
begin
 lp := Length(P);
 GetMem(BMT, SizeOf(TIntVect)*lp);
 for i := 0 to 255 do
BMT^[lp-1][i] := lp;
 for i := lp downto 1 do
 if BMT^[lp-1][Byte(P[i])] = lp then
 BMT^[lp-1][Byte(P[i])] := lp - i;
 MaxShift := lp;
 for i := lp - 1 downto 1 do
 begin
   SetLength(Suffix, lp - i);
   Move(P[i+1], Suffix[1], lp - i);
   if Pos(Suffix, P) = 1 then MaxShift := i;
   for j := 0 to 255 do
   begin
     CurShift := MaxShift;
     SetLength(Suffix, lp - i + 1);
     Suffix[1] := Char(j);
     Move(P[i + 1], Suffix[2], lp - i );
     SufPos := FindRightmost(P, Suffix, lp - 1);
     if SufPos <> 0 then CurShift := i - SufPos;
     BMT^[i-1][j] := CurShift;
   end;
   BMT^[i-1][Byte(P[i])] := 0;
 end;
end;
function BMSearch( StartPos, lp : Integer; const S : String;  BMT : PBMTable) : Integer;
var  Pos, i : Integer;
begin
 Pos := StartPos + lp -1;
 while Pos < Length(S) do
 for i := lp downto 1 do
 if BMT^[i-1][Byte(S[Pos-lp+i])] <> 0 then
 begin
   Pos := Pos + BMT^[i-1][Byte(S[Pos-lp+i])];
   Break;
 end
  else if i = 1 then
 begin
   Result := Pos - lp + 1;
   Exit;
 end;
 Result := 0;
end;
Прошу прощения, если слишком на скорую руку мой вопрос состряпан, но хотелосьбы услышать дельные рекомендации. Либо все возможные советы по поводу перегона данных из XML формата в формат DBF.
Заранее признателен!!!
P.S. Если есть готовый варинат решения сложившейся проблемы то можно отправить по E-mail: [email protected]


 
Palladin ©   (2006-09-06 14:52) [1]

о боже... а зачем тебе этот код то?
ты избавиться от кавычек хочешь или в базу их занести?
если, судя по теме сообщения, избавиться, то

s:=StringReplace(s,""","",[rfReplaceAll]);


 
default ©   (2006-09-06 14:59) [2]

если один символ искать в строке надо алгоритм Бойера-Мура нет смысла применять


 
Serjio77 ©   (2006-09-07 13:49) [3]


> s:=StringReplace(s,""","",[rfReplaceAll]);

Прошу прощения за недоходчивость, но я попробовал отработать ваш код таким образом:
var
s : string;
begin
s := BDEClientDataSet1.FieldByName("UL_NAME_NAMEP").AsString;
while not DBGrid2.DataSource.DataSet.Eof do
try
   Query2.Close;
   Query2.SQL.Clear;
   Query2.SQL.Add("Insert into RIV_M_68034_060613_1 (IDDOK)");
   Query2.SQL.Add("Values (""+DBGrid2.Fields[0].AsString+"")");
   Query2.ExecSQL;
on EDBEngineError do s := StringReplace(s,""","",[rfReplaceAll]);
end;
DBGrid2.DataSource.DataSet.Next;
end;
Я понимаю, что я что-то уже из виду упускаю, но я над этой проблемой уже не один день бьюсь. Я потому и подумал, что посимвольный разбор содержимого строки поможет найти искомый символ и в случае необходимости заменить его на требуемый вариант. Но если так как вы говорите, то самый оптимальный вариант решения это тот который я вам привел.
Хотя может быть можно и так -
var
s : string;
begin
s := BDEClientDataSet1.FieldByName("UL_NAME_NAMEP").AsString;
while not DBGrid2.DataSource.DataSet.Eof do
 with Query2 do
  begin
   Query2.Close;
   Query2.SQL.Clear;
   Query2.SQL.Add("Insert into RIV_M_68034_060613_1 (IDDOK)");
   Query2.SQL.Add("Values (""+DBGrid2.Fields[0].AsString+"")");
   Query2.ExecSQL;
end;
if s = """ then
begin
 s := StringReplace(s,""","",[rfReplaceAll]);
end
else
DBGrid2.DataSource.DataSet.Next;
end;

Хотя отработка этого скрипта снова приводит к генерации ошибки EDBEngineError



Страницы: 1 вся ветка

Текущий архив: 2006.09.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.033 c
15-1157044061
Ice
2006-08-31 21:07
2006.09.24
Полный оффтоп. :)


9-1133562554
Proger
2005-12-03 01:29
2006.09.24
Воксели в играх...?


2-1157015523
***mikle***
2006-08-31 13:12
2006.09.24
Создание динамических объектов


1-1155296292
KygECHuK
2006-08-11 15:38
2006.09.24
Поиск по имени компонента


15-1157037980
Alx_
2006-08-31 19:26
2006.09.24
madCollection