Преобразование CSV в стандартизированный формат XML с использованием R - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь взять биологические данные, сохраненные в формате .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. Я ознакомился со всеми основными терминами Дарвина, базовым синтаксисом и правилами 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 голосов
/ 12 мая 2019

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

Приведенный ниже код импортирует данные, записывает первую часть XML, затем записывает SimpleDarwinRecord s для каждой строки и, наконец,последняя часть файла.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>]
...