Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

Поиск и замена символа в строке содержащей 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: tristania77@mail.ru


 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.042 c
15-1157282472
Aligator
2006-09-03 15:21
2006.09.24
Вопрос по поводу Graphics32


2-1157437863
worldmen
2006-09-05 10:31
2006.09.24
Программное изменение языков.


15-1157610374
Stexen
2006-09-07 10:26
2006.09.24
VS2005


2-1157649876
dexer
2006-09-07 21:24
2006.09.24
динамический TEdit и onkeyDown


2-1157266289
Mozgan
2006-09-03 10:51
2006.09.24
Числа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский