|
#1
|
|||
|
|||
Добрый день!
Имеется строка: s2:='CN=Иванов Иван Иванович, OU=Моя компания, O=экземпляр, STREET=г.Минск, ул.Ленина д.15 кв.45, L=test, ST=BPS, C=BY, OID.2.5.4.12=программист, OID.2.5.4.4=Иванов, OID.2.5.4.41=BPS-Иван Иванович'; необходимо разобрать строку по параметрам..Например: CN:='Иванов Иван Иванович'; Adress:= подстроке с параметром STREET как это сделать? вот пример моего кода: Код:
try sl:=TStringList.Create; SplitText(s2, sL); for i := 0 to sl.Count - 1 do begin if pos('OID.2.5.4.12=',sl[i])<>0 then begin doljn:=sl[i]; n:=length(doljn); doljn:=copy(doljn,16,n); end; if pos('OID.2.5.4.4=',sl[i])<>0 then begin familia:=sl[i]; n:=length(familia); familia:=copy(familia,14,n); end; if pos('OID.2.5.4.41=',sl[i])<>0 then begin imia_otchestvo:=sl[i]; n:=length(imia_otchestvo); imia_otchestvo:=copy(imia_otchestvo,15,n);; end; end; showmessage(Должность: '+doljn); showmessage('ФИО: '+familia+' '+imia_otchestvo); finally sL.Free; end; Но тогда засада с адресом..как быть? Последний раз редактировалось M.A.D.M.A.N., 17.04.2014 в 10:52. |
#2
|
||||
|
||||
Если количество параметров всегда одно и тоже, то можно просто циклом искать всё между очередной "=" и знаком "," записывая в массив
Код:
var params = array[0..9] of string; while not pos("=",str) <> 0 do begin p1 := pos('=',str); params[i] := copy(str, p1, pos(','str) - p1); i:=i+1; end; Школьное решение. А вообще надо присуммонить M.A.D.M.A.N'a с его плакатом "Используй RegExp!" Последний раз редактировалось Uniq!, 16.04.2014 в 18:21. |
#3
|
|||
|
|||
Цитата:
а если количество параметров меняется?! |
#4
|
||||
|
||||
Ну тогда я думаю стоит воспользоваться вторым советом:
Цитата:
|
#5
|
||||
|
||||
ИСПОЛЬЗУЙ REGEXP!
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось Admin, 17.04.2014 в 19:48. |
#6
|
||||
|
||||
Цитата:
'CN=Иванов Иван Иванович, OU=Моя компания, O=экземпляр, STREET=г.Минск\, ул.Ленина д.15 кв.45, L=test, ST=BPS, C=BY, OID.2.5.4.12=программист, OID.2.5.4.4=Иванов, OID.2.5.4.41=BPS-Иван Иванович' |
#7
|
||||
|
||||
Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject); var s2: string; sl, sm: TStrings; i: integer; flg: boolean; begin s2:= 'CN=Иванов Иван Иванович,' + ' OU=Моя компания, O=экземпляр,' + 'STREET=г.Минск, ул.Ленина д.15 кв.45,' + ' L=test, ST=BPS, C=BY, OID.2.5.4.12=программист,' + ' OID.2.5.4.4=Иванов, OID.2.5.4.41=BPS-Иван Иванович'; flg:= true; sl:= TStringList.Create; sm:= TStringList.Create; sl.Delimiter:= ','; sl.DelimitedText:= s2; for i := 0 to sl.Count-1 do if (Pos('=', sl[i]) > 0) then begin if flg then begin s2:= sl[i] + ' '; flg:= false; end else begin sm.Add(Copy(s2, Pos('=', s2) + 1, Length(s2))); s2:= sl[i] + ' '; end; end else s2:= s2 + sl[i] + ' '; sm.Add(Copy(s2, Pos('=', s2) + 1, Length(s2))); Memo1.Lines.Assign(sm); sl.Free; sm.Free; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 17.04.2014 в 08:48. Причина: исправление |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Eugene287 (17.04.2014)
|
#8
|
|||
|
|||
Цитата:
нет..это строка из буфера,в котором записаны данные о сертификате эл.ключа для подписи документов. спасибо большое!получилось! вопрос закрыт! Цитата:
хорошо..в Memo1 пишет все данные..а как сделать,чтобы каждый параметр записывался в свою переменную?! что-то не понимаю как это сделать.. Последний раз редактировалось M.A.D.M.A.N., 17.04.2014 в 10:52. |
#9
|
||||
|
||||
Да они и так по-полочкам разложены, удобно со значениями в стринглист работать, но если очень хочется чтоб в отдельных переменных были строки, то пжлст, вот
Для начала Код:
var CN, OU, O, STREET, L, ST, C, OID_2_5_4_12, OID_2_5_4_4, OID_2_5_4_41: string; ... Код:
{ Вариант I, на доверии } // Вставить до sm.Free CN:= sm[0]; OU:= sm[1]; O:= sm[2]; STREET:= sm[3]; L:= sm[4]; ST:= sm[5]; C:= sm[6]; OID_2_5_4_12:= sm[7]; OID_2_5_4_4:= sm[8]; OID_2_5_4_41:= sm[9]; Код:
{ Вариант II, с проверкой наличия нужной строки} {в процедуре необходимо сделать это ... sm.Add(s2); // sm.Add(Copy(s2, Pos('=', s2) + 1, Length(s2))); ... в двух местах} for i := 0 to sm.Count-1 do begin if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'CN' then CN:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i])); if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'OU' then OU:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i])); if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'O' then O:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i])); if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'STREET' then STREET:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i])); if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'L' then L:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i])); if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'ST' then ST:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i])); if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'C' then C:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i])); if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'OID.2.5.4.12' then OID_2_5_4_12:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i])); if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'OID.2.5.4.4' then OID_2_5_4_4:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i])); if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'OID.2.5.4.41' then OID_2_5_4_41:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i])); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |