Как прочитать один файл .csv, который состоит из нескольких закомментированных кадров данных разной длины в виде списка? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь прочитать CSV-файл со следующей структурой:

my example

Можно ли прочитать и сохранить его как один список, где каждая запись называется Таблица A - Ежемесячно, Таблица B - Ежемесячно, Таблица C - Ежемесячно и т. Д.? Также каждая запись списка должна быть фреймом данных с заголовком «col1, col2, col3».

Я знаю, как пропустить текст в начале, но как мне избавиться от «Авторское право» в конце?

Я бы очень признателен за любые предложения по решению моей проблемы. Заранее спасибо!

1 Ответ

0 голосов
/ 11 января 2019

Предположим:

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

Считайте строки в L (в действительности замените аргумент именем файла) и извлеките имя таблицы, строки заголовка и содержимого и удалите все начальные запятые, дающие goodLines. Определите позиции имен таблиц iNames в них, а затем сами получите Names. Затем разбейте goodLines, за исключением имен таблиц, на список символьных векторов s и прочитайте каждый при правильной настройке имен компонентов.

# L <- readLines("myfile.dat")
L <- readLines(textConnection(Lines))
goodLines <- sub("^,", "", grep("--|,", L, value = TRUE)) 
iNames <- grepl("--", goodLines)
Names <- sub(" --.*", "", goodLines[iNames])
s <- split(goodLines[!iNames], cumsum(iNames)[!iNames])
setNames(lapply(s, function(x) read.csv(text = x)), Names)

с указанием следующего списка фреймов данных:

$`Table A`
  a b c
1 1 2 3
2 4 5 6

$`Table B`
  a b c
1 1 2 3
2 4 5 6

Примечание

Lines <- "
junk
junk

Table A -- Monthly
,a,b,c
1,2,3
4,5,6

Table B -- Monthly
,a,b,c
1,2,3
4,5,6

junk
junk"
...