Что нового

как из текста получить значение между = и , ?

mitiya

Новичок
Сообщения
75
Репутация
0
Здравствуйте. Есть вот у меня файл с такими строками

Код:
Субъект: OID.1.0.800.0000.1.0.2=INN=111111111/OGRNIP=2222222222, CN=Иванов Иван Иванович, OU=0, O=ИП Иванов Иван Иванович, L=Энск, S=01 Энская область, C=RU, [email protected], OID.1.0.003.3.100.1.1=111111111, OID.1.0.000.100.3=000000082, OID.1.2.003.100.5=2222222222

и надо бы мне получить массив вот такого вида примерно

CN=Иванов Иван Иванович
INN=111111111
OGRNIP=2222222222

и тд.
Как видно, эти значения обычно располагаются между чем-то вроде "CN=" и ",".
Пытался сочинить регэксп, но ничего не вышло ( никак они мне не даются (
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
#include 'array.au3'
$file=ClipGet()
$str=StringRegExp($file,'INN=([^/,:]+)[^:]+OGRNIP=([^/,:]+)[^:]+CN=([^/,:]+)',3)
_ArrayDisplay($str)
 
Автор
M

mitiya

Новичок
Сообщения
75
Репутация
0
Спасибо. Только, почему-то обрабатывается только первое совпадение. В том плане что в файле много таких строк, а в массиве только первая.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
#include 'array.au3'
$file=FileRead(@ScriptDir&'\sss2.txt')
$str=StringRegExp($file,'INN=([^/,:]+)[^:]+OGRN\S*=([^/,:]+)[^:]+CN=([^/,:]+)',3)
_ArrayDisplay($str)

OGRNIP встречается в файле 1 раз, остальные OGRN
 
Автор
M

mitiya

Новичок
Сообщения
75
Репутация
0
да но inn то встречается и больше раз. На самом деле там много каких полей может и не быть. Хотелось бы чтоб в таком случае в ячейке просто пустота была.
Я чувствуют что надо наверно по срокам скармливать нескольким регекспам, что бы в случае если есть данные они находились а если нет то оставалась пустота и дальше происходил поиск.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Для меня регулярные выражения - китайская грамота :stars:, что , если считать весь файл, затем функцией
Код:
StringSplit
разделить текст в массив по разделителю "Субъект"- получим массив по субъектам, дальше при помощи той-же функции по каждому из субъектов разделить по "," ,при наличии в строке "/" тоже делим и уже всё разделить по "=" в итоге по каждому из субъектов получится массив, где в "0" элементе название значения, а в "1" элементе его значение. Долго, но без китайской грамоты :-[ в таком варианте - всё равно какие есть параметры, каких нет, в какой последовательности...
Вот и вариант моих извращений :-[
Код:
#include <Array.au3>

$Path=FileOpenDialog('Открыть файл',@ScriptDir,'Текстовый файл(*.txt)',1)
$File=FileOpen($Path)
$sFile=FileRead($File)
FileClose($File)
$Array=StringSplit($sFile,'Субъект:',1+2)
;_ArrayDisplay($Array)
 For $i=1 to Ubound($Array)-1
  $SubArray=StringSplit($Array[$i],',',1)
    For $y=0 to Ubound($SubArray)-1
		If StringInStr($SubArray[$y],'=')=0 Then _ArrayDelete($SubArray,$y)
		If StringInStr($SubArray[$y],'/')>0 Then
		  $Ar=StringSplit($SubArray[$y],'/',1)
		  _ArrayDelete($SubArray,$y)
            For $j=0 to Ubound($Ar)-1
				_ArrayAdd($SubArray,$Ar[$j])
			Next
        EndIf
    Next
	_ArrayDisplay($SubArray)
 Next
Разделение по "=" не делал,
В одной из строк типа "OID.1.2.840.113549.1.9.2=INN=11111111" есть два знака "=" лишнее не сложно будет отсеять.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
#include 'array.au3'
$file=FileRead(@ScriptDir&'\sss2.txt')
$str=StringRegExp($file,'INN=([^/,:]+)[^:]+?(?:OGRNIP=([^/,:]+)[^:]+)?CN=([^/,:]+)',3)
_ArrayDisplay($str)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
mitiya [?]
и надо бы мне получить массив вот такого вида примерно
CN=Иванов Иван Иванович
INN=111111111
OGRNIP=2222222222
Код:
#include<Array.au3>
$sFile = FileRead("sss2.txt")
$aData = StringRegExp($sFile, "INN=(?<=INN=)\d+|OGRNIP=(?<=OGRNIP=)\d+|(CN=(?<=CN=).*?),", 3)
;~ $aData = StringRegExp($sFile, "(?<=INN=)\d+|(?<=OGRNIP=)\d+|((?<=CN=).*?),", 3)
_ArrayDisplay($aData)
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
хм, вот как вы просили:
mitiya [?]
CN=Иванов Иван Иванович
INN=111111111
OGRNIP=2222222222


Код:
#include <Array.au3>
$read = FileRead (@scriptdir&'\temp.txt')

$far = StringRegExp ($read, '/(.+?),',3) ; получаем ОГРН

For $i = 0 To UBound ($far) -1
   $far [$i] = StringRegExpReplace ($far[$i], '(.*?)/','')
   If   StringRegExp ($far [$i], '=', 0) = 0 Then
	  $far [$i] = ''
	  EndIf

   Next

For $i = UBound($far, 1) - 1 To 0 Step -1
    If $far[$i] = "" Then _ArrayDelete($far, $i)
Next


$far_cn = StringRegExp ($read, 'CN=(.+?),',3) ; получаем Имя
For $i = 0 To UBound ($far_cn ) -1
   $far_cn [$i] = "CN="&$far_cn [$i]
   Next

$far_inn = StringRegExp ($read, 'INN=(.+?)/',3) ; получаем ИНН
For $i = 0 To UBound ($far_inn ) -1
   $far_inn [$i] = "INN="&$far_inn [$i]
   Next

Dim $sArray = $far

Local $j=0
For $i = 0 To UBound ($far) - 1

_ArrayInsert($sArray, $i*2, $far_inn[$i])
Next

For $i = 0 To UBound ($far_cn) -1
_ArrayInsert($sArray, $i*3, $far_cn[$i])
Next

_ArrayDisplay ($sArray)
 
Верх