0

我需要使用 SPARQL/SPIN 将相当神秘的 FCC 排放指示符从复合字符串编码解析为我可以轻松推理的值。第一项任务是从指示符中获取“所需带宽”。以下是发射指示符的外观(可作为xsd:string值)和相应所需带宽的示例,手动解释了我的小老我:

  • 16K00F3E16.00 kHz 或 16,000.0 Hz
  • 3K00J3E 3.00 kHz 或 3,000.0 Hz
  • 1K10F1B1.10 kHz 或 1,100.0 Hz
  • 100H00A1A100.00 赫兹
  • 10M0G2D10.0 兆赫或 10,000,000.00 赫兹

最终我想得到以xsd:double赫兹为单位的值,但我目前停留在第一步,从整个发射指示符字符串中获取所需的带宽子字符串。

则表达式^[0-9]+[A-Z][0-9]+完成了第一步。例如,这个应用于发射指示符的正则表达式10M0G2D匹配10M0

实际上,我想要的所需带宽子字符串是可变长度的。它有一组数字、一个字母(见下文),然后是另一组数字。字母标记小数点并确定乘数:

  • H- 如果值小于 1000 Hz(乘数为 1.0)
  • K- 1 kHz 到小于 1000 kHz 的值(乘数为 1000.0)
  • M- 1 MHz 到小于 1000 MHz 的值(乘数为 1,000,000.0)
  • G- 1 GHz 或更高(乘数为 1,000,000,000.0)

后面是另一个超出所需带宽的字母。

所以,我的问题是,在 SPARQL/SPIN 中,如何从发射指示符字符串中解析出上述正则表达式中定义的所需带宽子字符串? 我想将该子字符串绑定到 SPARQL 变量,比如?encodedRequiredBandwidth. 我在 SPARQL/SPIN 中看到的正则表达式的唯一用途是xsd:boolean REGEX (simple literal text, simple literal pattern). 太好了,但我想要与regex 匹配的子字符串,而不是指示它在某处的标志。

关于如何获得所需带宽子字符串的任何想法?

关于如何解析其余部分以获得xsd:double我可以轻松推理的 Hz 值的任何想法(例如,进行幅度比较)?

谢谢。

4

2 回答 2

0

我现在也有丑陋的 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以Hz为单位,便于后续推理。现在开始处理排放指示符的其余部分。最终,此代码将在 SPIN 构造函数中结束,以便在实例化时进行自动翻译。

在此处输入图像描述

于 2016-12-22T15:53:53.403 回答
0

基于发射指示符的最后三个字符是稳定的、固定宽度的这一事实,我找到了一种解决此问题的方法。因此,我可以使用字符串函数的组合来解析出所需的带宽。以下简单查询说明了字符串函数的使用:

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以赫兹为单位的值。当/如果我发现它对其他人有用时,我会再次发布。

于 2016-12-21T20:50:23.390 回答