Преобразование csv в стандартизированный формат xml с помощью R

Я пытаюсь взять биологические данные, сохраненные в формате .csv, и преобразовать их в определенный формат xml, установленный стандартами Darwin Core (расширение Dublin Core). Данные располагаются в строках записей наблюдений с заголовками в первой строке. Мне нужно переупаковать данные со стандартными тегами XML Darwin Core, используя базовое дерево/схему XML. Цель состоит в том, чтобы стандартизировать данные и сделать их легкодоступными для загрузки в любую программу базы данных.

Я биолог, поэтому я новичок в компьютерном программировании и программировании. Я хотел бы написать что-то в R или Excel, которое может автоматически выполнять этот шаг переупаковки, чтобы мне не приходилось вручную повторно вводить тысячи записей.

Я попытался использовать инструменты разработчика в excel 365, чтобы сохранить .csv в виде файла .xml, но похоже, что мне сначала придется разработать дерево или схему xml в программе текстового редактора. Кроме того, похоже, что надстройки xml, которые я бы использовал, больше не доступны. Я скачал бесплатный текстовый редактор Brackets build 1.14, чтобы написать простой xml. У меня также есть RStudio версии 1.1.419 с пакетом XML, загруженным для потенциального написания скрипта с R версии 3.4.3. Я прочитал все термины Darwin Core, базовый синтаксис и правила 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>]

person SarahBingo    schedule 11.05.2019    source источник


Ответы (1)


Это можно сделать несколькими способами. Здесь я выбираю решение stringi, потому что легко прочитать, что представляют собой входные данные.

Приведенный ниже код импортирует данные, записывает первую часть XML, затем записывает SimpleDarwinRecords для каждой строки и, наконец, последнюю часть файла. unlink нужно очистить, прежде чем что-либо будет добавлено в файл. Если отступ имеет значение (очевидно, это не так), вам может потребоваться немного изменить шаблон.

Это также можно сделать с помощью шаблона 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>]
person Roman Luštrik    schedule 11.05.2019