将 Excel xml 文件读入 R

标签 r xml2

我正在尝试使用 xml2 来读取 Excel xml 文件,但是我遇到了困难,因为我拥有的文件与示例中 xml2 文档中使用的结构非常不同。我想从工作簿中读取其中一张工作表并用作数据框。

这个片段包括完整的结构,但只有一个单元格填充了一堆文本,而我想要阅读的有 50,000 行数据。

<?xml version='1.0'?>
<?mso-application progid='Excel.Sheet'?>
<s:Workbook xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:s="urn:schemas-microsoft-com:office:spreadsheet">
  <s:Worksheet s:Name="DBCitation">
    <s:Table>
      <s:Row>
        <s:Cell>
          <s:Data s:Type="String">The suggested citation for your download is below. See metadata folder and citationsyntax.xls for more explanation</s:Data>
        </s:Cell>
      </s:Row>
      <s:Row>
        <s:Cell>
          <s:Data s:Type="String" />
        </s:Cell>
      </s:Row>
      <s:Row>
        <s:Cell>
          <s:Data s:Type="String">Acosta-Martinez, Veronica ; Balkcom, Kipling; Caesar-TonThat, Thecan; Franzluebbers, Alan; Gollany, Hero; Jabro, Jalal; Jin, Virginia; Johnson, Jane; Liebig, Mark; Phillips, Rebecca; Sainju, Upendra; Sistani, Karamat; Skinner, R; Smith, Douglas; Stevens, William; Stott, Diane; Varvel, Gary; Venterea, Rodney; Acosta-Martinez, Veronica; Archer, David; Barbour, Nancy; Bucholtz, Dennis; Dell , Curtis ; Dillard, Anthony; Gross, Jason; Johnson, Holly; Knapp, Steven; Polumsky, Robert; Simmons, Jason; Upchurch, Dan; Waldron, Sarah; Weyers, Sharon; Wood, Charles; Zobeck, Ted; 2017; Daily Weather; Weather Station; Greenhouse Gas Flux Measurement; Supporting Research Measurement; All Cell Comments; All locations; ; 1929-2015; Database ver. og=gn08222 Fort Collins, CO: USDA-ARS REAP Database. File downloaded 1/30/2017 12:08:20 PM. PID:d4fa2478b1b144f58333e8a433e838b9</s:Data>
        </s:Cell>
      </s:Row>
    </s:Table>

最佳答案

您可以使用 gnumeric package的功能 read.gnumeric.sheet .

否则,使用 xml2您可以执行以下操作:

readExcelXML <- function(filename, sheet) {
  doc <- read_xml(filename)
  ns <- xml_ns(doc)
  rows <- xml_find_all(doc, paste0(".//s:Worksheet[@s:Name='", sheet, "']/s:Table/s:Row"), ns = ns)
  values <- lapply(rows, . %>% xml_find_all(".//s:Cell/s:Data", ns = ns) %>% xml_text %>% unlist)

  columnNames <- values[[1]]

  dat <- do.call(rbind.data.frame, c(values[-1], stringsAsFactors = FALSE))
  names(dat) <- columnNames

  dat
}

要从 XML 中获取正确的列类型,您需要添加:
  # assign types from file (automatically),
  # NB: hard-coded 2nd row of the data to take types from
  types <- rows[[2]] %>% xml_find_all(".//s:Cell/s:Data") %>% xml_attrs %>% unlist %>% setNames(nm = names(dat))
  funcs <- c("Number" = as.numeric, "String" = as.character, "DateTime" = . %>% as.POSIXct(format = "%Y-%m-%dT%H:%M:%S."))

  for (iCol in names(dat)) {
    dat[[iCol]] <- funcs[[types[iCol]]](dat[[iCol]])
  }

到函数。

关于将 Excel xml 文件读入 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41943939/

相关文章:

r - 如何在ggplot中改变binwidth?

r - R 中的网页抓取, "... does not exist in current working directory"错误

python /R : generate dataframe from XML when not all nodes contain all variables?

xml - R 中未定义的命名空间 xml2

r - 使用 xml2 解析 html 注释

r - 使用 dplyr 将函数应用于 data.frame 中的一行

r - 建立网络的相关矩阵

r - 使用操作按钮转到另一个选项卡

r - 如何替换 `ggplot2::geom_histogram(` y = ..密度中的点对点表示法。 .`)`?

r - 在 R 中将字符编码为 HTML,CRAN 方式