2011-12-21 5 views
3

У меня есть текстовый файл, который выглядит следующим образом:R Импорт данных из структурированного файла

 
year 1: ... 
year 2: ... 
.... 
.... 
[data] 
1,2,3,4 
3,4,5 
3,5,6,7,8,9 
... 

поэтому в основном он будет иметь n строки до [data] линии, и то, что ниже линии данных, что я хочу для чтения:

Я знаю, что могу удалить заголовки вручную, но было бы идеально, если бы я мог обнаружить R ключевое слово [data] и прочитать, что после этого.

Любые предложения?

Кроме того, как вы можете видеть, у меня есть разные числа переменных для каждой строки для фактических данных.
Есть ли способ прочитать его так, что разделение строк сохраняется?

ответ

4

Один из способов сделать это:

csvAfter <- function(file, marker="[data]", blank.lines.skip=FALSE) { 
    lines <- readLines(file) 
    i <- match(marker, lines) 
    if (is.na(i)) { 
    warning("Didn\'t find ", marker) 
    return(NULL) 
    } 
    f <- textConnection(paste(lines[-(1:i)], collapse="\n")) 
    on.exit(close(f), add=TRUE) 
    return(read.csv(f, header=FALSE, fill=TRUE, 
        blank.lines.skip=blank.lines.skip)) 
} 

Пример:

r <- "year 1: ... 
year 2: ... 
.... 
.... 
[data] 
1,2,3,4 
3,4,5 
3,5,6,7,8,9" 
print(csvAfter(textConnection(r))) 
+0

О, это потрясающе! Спасибо!! – user1110653

+0

Что делать, если некоторые строки пустые, и я хотел бы прочитать их как NA? – user1110653

+0

Это соответствует blank.lines.skip = FALSE для read.csv. Я изменил код выше, чтобы обработать этот случай по вашему желанию. –

0

выше ответ велик для автоматического обнаружения флага «[данных]», который позволит адаптировать его для входных файлов с разными номерами строк перед данными.

Если вам просто нужно сделать это один раз, вы можете включить «пропустить =» в вызове read.csv или read.table

например, read.table (файл, пропустите = п)

Смежные вопросы