有许多方法可以将数据帧转换为Markdown表。 但是在给定Markdown表的情况下,如何转换回数据帧
给出一个表格表格:
Table Header | Second Header
------------- | -------------
Table Cell | Cell 2
Cell 3 | Cell 4
或者更糟糕的是,以一种形式
Table Header | Second Header \n------------- | ------------- \nTable Cell | Cell 2 \nCell 3 | Cell 4
如何将其纳入数据框?
答案 0 :(得分:4)
我打了个问题,但后来意识到答案很简单。
read_delim
包中的函数readr
可以轻松处理:
library(readr)
library(dplyr)
object <- 'Table Header | Second Header \n------------- | ------------- \nTable Cell | Cell 2 \nCell 3 | Cell 4'
data_frame <- read_delim(object, delim = '|')
# A tibble: 3 x 2
`Table Header ` ` Second Header `
<chr> <chr>
1 ------------- -------------
2 Table Cell Cell 2
3 Cell 3 Cell 4
只需要过滤掉'-------'行。等瞧。
希望这个解决方案有助于某人。
答案 1 :(得分:2)
我写了几个函数来处理这些问题,但我怀疑这对于编写SO答案的人来说比其他人更成问题。无论:
# base R version
read.markdown <- function(file, stringsAsFactors = FALSE, strip.white = TRUE, ...){
if (length(file) > 1) {
lines <- file
} else if (grepl('\n', file)) {
con <- textConnection(file)
lines <- readLines(con)
close(con)
} else {
lines <- readLines(file)
}
lines <- lines[!grepl('^[[:blank:]+-=:_|]*$', lines)]
lines <- gsub('(^\\s*?\\|)|(\\|\\s*?$)', '', lines)
read.delim(text = paste(lines, collapse = '\n'), sep = '|',
stringsAsFactors = stringsAsFactors, strip.white = strip.white, ...)
}
# readr version
read_markdown <- function(file, trim_ws = TRUE, ...){
if (length(file) > 1) {
lines <- file
} else {
lines <- readr::read_lines(file)
}
lines <- lines[!grepl('^[[:blank:]+-=:_|]*$', lines)]
lines <- gsub('(^\\s*?\\|)|(\\|\\s*?$)', '', lines)
readr::read_delim(paste(lines, collapse = '\n'), delim = '|',
trim_ws = trim_ws, ...)
}
他们可以处理许多降价表的变体,并且对单个字符串感到满意:
read.markdown('Table Header | Second Header \n------------- | ------------- \nTable Cell | Cell 2 \nCell 3 | Cell 4 ')
#> Table.Header Second.Header
#> 1 Table Cell Cell 2
#> 2 Cell 3 Cell 4
一个行向量(就像一个来自clipr::read_clip
):
clipr::write_clip(
' | | mpg | cyl | disp | hp |
|:-------------------:|:-----:|:-----:|:------:|:----:|
| Mazda RX4 | 21 | 6 | 160 | 110 |
| Mazda RX4 Wag | 21 | 6 | 160 | 110 |
| Datsun 710 | 22.8 | 4 | 108 | 93 |'
)
read.markdown(clipr::read_clip())
#> X mpg cyl disp hp
#> 1 Mazda RX4 21.0 6 160 110
#> 2 Mazda RX4 Wag 21.0 6 160 110
#> 3 Datsun 710 22.8 4 108 93
或文件名(尽管该文件只能包含表和空格):
tmp <- tempfile()
writeLines(
' +---------------------+-------+-------+--------+------+--------+
| | mpg | cyl | disp | hp | drat |
+=====================+=======+=======+========+======+========+
| Mazda RX4 | 21 | 6 | 160 | 110 | 3.9 |
+---------------------+-------+-------+--------+------+--------+
| Mazda RX4 Wag | 21 | 6 | 160 | 110 | 3.9 |
+---------------------+-------+-------+--------+------+--------+
| Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 |
+---------------------+-------+-------+--------+------+--------+',
tmp
)
read_markdown(tmp)
#> Warning: Missing column names filled in: 'X1' [1]
#> # A tibble: 3 x 6
#> X1 mpg cyl disp hp drat
#> <chr> <dbl> <int> <int> <int> <dbl>
#> 1 Mazda RX4 21.0 6 160 110 3.90
#> 2 Mazda RX4 Wag 21.0 6 160 110 3.90
#> 3 Datsun 710 22.8 4 108 93 3.85
编辑:如果有人发现这些功能有用,我已将这些功能放在a package中。