2014-01-14 6 views
6

У меня есть текстовый файл, который содержит более 100 000 строк, которые я скачиваю еженедельно из SAP. он загружается как страницы, и каждая страница содержит один и тот же заголовок вместе с пунктирной линией. минимальный пример с двумя страницами, каждый из которых содержит только два элемента, приведен ниже.Импорт текстового файла в R

------------------------------------------------------------ 
|date    |Material   |Description   | 
|----------------------------------------------------------| 
|10/04/2013  |WM.5597394  |PNEUMATIC   | 
|11/07/2013  |GB.D040790  |RING    | 
------------------------------------------------------------ 

------------------------------------------------------------ 
|date    |Material   |Description   | 
|----------------------------------------------------------| 
|08/06/2013  |WM.4M01004A05  |TOUCHEUR   | 
|08/06/2013  |WM.4M010108-1  |LEVER    | 
------------------------------------------------------------ 

что бы я хотел сделать, это импортировать этот файл в R только с одним заголовком и без штрих-линий. Я пробовал:

read.table("myfile.txt", sep = "|", fill=TRUE) 

Большое спасибо

+1

Является примером содержание одного или двух файлов? –

+0

все строки содержатся в одном текстовом файле –

ответ

7

Другой readLines подход:

l <- readLines("myfile.txt") 

# remove unnecessary lines 
l <- grep("^\\|?-+\\|?$|^$", l, value = TRUE, invert = TRUE) 

# remove duplicated headers 
l2 <- c(l[1], l[-1][l[-1] != l[1]]) 

# split 
lsplit <- strsplit(l2, "\\s*\\|") 

# create data frame 
dat <- setNames(data.frame(do.call(rbind, lsplit[-1])[ , -1]), lsplit[[1]][-1]) 


     date  Material Description 
1 10/04/2013 WM.5597394 PNEUMATIC 
2 11/07/2013 GB.D040790  RING 
3 08/06/2013 WM.4M01004A05 TOUCHEUR 
4 08/06/2013 WM.4M010108-1  LEVER 
2

Вы можете использовать readLines и read.table (может быть не очень эффективно):

ll <- readLines(textConnection(txt)) 
dat <- read.table(text=ll[!grepl('--',ll)],sep='|',header=TRUE)[,-c(1,5)] 
dat[!grepl('date',dat$date),] 
      date   Material   Description 
1 10/04/2013   WM.5597394   PNEUMATIC   
2 11/07/2013   GB.D040790   RING     
4 08/06/2013   WM.4M01004A05  TOUCHEUR    
5 08/06/2013   WM.4M010108-1  LEVER 
+0

Как я могу прочитать файл «myfile.txt» –

+0

Фильтры «WM.4M010108-1» – redmode

+0

@redmode good catch. Я чиню это . – agstudy

3

Вы можете предварительно обработать файл как текст, а затем использовать read.table:

lines <- readLines("myfile.txt") 
lines <- sapply(lines, gsub, pattern="[-]{2,}|[|]", replacement="") 
lines <- c(lines[2], lines[lines!="" & lines!=lines[2]]) 

read.table(text=lines, header=T) 

дает

 date  Material Description 
1 10/04/2013 WM.5597394 PNEUMATIC 
2 11/07/2013 GB.D040790  RING 
3 08/06/2013 WM.4M01004A05 TOUCHEUR 
4 08/06/2013 WM.4M010108-1  LEVER 
-1

Возможно, вам придется написать пользовательскую функцию read.file(). Предлагаю начать с сканирования(), прочитать каждую строку как элемент вектора, а затем манипулировать каждую строку в соответствии с его содержанием

1

Как указывает остальные ответы, readLines это путь

sap <- readLines("myfile.txt") 
sap <- gsub("(^\\||\\|$|\\-{2,}|\\s+)", "", sap) 
sap <- sap[nchar(sap) > 0] 
ind <- grep("^date", sap) 
header <- sap[ind] 
header <- unique(unlist(strsplit(header, "\\|"))) 
sap <- sap[-ind] 

sap <- read.table(text = sap, sep = "|", 
        col.names = header, 
        stringsAsFactors = FALSE) 
str(sap) 
##   date  Material Description 
## 1 10/04/2013 WM.5597394 PNEUMATIC 
## 2 11/07/2013 GB.D040790  RING 
## 3 08/06/2013 WM.4M01004A05 TOUCHEUR 
## 4 08/06/2013 WM.4M0101081-1  LEVER 
+0

Удаляет «-» в столбце «Материал», последняя строка – redmode

+0

Хорошая уловка. Я отредактировал свой ответ – dickoa

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