2014-04-30 3 views
0

EDIT 2014-05-01 : 나는 fromJSON을 먼저 시도했지만 (아래에 제안 됨), 첫 번째 행만 구문 분석했습니다. 각 JSON 줄의 괄호 사이에 쉼표가 없으므로 TextEdit에서이를 변경하고 파일을 저장했습니다. 나는 또한 [파일의 시작과 끝]에 JSON을 추가했다. 이제 다음 단계 :리스트 (임베디드리스트 포함)에서 데이터 프레임 (또는 CSV)에 이르기까지..mongo 파일을 열고 CSV로 콘텐츠를 내보내는 방법은 무엇입니까?

나는 지금 우리가 평가하는 코스에서 edX로부터 데이터 패키지를 얻습니다. 이들 중 일부는 처리하기 쉬운 일반 .csv 파일이고 다른 파일은 나를 위해 더 어렵습니다 (CS 또는 프로그래밍 배경 없음).

나는 R에서 분석을 위해 CSV 파일을 열어서 구문 분석하려고하는 두 개의 파일이 있습니다. 많은 json2csv 도구를 사용해 보았지만 아무 소용이 없습니다. 나는 또한 json을 csv로 바꾸기 위해 여기에 설명 된 간단한 방법을 시도했다.

데이터는 기밀이므로 전체 데이터 세트를 공유 할 수는 없지만 파일의 처음 두 줄을 공유하므로 도움이됩니다. 문제는 .mongo 파일에 대해 아무 것도 발견하지 못한다는 것입니다. 매우 이상하게 보입니다. 심지어 존재합니까? 또는이 오류가 설명 된 JSON 파일이 손상되었을 수 있습니까?

모든 의견을 환영합니다. .mongo 파일 중 하나에

첫 번째 2 개 라인 :

{ 
    "_id": { 
     "$oid": "52d1e62c350e7a3156000009" 
    }, 
    "votes": { 
     "up": [ 

     ], 
     "down": [ 

     ], 
     "up_count": 0, 
     "down_count": 0, 
     "count": 0, 
     "point": 0 
    }, 
    "visible": true, 
    "abuse_flaggers": [ 

    ], 
    "historical_abuse_flaggers": [ 

    ], 
    "parent_ids": [ 

    ], 
    "at_position_list": [ 

    ], 
    "body": "the delft university accredited course with the scholarship (fundamentals of water treatment) is supposed to start in about a month's time. But have the scholarship list been published? Any tentative date??", 
    "course_id": "DelftX/CTB3365x/2013_Fall", 
    "_type": "Comment", 
    "endorsed": false, 
    "anonymous": false, 
    "anonymous_to_peers": false, 
    "author_id": "269835", 
    "comment_thread_id": { 
     "$oid": "52cd40c5ab40cf347e00008d" 
    }, 
    "author_username": "tachak59", 
    "sk": "52d1e62c350e7a3156000009", 
    "updated_at": { 
     "$date": 1389487660636 
    }, 
    "created_at": { 
     "$date": 1389487660636 
    } 
}{ 
    "_id": { 
     "$oid": "52d0a66bcb3eee318d000012" 
    }, 
    "votes": { 
     "up": [ 

     ], 
     "down": [ 

     ], 
     "up_count": 0, 
     "down_count": 0, 
     "count": 0, 
     "point": 0 
    }, 
    "visible": true, 
    "abuse_flaggers": [ 

    ], 
    "historical_abuse_flaggers": [ 

    ], 
    "parent_ids": [ 
     { 
      "$oid": "52c63278100c07c0d1000028" 
     } 
    ], 
    "at_position_list": [ 

    ], 
    "body": "I got it. Thank you!", 
    "course_id": "DelftX/CTB3365x/2013_Fall", 
    "_type": "Comment", 
    "endorsed": false, 
    "anonymous": false, 
    "anonymous_to_peers": false, 
    "parent_id": { 
     "$oid": "52c63278100c07c0d1000028" 
    }, 
    "author_id": "2655027", 
    "comment_thread_id": { 
     "$oid": "52c4f303b03c4aba51000013" 
    }, 
    "author_username": "dmoronta", 
    "sk": "52c63278100c07c0d1000028-52d0a66bcb3eee318d000012", 
    "updated_at": { 
     "$date": 1389405803386 
    }, 
    "created_at": { 
     "$date": 1389405803386 
    } 
}{ 
    "_id": { 
     "$oid": "52ceea0cada002b72c000059" 
    }, 
    "votes": { 
     "up": [ 

     ], 
     "down": [ 

     ], 
     "up_count": 0, 
     "down_count": 0, 
     "count": 0, 
     "point": 0 
    }, 
    "visible": true, 
    "abuse_flaggers": [ 

    ], 
    "historical_abuse_flaggers": [ 

    ], 
    "parent_ids": [ 
     { 
      "$oid": "5287e8d5906c42f5aa000013" 
     } 
    ], 
    "at_position_list": [ 

    ], 
    "body": "if u please send by mail \n", 
    "course_id": "DelftX/CTB3365x/2013_Fall", 
    "_type": "Comment", 
    "endorsed": false, 
    "anonymous": false, 
    "anonymous_to_peers": false, 
    "parent_id": { 
     "$oid": "5287e8d5906c42f5aa000013" 
    }, 
    "author_id": "2276302", 
    "comment_thread_id": { 
     "$oid": "528674d784179607d0000011" 
    }, 
    "author_username": "totah1993", 
    "sk": "5287e8d5906c42f5aa000013-52ceea0cada002b72c000059", 
    "updated_at": { 
     "$date": 1389292044203 
    }, 
    "created_at": { 
     "$date": 1389292044203 
    } 
} 
+1

