У меня возникли проблемы с извлечением определенной строки с помощью VBS

#vbscript #split

#vbscript #разделение

Вопрос:

У меня есть фрагмент кода, который успешно извлекает определенную строку с помощью Split. Я хочу получить другую строку, и я не получаю правильный вывод.

Это данные, из которых я пытаюсь извлечь строку.

N126 (Всего: 476,00 дюймов, 119,0 sq.in , 1 cu.in , 0,003 фунта)

В настоящее время я могу извлечь 1 между sq.in , и cu.in , используя эту строку кода.

 volume = Split(Split(srtContents, "sq.in,")(1), "cu.in,")(0)
  

Вместо 1 я хотел бы получить 119.0, но я всегда получаю 119.0 sq.

Я знаю, почему я это получаю, я просто не знаю, как это исправить. Это мой код:

 area = Split(Split(srtContents, "in,")(1), "sq.in,")(0)
  

Комментарии:

1. Что именно вы хотите сделать с этими данными. Я бы предположил, что разделение на пробел и проверка на число дадут вам числа. Строка, находящаяся на 1 месте над каждым числом, будет его меткой.

2. Split(srtContents,"in,")(1) не содержит "sq.in," строку… Вместо этого используйте, например, Split(srtContents," in,")(1) (обратите внимание на пробел).

3. Я пытаюсь вычислить общий вес композитного материала, используемого для изготовления определенной детали. Я пытаюсь использовать квадратные дюймы для вычисления объема x плотности. Их может быть до 150

4. отделите файлы данных управления машиной, откуда взята эта строка, для создания определенной части. У меня есть скрипт, который предположительно открывает каждый файл, вычисляет вес, затем суммирует их все, чтобы получить общий вес. Спасибо за вашу помощь.

Ответ №1:

Одним из способов сделать это было бы разбиение входной строки на запятые, за которыми следует пробел:

 s = "N126(Total: 476.00 in, 119.0 sq.in, 1 cu.in, .003 lb)"
a1 = Split(s, ", ")
  

затем разделите интересующее вас поле пробелами:

 a2 = Split(a1(1), " ")
v = a2(0)
  

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

 s = "N126(Total: 476.00 in, 119.0 sq.in, 1 cu.in, .003 lb)"

Set re = New RegExp
re.Pattern = "(d .d ) in, (d .d ) sq.in, (d ) cu.in, (.d ) lb"

For Each m In re.Execute(s)
    total  = m.Submatches(0)
    area   = m.Submatches(1)
    volume = m.Submatches(2)
    weight = m.Submatches(3)
Next

WScript.Echo area
  

Или, если вы хотите использовать более общий подход:

 s = "N126(Total: 476.00 in, 119.0 sq.in, 1 cu.in, .003 lb)"

Set re = New RegExp
re.Pattern = " ((?:d*.)?d ) "
re.Global  = True

For Each m In re.Execute(s)
    WScript.Echo m.Submatches(0)
Next
  

Помните, что в любом случае извлеченные значения по-прежнему являются строками. Если они вам нужны в виде числовых значений, вам нужно преобразовать их после извлечения, например weight CDbl(m.Submatches(3)) .