Текущий архив: 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: 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;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.051 c