加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

13.4.1 读取值

发布时间:2020-12-16 00:17:21 所属栏目:百科 来源:网络整理
导读:13.4.1 读取值 我们要做的第一件事,是从 XML 中读取感兴趣的数据。我们要写一个函数,它的参数是 XDocument 对象的列表(用于数据集的每个页面),返回的序列中,每个元素包含了指标、 地区名,年份,当年的测量值。 清单 13.14 展示了 readValues 函数的形

13.4.1 读取值

我们要做的第一件事,是从 XML 中读取感兴趣的数据。我们要写一个函数,它的参数是 XDocument 对象的列表(用于数据集的每个页面),返回的序列中,每个元素包含了指标、 地区名,年份,当年的测量值。
清单 13.14 展示了 readValues 函数的形式,以及从 XML 节点中读数据的工具函数,表示一条记录。两个函数有一个名为 parse 的参数,这是一个函数,用来解析实际的字符串值,我们很快就会看到使用这个参数背后的原因。

清单13.14 从XML 数据中读数据 (F#)

let readSingleValue parse node = 
  let value = node |> xelem "value" |> xvalue 
  let country = node |> xelem "country" |> xvlue 
  let year = node |> xelem "date" |> xvalue |> int 
  if (value = "") then []               | [1] 返回的列表,可能
  else [ (year,country),parse(value) ]   | 有 01 个元素

let readValues parse data = seq { 
  for page in data do 
    let root = page |> xnested [ "data" ] 
    for node in root |> xelems "data" do   <-- 找到所有页面中的所有数据点元素
      yield! node |> readSingleValue parse }

我们首先写的工具函数,它的参数为格式化函数,和 XML 节点,包含一个数据元素。它从子节点和属性中读值,将年转换为整数。如果我们看看下载的数据,就会发现 value 元素有时是空的。我们可以这样处理,如果这个值为空,返回空列表;否则,返回包含一个元素的列表。注意,我们还可以使用 option 类型,而列表使第二个函数更优雅:不必要区分两种情况;只要使用 yield! 基本操作,地返回所有元素(既可以是空,也可以是一个),就行了。
第二个函数取的参数为 XDocument 对象的序列,值为整个输入的数据,它找到包含数据输入的所有 XML 元素,进行格式化,再返回序列。返回序列的元素类型是 (int * string) * ‘a。前面的元组包含年份和国家名,我们将把它作为键,以后用于搜索数据,这就是我们使用嵌套元组的原因;后面的元素是使用 parse 函数格式化的值,因此,其类型始终与函数返回类型相同。
和往常一样,我们可以立即测试这个函数。函数的关键输入是数据源,作为最后一个参数,因此,我们可以使用管道操作符。(用于测试目的)最简单解析的器,是给它什么字符串,就返回什么字符串,而不要处理它。下面的代码片断演示如何处理第一个数据集,其中包含 1990 年所有国家的总面积。我们使用恒等函数(identity function)id,解析输入,因此,值将被格式化成字符串:

> data.[0] |> readValues id;; 
val it : seq<(int * string) * string> = 
seq [ ((1990,"ABW"),"180"); ((1990,"ADO"),"470"); 
((1990,"AFG"),"652090"); ((1990,"AGO"),"1246700"); 
...]

可以发现,我们正在接近所需要的东西:现在可以直接从序列中读出数据了,剩下唯一的不足就是,值明显是数字,而我们却把它作为字符串看待。不过,这很容易解决。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读