Код Powershell для извлечения числа между двумя звездочками в строке - PullRequest
0 голосов
/ 02 апреля 2020

Я знаю, что это должно быть легко, я погуглил ч $! | из этого! Но я не могу понять это. Мне нужно число, в данном случае 101, которое находится между ~ GE * и следующим *, которое встроено в довольно грубую строку данных. Ниже приведен пример строки данных:

ISA * 00 * 00 ZZ DIANER * ZZ * 88888 * 200401 *1305* ^ * 00501 * 000044761 * 1 * Р *: ~ GS H C DIANER * 88888 * 20200401 * 130536 * 44761 * Х * 005010X222A1 ~ ST * 837 * 59892 * 005010X222A1 ~ SE * 50 * 59892 ~ GE * 101 * 44761 ~ МЭА * 1 * 000044761 ~

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

На этот вопрос сложно ответить, не зная немного об обстоятельствах. Но если можно предположить, что структура данных такова, что это заданное количество точек данных, разделенных звездочками, и всегда одинаковое количество элементов, то для извлечения значения все, что вам нужно сделать, это разбить строку на звездочке и укажите соответствующее местоположение в массиве:

$data = "ISA*00* 00 ZZDIANER *ZZ*88888 *200401*1305*^*00501*000044761*1*P*:~GSHCDIANER*88888*20200401*130536*44761*X*005010X222A1~ST*837*59892*005010X222A1~SE*50*59892~GE*101*44761~IEA*1*000044761~"

$data.Split("*")[24]

Вышеприведенное вернет: 101

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

Если он может двигаться, то вы можете попробовать найти его с помощью сопоставления с шаблоном - ie, найти шаблон из *, трех чисел и другого * (но данные могут содержать другой сегмент, соответствующий этому шаблон), или если этому значению всегда предшествует другое идентифицируемое значение, вы можете найти его, а затем извлечь следующий сегмент, который будет значением, которое вы ищете.

Это действительно зависит от особенностей набор данных.

0 голосов
/ 02 апреля 2020
$test = 'ISA*00* 00 ZZDIANER *ZZ*88888 *200401*1305*^*00501*000044761*1*P*:~GSHCDIANER*88888*20200401*130536*44761*X*005010X222A1~ST*837*59892*005010X222A1~SE*50*59892~GE*101*44761~IEA*1*000044761~'

[regex]$r = 'GE\*.*\*44761'
$r.Matches($test).Value

Главное предостережение заключается в том, что если .Matches () возвращает более одного значения, вам нужно сжать регулярное выражение или перебрать совпадения, чтобы найти то, что вам действительно нужно, и вам нужно обрежьте излишки ... надеюсь, некоторые аспекты этих данных будут последовательными, или это будет довольно бесполезное начинание.

...