2017-12-12 23 views
2

많은 파일을 읽고 싶습니다. 파일 형식은 다음과 같습니다.다음 형식의 파일을 읽는 방법

많은 패키지 형식을 사용하여이를 읽었으며 아무 것도 작동하지 않는 것 같습니다. "-"로 시작하는 줄은 건너 뜁니다. 파일에는 약 102 개의 열이 있지만 몇 가지만 표시하고 있습니다. "-"로 시작하는 줄은 실제로 첫 번째, 세 번째 및 마지막 줄에 있습니다.

분명히 data.table

temp <- fread(input="LIKP_01012017_01312017.txt", 
       stringsAsFactors=FALSE, strip.white=TRUE, 
       sep="|",quote = "-", skip=1) 

를 사용하여 read.table

temp <- read.delim(file="LIKP_01012016_01312016.txt", header=TRUE, 
        stringsAsFactors=FALSE, 
        strip.white=TRUE, sep="|", skip = 1, comment.char = "-") 

를 사용하여 :

파일은 내가 다음을 시도

------------------------------------------------ 
|Delivery |Created by |Time |Created on|SDst| 
------------------------------------------------ 
|84181375 |BATCHJOBMGR|19:33:47|01/05/2017| | 
|84181376 |BATCHJOBMGR|19:33:47|01/05/2017| | 
------------------------------------------------ 

다음과 같은 형식으로되어 있습니다 나 do not doin g 바로 뭔가. 이 파일을 읽으면서 나를 도울 수 있습니까?

미리 감사드립니다.

사티

+1

파일'로 구분. 그리고 우리가 무시하는'------------------'줄. 하나의 사전 처리 단계를 수행하여 제거 할 수 있습니다. 1-3 행은 헤더이지만 2 행만 의미가 있습니다. – smci

답변

5

1) 유일하게 마이너스 기호가 점선에있는 샘플 데이터에서. 실제 데이터에도 해당되는 경우 다음이 작동해야합니다. text = Lines"LIKP_01012016_01312016.txt"으로 대체하십시오. comment.char = "-"은 빼기가있는 모든 줄에 해당 빼기가 있고 그 뒤의 모든 줄이 무시된다는 사실에 유의하십시오. 빼기 줄은 빈 줄로 바뀝니다.

read.table(text = Lines, header = TRUE, sep = "|", as.is = TRUE, 
     comment.char = "-", check.names = FALSE, strip.white = TRUE)[2:6] 

제공 :

Delivery Created by  Time Created on SDst 
1 84181375 BATCHJOBMGR 19:33:47 01/05/2017 NA 
2 84181376 BATCHJOBMGR 19:33:47 01/05/2017 NA 

2 당신이해야합니까 마이너스 데이터의 징후는 다음 단지 (첫 번째 줄을 건너 fill = TRUE를 사용하여 첫 번째와 마지막 행을 제거 할 경우 어떤 남아있는 사람은 모든 마이너스 기호 포함).

DF <- read.table(text = Lines, header = TRUE, sep = "|", as.is = TRUE, 
     skip = 1, fill = TRUE, check.names = FALSE, strip.white = TRUE)[2:6] 
n <- nrow(DF) 
DF <- DF[-c(1, n), ] 

참고 : 위의 코드의 입력은 다음과 같습니다

Lines <- "------------------------------------------------ 
|Delivery |Created by |Time |Created on|SDst| 
------------------------------------------------ 
|84181375 |BATCHJOBMGR|19:33:47|01/05/2017| | 
|84181376 |BATCHJOBMGR|19:33:47|01/05/2017| | 
------------------------------------------------" 
+0

어쩌면'comment.char' 트릭을 설명하고 왜이 날을 정말로 여기에 저장하는지 +1합니다. –

+0

안녕하세요 Mr. Grothendieck : 귀하의 제안에 감사드립니다. 내 파일은 90 MB가 넘고 그 중 약 25 개 정도입니다. 그래서, 내가 당신의 제안을 어떻게 따라갈 수 있을지 궁금합니다. 감사합니다. Satish –

+0

가장 쉬운 방법은 시도하는 것입니다. –

0

당신은 입력 파일의 각을 수정 system() 명령을 사용할 수 있습니다. 다음은 sed 유틸리티를 사용하는 Linux입니다. -으로 시작하는 모든 줄이 삭제됩니다 (sed '/^-/d'). 또한 모든 앞뒤 파이프 (|) 문자도 제거됩니다 (sed 's/^|//'sed 's/|$//'). 출력은 |로 구분 기호를 지정 평소 read.csv 명령을 읽을 수있는 임시 파일에 저장할 수 있습니다 :

> system("cat LIKP_01012016_01312016.txt | sed '/^-/d' | sed 's/^|//' | sed 's/|$//' > temp.csv") 
> dd = read.csv('temp.csv', na.strings='', sep="|") 
> dd 
    Delivery Created.by  Time Created.on SDst 
1 84181375 BATCHJOBMGR 19:33:47 01/05/2017 NA 
2 84181376 BATCHJOBMGR 19:33:47 01/05/2017 NA 

는 변환하고 모든 파일 하나 하나를 읽을 수있는 for 루프에 넣어 수 있습니다.

+0

OP는'sed'를 구울 수있는 완전한 프로그래밍 언어 _ 기능을 갖추고 있습니다. 이는 의미가 없습니다. – hrbrmstr

0

다른 접근 방식 : | CSV 또는 TSV (탭으로 구분)과 유사한 '라고 PSV (파이프로 구분 된 값),

con <- file('path/to/file.txt') 

d <- readLines(con) 

d <- read.delim(textConnection(d[!grepl("-", d)]), sep = '|')[2:6]