Разобрать необходимую пропускную способность из FCC-указателя в SPARQL/SPIN?
Мне нужно проанализировать довольно загадочный указатель эмиссии FCC, используя SPARQL/SPIN, из составной строковой кодировки в значения, которые я легко могу аргументировать. Первая задача - получить "требуемую пропускную способность" из обозначения. Вот примеры того, как выглядят обозначения выбросов (доступно как xsd:string
значения) и соответствующие требуемые полосы пропускания, вручную интерпретировал мой маленький старый я:
16K00F3E
16,00 кГц или 16 000,0 Гц3K00J3E
3,00 кГц или 3000,0 Гц1K10F1B
1,10 кГц или 1100,0 Гц100H00A1A
100,00 Гц10M0G2D
10,0 МГц или 10 000 000,00 Гц
В конечном итоге я хочу добраться до xsd:double
значения в Гц, но в настоящее время я застрял на первом шаге, получая подстроку необходимой полосы пропускания из всей строки указателя излучения.
Регулярное выражение^[0-9]+[A-Z][0-9]+
делает трюк для этого первого шага. Например, это регулярное выражение применяется к указателю выбросов 10M0G2D
Матчи 10M0
,
Требуемая подстрока полосы пропускания, которую я хочу, на практике, переменной длины. У него есть набор цифр, буква (см. Ниже), а затем еще один набор цифр. Буква отмечает десятичную точку и определяет множитель:
H
- Если значение меньше 1000 Гц (множитель равен 1,0)K
- от 1 кГц до значений менее 1000 кГц (множитель 1000,0)M
- 1 МГц до значений менее 1000 МГц (множитель 1 000 000,0)G
- 1 ГГц или выше (множитель 1 000 000 000,0)
Затем следует еще одна буква, которая выходит за пределы необходимой пропускной способности.
Итак, мой вопрос, в SPARQL/SPIN, как мне получить подстроку требуемой полосы пропускания, как определено в приведенном выше регулярном выражении, проанализированную из строки указателя излучения? Я хочу связать эту подстроку с переменной SPARQL, скажем, ?encodedRequiredBandwidth
, Единственное использование регулярного выражения, которое я вижу в SPARQL/SPIN, это xsd:boolean REGEX (simple literal text, simple literal pattern)
, Это здорово, но я хочу, чтобы подстрока соответствовала регулярному выражению, а не флаг, указывающий, что он где-то там.
Любые идеи о том, как получить мою необходимую подстроку пропускной способности?
Любые идеи о том, как до конца разбора добраться до xsd:double
Значение Гц, которое я могу легко переосмыслить (например, сравнение величин)?
Благодарю.
2 ответа
Я нашел способ обойти это, основываясь на том факте, что последние три символа указателя излучения стабильны, имеют фиксированную ширину. Таким образом, я могу использовать комбинацию строковых функций для анализа необходимой пропускной способности. Следующий простой запрос иллюстрирует использование строковых функций:
SELECT DISTINCT *
WHERE
{
BIND("100H00F1B"^^xsd:string AS ?emissionDesignator) .
BIND(strlen(?emissionDesignator) AS ?edLength) .
BIND(substr(?emissionDesignator, ?edLength - 2, 3) AS ?useCodes) .
BIND(strbefore(?emissionDesignator, ?useCodes) AS ?encodedBandwidth) .
}
Так что теперь моя закодированная подстрока полосы пропускания заканчивается int ?encodedBandwidth
,
Шаг первый, но мой ответ зависит от особенностей формата, фиксированной ширины последних 3 символов строки. Теперь мне нужно выяснить, как разобрать частоту в xsd:double
значение в Гц. Я напишу снова, когда / если я выясню это, если это будет полезно для кого-то еще.
Теперь у меня также есть уродливый код SPARQL, чтобы завершить преобразование пропускной способности в xsd:double
, Это основано на предположении, что указатель частоты встречается в первых 6 символах кодированной полосы пропускания. Стандарт ограничивает все поле пропускной способности 4 символами, включая обозначение. Тем не менее, я видел примеры, расширенные до 6 символов (например, 100H00
показанный выше, который также может быть соответствующим образом закодирован как 100H
)
Вот автономный пример кода SPARQL:
SELECT DISTINCT *
WHERE
{
BIND("5M75C3F"^^xsd:string AS ?emissionDesignator) .
BIND(strlen(?emissionDesignator) AS ?edLength) .
BIND(substr(?emissionDesignator, ?edLength - 2, 3) AS ?useCodes) .
BIND(strbefore(?emissionDesignator, ?useCodes) AS ?encodedBandwidth) .
# case of indicator in character position 1
{
BIND(substr(?encodedBandwidth, 1, 1) AS ?indicator) .
FILTER ((?indicator = "H") || (?indicator = "K") || (?indicator = "M") || (?indicator = "G")) .
}
UNION
# case of indicator in character position 2
{
BIND(substr(?encodedBandwidth, 2, 1) AS ?indicator) .
FILTER ((?indicator = "H") || (?indicator = "K") || (?indicator = "M") || (?indicator = "G")) .
}
UNION
# case of indicator in character position 3
{
BIND(substr(?encodedBandwidth, 3, 1) AS ?indicator) .
FILTER ((?indicator = "H") || (?indicator = "K") || (?indicator = "M") || (?indicator = "G")) .
}
UNION
# case of indicator in character position 4
{
BIND(substr(?encodedBandwidth, 4, 1) AS ?indicator) .
FILTER ((?indicator = "H") || (?indicator = "K") || (?indicator = "M") || (?indicator = "G")) .
}
UNION
# case of indicator in character position 5
{
BIND(substr(?encodedBandwidth, 5, 1) AS ?indicator) .
FILTER ((?indicator = "H") || (?indicator = "K") || (?indicator = "M") || (?indicator = "G")) .
}
UNION
# case of indicator in character position 6
{
BIND(substr(?encodedBandwidth, 6, 1) AS ?indicator) .
FILTER ((?indicator = "H") || (?indicator = "K") || (?indicator = "M") || (?indicator = "G")) .
}
VALUES (?freqIndicator ?multiplier) {
("H"^^xsd:string 1.0e0)
("K"^^xsd:string 1.0e3)
("M"^^xsd:string 1.0e6)
("G"^^xsd:string 1.0e9)
} .
FILTER (?indicator = ?freqIndicator) .
BIND (xsd:double(replace(?encodedBandwidth, ?freqIndicator, ".")) AS ?bandwidthDecimalPart) .
BIND ((?bandwidthDecimalPart * ?multiplier) AS ?bandwidthDouble ) .
}
Выше приведен результат, показанный ниже... с удвоенным значением полосы пропускания в ?bandwidthDouble
как Гц, что делает последующее рассуждение удобным. Теперь перейдем к обработке остальной части обозначения выбросов. В конечном счете, этот код будет в конечном итоге в конструкторах SPIN для автоматического перевода при создании экземпляра.