使用R

时间:2019-05-11 21:11:25

标签: r excel xml csv dublin-core

我正在尝试获取以.csv格式保存的生物数据,并将其转换为由Darwin Core标准(Dublin Core的扩展名)设置的特定xml格式。数据设置在观察记录的行中,第一行具有标题。我需要使用基本的XML树/架构用Darwin Core标准XML标签重新打包数据。目的是使数据标准化并使其易于加载到任何类型的数据库程序中。

我是生物学家,所以我在计算机编程和代码方面还很陌生。我想用R或excel编写可以自动执行此重新打包步骤的内容,因此不必手动重新输入数千条记录。

我尝试使用excel 365中的开发人员工具将.csv另存为.xml文件,但是似乎我必须首先在文本编辑器程序中开发xml树或架构。另外,似乎我将使用的xml附加组件不再可用。我已经下载了名为“ Brackets”内部版本1.14的免费文本编辑器,以编写一些简单的xml。我还下载了RStudio版本1.1.419和XML包,可以使用R版本3.4.3编写脚本。我已经阅读了所有《达尔文核心条款》以及基本的XML语法和规则,但是我真的不知道从哪里开始。

这是简单.csv格式的数据示例:

type,institutionCode,collectionCode,catalogNumber,scientificName,individualCount,datasetID
PhysicalObject,ANSP,PH,123,"Cryptantha gypsophila Reveal & C.R. Broome",12,urn:lsid:tim.lsid.tdwg.org:collections:1
PhysicalObject,ANSP,PH,124,"Buxbaumia piperi",2,urn:lsid:tim.lsid.tdwg.org:collections:1

这是最终产品记录的样子:

    [<?xml version="1.0"?>
<dwr:SimpleDarwinRecordSet
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://rs.tdwg.org/dwc/xsd/simpledarwincore/  http://rs.tdwg.org/dwc/xsd/tdwg_dwc_simple.xsd"
    xmlns:dcterms="http://purl.org/dc/terms/"
    xmlns:dwc="http://rs.tdwg.org/dwc/terms/"
    xmlns:dwr="http://rs.tdwg.org/dwc/xsd/simpledarwincore/">
    <dwr:SimpleDarwinRecord>
        <dcterms:type>PhysicalObject</dcterms:type>
        <dwc:institutionCode>ANSP</dwc:institutionCode>
        <dwc:collectionCode>PH</dwc:collectionCode>
        <dwc:catalogNumber>123</dwc:catalogNumber>
        <dwc:scientificName>Cryptantha gypsophila reveal &amp; C.R. Boome</dwc:scientificName>
        <dwc:individualCount>12</dwc:individualCount>
        <dwc:datasetID>urn:lsid:tim.lsid.tdwg.org:collections:1</dwc:datasetID>
    </dwr:SimpleDarwinRecord>
    <dwr:SimpleDarwinRecord>
        <dcterms:type>PhysicalObject</dcterms:type>
        <dwc:institutionCode>ANSP</dwc:institutionCode>
        <dwc:collectionCode>PH</dwc:collectionCode>
        <dwc:catalogNumber>124</dwc:catalogNumber>
        <dwc:scientificName>Buxbaumia piperi</dwc:scientificName>
        <dwc:individualCount>2</dwc:individualCount>
        <dwc:datasetID>urn:lsid:tim.lsid.tdwg.org:collections:1</dwc:datasetID>
    </dwr:SimpleDarwinRecord>
</dwr:SimpleDarwinRecordSet>]

1 个答案:

答案 0 :(得分:0)

这可以通过多种方式来完成。在这里,我采用了stringi解决方案,因为它很容易读取输入内容。

下面的代码导入数据,写入XML的第一部分,然后为每一行写入SimpleDarwinRecord,最后写入文件的最后一部分。 unlink在将任何内容附加到文件之前需要清理。如果缩进很重要(apparently it doesn't),则可能需要对模板进行一些调整。

这也可以使用Jinja2模板和Python来完成。

library(stringr)

xy <- read.table(text = 'type,institutionCode,collectionCode,catalogNumber,scientificName,individualCount,datasetID
PhysicalObject,ANSP,PH,123,"Cryptantha gypsophila Reveal & C.R. Broome",12,urn:lsid:tim.lsid.tdwg.org:collections:1
PhysicalObject,ANSP,PH,124,"Buxbaumia piperi",2,urn:lsid:tim.lsid.tdwg.org:collections:1', header = TRUE,
                 sep = ",")

unlink("output.txt")
outfile <- file(description = "output.txt", open = "at")

writeLines('[<?xml version="1.0"?>
<dwr:SimpleDarwinRecordSet
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://rs.tdwg.org/dwc/xsd/simpledarwincore/  http://rs.tdwg.org/dwc/xsd/tdwg_dwc_simple.xsd"
    xmlns:dcterms="http://purl.org/dc/terms/"
    xmlns:dwc="http://rs.tdwg.org/dwc/terms/"
    xmlns:dwr="http://rs.tdwg.org/dwc/xsd/simpledarwincore/">', con = outfile)

writeLines(str_glue('<dwr:SimpleDarwinRecord>
        <dcterms:type>{xy$type}</dcterms:type>
        <dwc:institutionCode>{xy$institutionCode}</dwc:institutionCode>
        <dwc:collectionCode>{xy$collectionCode}</dwc:collectionCode>
        <dwc:catalogNumber>{xy$catalogNumber}</dwc:catalogNumber>
        <dwc:scientificName>{xy$scientificName}</dwc:scientificName>
        <dwc:individualCount>{xy$individualCount}</dwc:individualCount>
        <dwc:datasetID>{xy$datasetID}</dwc:datasetID>
      </dwr:SimpleDarwinRecord>'), con = outfile)

writeLines(
  '</dwr:SimpleDarwinRecordSet>]',
  con = outfile)

close(outfile)

这是结果:

[<?xml version="1.0"?>
<dwr:SimpleDarwinRecordSet
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://rs.tdwg.org/dwc/xsd/simpledarwincore/  http://rs.tdwg.org/dwc/xsd/tdwg_dwc_simple.xsd"
    xmlns:dcterms="http://purl.org/dc/terms/"
    xmlns:dwc="http://rs.tdwg.org/dwc/terms/"
    xmlns:dwr="http://rs.tdwg.org/dwc/xsd/simpledarwincore/">
<dwr:SimpleDarwinRecord>
  <dcterms:type>PhysicalObject</dcterms:type>
  <dwc:institutionCode>ANSP</dwc:institutionCode>
  <dwc:collectionCode>PH</dwc:collectionCode>
  <dwc:catalogNumber>123</dwc:catalogNumber>
  <dwc:scientificName>Cryptantha gypsophila Reveal & C.R. Broome</dwc:scientificName>
  <dwc:individualCount>12</dwc:individualCount>
  <dwc:datasetID>urn:lsid:tim.lsid.tdwg.org:collections:1</dwc:datasetID>
</dwr:SimpleDarwinRecord>
<dwr:SimpleDarwinRecord>
  <dcterms:type>PhysicalObject</dcterms:type>
  <dwc:institutionCode>ANSP</dwc:institutionCode>
  <dwc:collectionCode>PH</dwc:collectionCode>
  <dwc:catalogNumber>124</dwc:catalogNumber>
  <dwc:scientificName>Buxbaumia piperi</dwc:scientificName>
  <dwc:individualCount>2</dwc:individualCount>
  <dwc:datasetID>urn:lsid:tim.lsid.tdwg.org:collections:1</dwc:datasetID>
</dwr:SimpleDarwinRecord>
</dwr:SimpleDarwinRecordSet>]