首页 > 解决方案 > 如何计算 XML 文件中的数字(字符串格式)

问题描述

我有以下 XML 数据,我想做一个计算

<data>
    <numbers>
        <value>1 - 3</value>
    </numbers>
    <numbers>
        <value>5 - 10</value>
    </numbers>
    <numbers>
        <value>2.4 +/- 3.2</value>
    </numbers>
    <numbers>
        <value>10</value>
    </numbers>
    <numbers>...</numbers>
    <numbers>...</numbers>
    <numbers>...</numbers>
    ...
</data>

如上所述,有两个问题,一个是字符串格式的值,另一个问题是有不同类型的值,有些使用 +/-,有些使用范围。

从逻辑上讲,我知道该怎么做,只需使用 if-else 来检测不同的格式,例如:

if (tag "value" contains "+/-"):
    Separate the string by "+/-", convert the number from string to number
    use first number + last number to find the biggest number
    use first number - last number to find the smallest number

if (tag "value" contains "-"):
    Separate the string by "-", convert the number from string to number
    first number is smallest number, last number is biggest number

if (tag "value" contains a "whole number"):
    Just convert it into number format and done.

这就是编程的样子,我是一名学生,我目前正在自学 R 语言,我知道如何去做,但我不知道如何编码,也许有一些库或函数去做吧。

如果你知道怎么做,请帮助我,非常感谢你,我真的很感谢你的帮助:)

标签: rconverters

解决方案


h <- "<data>
  <numbers>
  <value>1 - 3</value>
  </numbers>
  <numbers>
  <value>5 - 10</value>
  </numbers>
  <numbers>
  <value>2.4 +/- 3.2</value>
  </numbers>
  <numbers>
  <value>10</value>
  </numbers>
</data>
"
h <- XML::xmlParse(h)
v <- XML::xpathSApply(h, "//value", XML::xmlValue)
lapply(v, function(x) {
  if (stringr::str_detect(x,"\\+/-")) {
    num1 <- stringr::str_extract(x, ".+(?=\\+/-)")
    num2 <- stringr::str_extract(x, "(?<=\\+/-).+")

    list(
      "+" = sum(as.numeric(c(num1, num2))),
      "-" = diff(as.numeric(c(num1, num2)))
    )
  } else {
    eval(parse(text=v[1]))
  }
})

推荐阅读