는 소스가 MongoDB를 보인다. MongoDB는 CSV 또는 유효한 JSON 배열로 내보낼 수 있습니다 (mongoexport의'--jsonArray' 플래그 사용). 어쩌면 상대방이 이러한 옵션을 사용할 수 있습니까? – Sebastian

+0

예 ... 가능할지 모르지만 통신이 매우 느립니다. 그리고 그들이 예외를 만들지는 모르겠지만 어쨌든 물어볼 수 있습니다. 제안 주셔서 감사합니다, 나는 확실히 시도 할 것입니다. 덕분에 –

답변

3

R은 이러한 파일의 "기본"지원하지 않습니다하지만 rjson 패키지와 JSON 파서가있다. RJson 읽고되는 개체에 맞는 데이터 구조로 변환하기 때문에

myfile <- "path/to/myfile.mongo" 
myJSON <- readLines(myfile) 
myNiceData <- fromJSON(myJSON) 

, 당신은 몇 가지 추가 스누핑을해야 할 것이다 그러나 당신은 R 데이터 형식을 일단 당신이 shouldn ': 그래서 나는 내 .mongo 파일을로드 할 수 거기에서 일하는 데 문제가 없습니다.

JSON 데이터를 구문 분석 할 때 고려할 또 다른 패키지는 jsonlite입니다. 데이터 프레임을 만들어서 write.table 또는 다른 쓰기 가능한 개체 작성 방법으로 CSV 형식으로 작성할 수 있습니다.

참고 : : MongoDB에 연결하고 요청에서 데이터를 얻는 것이 더 쉬운 경우 RMongo이 좋은 방법 일 수 있습니다. R-Bloggers는 작은 연습을 가진 RMongo를 사용하는 것에 대해서도 post을 만들었습니다.

+0

. 실제로 JSON에서 먼저 시도했지만 첫 번째 행만 분석했습니다. 각 JSON 줄의 괄호 사이에 쉼표가 없으므로 TextEdit에서이를 변경하고 파일을 저장했습니다. 또한 [파일의 시작 부분에]을 추가 한 다음 JSON과 함께 작업했습니다. 이제 목록에 목록이 있다는 또 다른 문제가 있습니다. 올바르게 구문 분석하는 방법을 알아 내야합니다. –

+0

전체 워크 플로 및 솔루션은 아래의 내 솔루션을 참조하십시오. –

+0

jsonlite를 사용해보십시오. 그러면 데이터 프레임이 생깁니다. – theWanderer4865

0

@theWanderer에서 제안한대로 RJSON을 사용했고 동료의 도움을 받아 데이터를 열로 구문 분석하고 필요한 특정 열을 선택하고 올바른 변수가 반환되는지 각 인스턴스를 확인했습니다 .

전체 흐름 :

  • 가 jsonlint 내의 데이터의 일부를 검사 - 파일의 각 라인 [및] 시작과 끝 사이의 오차 →}, {대신을} {보정
  • JSON 줄을 약 11 개 포함하는 작은 파일 만들기
  • 아래 코드를 사용하여 데이터 파일을 구문 분석했습니다. 그러나 다른 listItem을 먼저 확인 (문제가있는 경우) 또한 오류를 제공하고 데이터에 아무 것도없는 경우 parent_id에 빈 값을 추가했기 때문에 \ n과 같은 항목을 제거했습니다. 이 CSV로

) R에 .mongo 파일을 가져온 다음 구문 분석하는 코드의 데이터를 섞어 것 therwise :

library(rjson) 

###### set working directory to write out the data file 
setwd("/your/favourite/dir/json to csv/") 

#never ever convert strings to factors 
options(stringsAsFactors = FALSE) 
#import the .mongo file to R 
temp.data = fromJSON(file="temp.mongo", method="C", unexpected.escape="error") 

file.remove("temp.csv") ## removes the old datafile if there is one 
         ## (so the data is not appended to the file, 
         ## but a new file is created) 

listItem = temp.data[[1]] ## prepare the listItem the first time 

for (listItem in temp.data){ 
    parent_id = "" 
    if (length(listItem$parent_id)>0){ 
    parent_id = listItem$parent_id 
    } 
write.table(t(c(
    listItem$votes$up_count, listItem$visible, parent_id, 
    gsub("\n", "", listItem$body), listItem$course_id, unlist(listItem["_type"]), 
    listItem$endorsed, listItem$anonymous, listItem$author_id, 
    unlist(listItem$comment_thread_id), listItem$author_username, 
    as.POSIXct(unlist(listItem$created_at)/1000, origin="1970-01-01"))), # end t(), c() 
    file="temp.csv", sep="\t", append=TRUE, row.names=FALSE, col.names=FALSE) 
} 
관련 문제