2016-07-31 3 views
0

여러 개의 고정 폭 형식 txt 파일을 R에 읽고 싶지만 먼저 압축을 풀어야합니다.read_fwf가 파일을 압축 해제하는 동안 작동하지 않습니다.

매우 큰 파일이므로 매우 빠르기 때문에 readr 패키지의 read_fwf을 사용하고 싶습니다.

내가 할 경우 :

read.table(unz(zipfileName, fileName))R로 읽기 폭을 specfiying하지 않고 : 내가 할 때

read_fwf(unz(zipfileName, fileName), fwf_widths(colWidths, col_names = colNames))

나는 그러나이 오류 Error in isOpen(con) : invalid connection

를 얻을. 왜 이것이 read_fwf과 함께 작동하지 않는지에 대한 의견이 있으십니까?

재현 가능한 예를 만드는 데 문제가 있습니다.

df <- data.frame(
    rnorm(100), 
    rnorm(100) 
) 

write.table(df, "data.txt", row.names=F, col.names = F) 
zip(zipfile = "data.zip", files = "data.txt") 
colWidths <- rep(2, 100) 
colNames <- c("thing1","thing2") 
zipfileName <- "data.zip" 
fileName <- "data.csv" 
+0

하나의 열만 표시됩니다. 또한 'zipfileName' –

+0

@ 42- 수정 사항을 예제와 일치하도록 수정했다고 생각하지 않습니다. – Warner

+0

'? unz'를 더주의 깊게 읽으십시오. 특히 : '설명'은 필요한 경우 '.zip'확장명을 가진 zip 파일의 전체 경로입니다. " –

답변

1

가 나는 또한 문제가 그것에 unz -ed 파일을 전달하지만 난 압축 파일이 자동적으로 처리하기로 약속되어 있음을 볼 수있는 ?read_fwf 페이지를 읽을 때 zip 파일을 읽을 수 read_fwf를 받고 있었다 : 여기에 내가 가진 것입니다. 당신은 열이 모두 일정한 위치를 가지고 있기 때문에, 예를 들어 유효한 FWF 된 파일을 만들지 않았다하지만 출력에 분명하다 :

read_fwf(file="~/data.zip", fwf_widths(widths=rep(16,2) ,col_names = colNames)) 
Warning: 1 parsing failure. 
row col expected actual 
    3 thing2 16 chars  14 
# A tibble: 100 x 2 
      thing1    thing2 
       <chr>    <chr> 
1 1.37170820802141 -0.58354018425322 
2 0.03608988699566 7 -0.402708262870141 
3 1.02963272114 -1  .0644333112294 
4 0.73546166509663 8 0.607941664550652 
5 -1.5285547658079 -0.319983522035755 
6 -1.4673290956901 0.523579231857175 
7 0.24946312418273 9 -0.574046655188405 
8 0.58126541455159 5 -0.406516495600345 
9 1.5074477698981 -0.496512994239183 
10 -2.2999905645658 8 -0.662667854341041 
# ... with 90 more rows 

당신이지고 있었다 오류가 unz 기능 때문에 출신 zip 확장 파일에 대한 전체 경로가 "설명"인수로 암시 적으로 작동하는 디렉토리 위치를 허용하지 않을 것입니다. 두 번째 인수는 압축 파일의 압축 파일 이름입니다. 나는 그것이 연결을 반환하지만, read_fwf가 처리 할 수있는 타입이 아니라고 생각한다. 손으로 구문 분석하고 나는 우리 모두가 가진 오류가 read_connection 코드의이 부분에서 것을 참조 :

> readr:::read_connection 
function (con) 
{ 
    stopifnot(is.connection(con)) 
    if (!isOpen(con)) { 
     open(con, "rb") 
     on.exit(close(con), add = TRUE) 
    } 
    read_connection_(con) 
} 
<environment: namespace:readr> 

당신은 유효한 "설명"인수를 unz주지 않았다, 우리는에 노력을 한 경우에도 open(con, "rb")과 함께 열면 다양한 파일 처리 기능의 인수가 표준화되지 않아 실패합니다.

+0

다행히도 제 경우 각 zip 파일에는 내가 읽고 싶은 하나의 파일 만 들어 있습니다. 나는'read_fwf'가 여러 파일들로 zip 파일을 다루는 방법에 대해 궁금합니다. . – Warner

+1

두 개의 항목이있는 zip 파일을 제공하면 첫 번째 파일이 선택됩니다. (나는 zip 파일을 전체 디렉토리로 확장 한 다음 두 번째 또는 그 이후의 파일을 원한다면 그 파일을 사용했다.) –

+0

이것을 확인해 주셔서 감사합니다. 이것은 알아두면 좋으며'read_fwf'가 어떻게 zip 파일을 처리해야하는지에 대한 몇 가지 함의가 있다고 생각합니다. – Warner

관련 문제