Как прочитать несколько таблиц, разделенных тегами в одном и том же CSV-файле, в R-studio? - PullRequest
0 голосов
/ 18 января 2019

У меня есть CSV-файл в следующем формате, и я хочу прочитать его в R studio. Проблема, с которой я сталкиваюсь, состоит в том, что в одном и том же файле есть несколько табличных данных, разделенных тегами, заключенными в угловые скобки, такие как <header>,<member details> etc.

Я хочу прочитать каждую из этих таблиц под тегами <header>,<member details> etc. в отдельные объекты в R. Как я могу это сделать?

Обратите внимание, что есть два тега <member details>, и под каждым тегом <member details> отображается <total interest>, показывающий сумму агрегации <member details>

Данные

<header>
id, cust_name
28, Mr.X

<member details>
Account_No,date,balance,interest
12345,23/12/2018,200000,12.0
12345,25/12/2018,300000,13.0

<total interest>
credit, settlement_acc
25,98765

<member details>
Account_No,date,balance,interest
6789,23/12/2018,200000,19.0
6789,25/12/2018,300000,12.0

<total interest>
credit, settlement_acc
31,98765

1 Ответ

0 голосов
/ 18 января 2019
library(stringr)
library(data.table)

txt <- "
<header>
id, cust_name
28, Mr.X

<member details>
Account_No,date,balance,interest
12345,23/12/2018,200000,12.0
12345,25/12/2018,300000,13.0

<total interest>
credit, settlement_acc
25,98765

<member details>
Account_No,date,balance,interest
6789,23/12/2018,200000,19.0
6789,25/12/2018,300000,12.0

<total interest>
credit, settlement_acc
31,98765
"
fl <- tempfile()
cat(txt, file = fl)
data <- readLines(fl)
idx <- str_detect(data, '^\\s?$')
idx <- which(idx)
data <- data[ -idx ]
idx <- str_detect(data, '<.*>')
idx <- which(idx)
cn <- data[ idx + 1 ]
cn <- lapply(cn, str_split, ',')
cn <- lapply(cn, unlist)
cn <- lapply(cn, str_trim)
mydata <- idx + 2
mydata <- paste0(mydata, ':', c(idx[ -1 ] - 1, length(data)))
mydata <- lapply(mydata, function(x) data[ eval(parse(text = x)) ])
mydata <- lapply(mydata, str_split, ',')
mydata <- lapply(mydata, function(x) rbindlist(lapply(lapply(x, t), data.frame)))
lapply(1:length(mydata), function(i) {
    colnames(mydata[[ i ]]) <<- cn[[ i ]]
})
names(mydata) <- str_replace_all(data[ idx ], '[<>]', '')
print(mydata)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...