2017-11-08 2 views
0

read.table을 사용하여 많은 텍스트 파일을 R로 읽으려고합니다. 대부분의 경우 열을 정의한 깨끗한 텍스트 파일이 있습니다. 당신은 텍스트 파일의 공백과 길이가 보고서에 따라 다릅니다 것을 알 수 있습니다R : 공백이 있고 다른 수의 열이있는 텍스트 파일을 읽으십시오.

ftp://ftp.cmegroup.com/delivery_reports/live_cattle_delivery/102317_livecattle.txt에서

내가 읽은 것을 시도하고 데이터가 제공됩니다. ftp://ftp.cmegroup.com/delivery_reports/live_cattle_delivery/102317_livecattle.txt ftp://ftp.cmegroup.com/delivery_reports/live_cattle_delivery/100917_livecattle.txt

내 목표는 이러한 텍스트 파일을 많이 읽고 데이터 세트로 결합하는 것입니다.

내가 그 중 하나를 읽을 수 있으면 컴파일이 문제가되어서는 안됩니다. 그러나 텍스트 파일의 형식으로 인해 여러 가지 문제가 발생합니다.

1) 겉면의 수는 보고서마다 다릅니다. 예를 들어 때로는 가져올 데이터가 3 행 (즉, 해당 데이터를 처리 한 3 회사)의 데이터가되며 때로는 10 행이 있습니다.

2) 공백이 인식되고 있습니다. 예를 들어, 회사 섹션에는 Deliveries (DEL) 및 Receipts (REC)에 대한 열이 있어야합니다. 나는 fomatting에이 글을 읽을 때 모두가 엉망이고 빈 값

3) 위의 문제에 대한 NA를 넣어하지 않습니다

df <- data.frame("FIRM_#" = c(407, 685, 800, 905), 
    "FIRM_NAME" = c("STRAITS FIN LLC", "R.J.O'BRIEN ASSOC", "ROSENTHAL COLLINS LL", "ADM INVESTOR SERVICE"), 
    "DEL" = c(1,1,15,1), "REC"= c(NA,18,NA,NA)) 

:처럼이 섹션에서 읽을 데이터가 보일 것입니다 텍스트 파일의 "YARDS"및 "FUTURE DELIVERIES SCHEDULED"섹션을 신청하십시오.

텍스트 파일의 섹션을 읽은 다음 적절하게 형식을 지정하려고했지만 회사 수가 날마다 바뀌므로 코드가 일반화되지 않습니다.

도움이된다면 크게 도움이 될 것입니다.

답변

1

여기에 데이터를 다운로드하기 위해 rvest을 통해 처음부터 시작하여 많은 서식이 포함되어 있습니다. 일반적인 생각은 열을 분리하는 데 사용될 수있는 고정 너비를 식별하는 것입니다.이 목적을 위해 SO로부터 약간의 도움을 받았습니다. link.

그러면 cat()tempfile()과 조합하여 read.fwf()을 사용할 수 있습니다. 첫 번째 시도에서 일부 서식 문제로 인해이 방법이 작동하지 않아 최종 테이블 형식을 얻기 위해 몇 가지 추가 행을 추가했습니다.

아마도 더 세련된 옵션과 바로 가기가 있지만 적어도 내 대답으로 시작해야합니다. 물론 필요한 데이터의 부분에 따라 선을 선택하고 표를 분할 할 때 너비를 식별해야합니다. 이 작업이 완료되면 모든 웹 사이트를 반복하여 데이터를 수집 할 수 있습니다. 이게 도움이되기를 바랍니다.

library(rvest) 
library(dplyr) 

page <- read_html("ftp://ftp.cmegroup.com/delivery_reports/live_cattle_delivery/102317_livecattle.txt") 

table <- page %>% 
    html_text("pre") %>% 
    #reformat by splitting on line breakes 
    { unlist(strsplit(., "\n")) } %>% 
    #select range based on strings in specific lines 
    "["(.,(grep("FIRM #", .):(grep("  DELIVERIES SCHEDULED", .)-1))) %>% 
    #exclude empty rows 
    "["(., !grepl("^\\s+$", .)) %>% 
    #fix width of table to the right 
    { substring(., 1, nchar(gsub("\\s+$", "" , .[1]))) } %>% 
    #strip white space on the left 
    { gsub("^\\s+", "", .) } 


headline <- unlist(strsplit(table[1], "\\s{2,}")) 

get_split_position <- function(substring, string) { 

    nchar(string)-nchar(gsub(paste0("(^.*)(?=", substring, ")"), "", string , perl=T)) 

} 

#exclude first element, no split before this element 
split_positions <- sapply(headline[-1], function(x) { 

    get_split_position(x, table[1]) 

}) 


#exclude headline from split 
table <- lapply(table[-1], function(x) { 

    substring(x, c(1, split_positions + 1), c(split_positions, nchar(x))) 

}) 

table <- do.call(rbind, table) 
colnames(table) <- headline 

#strip whitespace 
table <- gsub("\\s+", "", table) 

table <- as.data.frame(table, stringsAsFactors = FALSE) 
#assign NA values 
table[ table == "" ] <- NA 
#change column type 
table[ , c("FIRM #", "DEL", "REC")] <- apply(table[ , c("FIRM #", "DEL", "REC")], 2, as.numeric) 

table 
# FIRM #   FIRM NAME DEL REC 
# 1 407  STRAITSFINLLC 1 NA 
# 2 685 R.J.O'BRIENASSOC 1 18 
# 3 800 ROSENTHALCOLLINSLL 15 NA 
# 4 905 ADMINVESTORSERVICE 1 NA 
+0

답장을 보내 주셔서 감사합니다. 이것은 많은 도움이되었습니다. 모든 것은 원활하게 작동하여 마지막 섹션의 데이터를 가져올 수 있습니다. 숫자 0100은 보고서에서 보고서로 바뀌므로 텍스트 파일 전체에서 진전이 불가능합니다. 그래버 기능에 파일의 끝으로 가도록 지시하는 방법이 있습니까? 도움을 다시 한번 고맙다. – EDennnis

+0

문자 벡터의 마지막 줄, 즉 텍스트 줄을 얻으려면 단순히'vector [length (vector)]'를 사용하면된다. 제 생각에는 대안으로'꼬리 (벡터, 1)'이 효과가 있습니다. –

+0

아직 미해결 문제가있는 경우 정확하게 작동하지 않는 것을 지정하고 작동하지 않는 코드를 제공하십시오. 그러면 도움이 될 것입니다. (데이터 분석은 특정 작업이므로 구문 분석을 지정하는 것이 중요합니다. 가능한 정확하게 코드의 중요한 포인트). 그렇지 않으면 답을 생각해보십시오. –

관련 문제