2017-01-06 1 views
0

다음과 같은 CSV가 있습니다 (아래 헤더 열과 샘플 행).CSON을 JSONArray없이 JSON으로 변환하는 방법은 무엇입니까?

UID MSA Latitude Longitude 
1 New York-Newark-Jersey City, NY-NJ-PA 40.7127837 -74.0059413 

이것을 JSON으로 변환하고 싶습니다. this과 같은 사이트는 JSON 배열로 변환하기 때문에 나에게 적합하지 않습니다. 대신 UID로 제목이 지정된 일련의 JSON 객체를 원한다. 그러면 아래처럼 보일 것입니다 (두 번째 객체가 첫 번째 객체와 다른 데이터 인 것처럼 가장합니다).

[ 
"1" : { 
"Latitude" : 40.7127837, 
"Longitude" : -74.0059413, 
"MSA" : "New York-Newark-Jersey City, NY-NJ-PA" 
}, 
"2" : { 
"Latitude" : 40.7127837, 
"Longitude" : -74.0059413, 
"MSA" : "New York-Newark-Jersey City, NY-NJ-PA" 
} 
] 

나를 위해이 작업을 수행 할 수있는 도구가 있습니까? 내가 할 수있는 스크립트를 작성할 수는 있지만 원하지 않습니다.

+1

Perl과 같은 스크립팅 언어가 당신이 찾고있는 도구입니다. 텍스트 변환 유틸리티를 프로그래밍 언어로 바꾸기 전에 얼마만큼의 유연성을 가질 수 있는지에 대한 제한이 있습니다. –

+0

Perl을 특별히 언급하는 이유가 있습니까? 파이썬, F # 등은 똑같이 잘 작동할까요? –

+0

나는 펄을 알고있다. 나는 그런 종류의 처리를 많이하지 않으므로 어떤 언어가 최선인지 말할 수는 없습니다. –

답변

1

다음은 jq을 사용하는 해결책입니다.

filter.jq

def parse: 
    [ 
     split("\n")[]   # split string into lines 
    | split("\t")    # split into columns 
    | select(length>0)  # eliminate blanks 
    ] 
; 
def makeobj($headers;$data): 
    [       # e.g. 
     [$headers, $data]  # [["MSA","LATITUDE","LONGITUDE"],["Savannah, GA"... 
    | transpose[]    # ["MSA","Savannah, GA"], ["LATITUDE","32.0835"] ... 
    | {key:.[0], value:.[1]} # {"key":"MSA","value":"Savannah, GA"} ... 
    ] | from_entries   # {"MSA":"Savannah, GA","LATITUDE":"32.0835",... 
    | .LATITUDE |= tonumber 
    | .LONGITUDE |= tonumber 
; 
def reorganize: 
    .[0] as $h    # save headers 
    | reduce .[1:][] as $r ( # construct final object result 
    {} 
    ; .[$r[0]] = makeobj($h[1:]; $r[1:]) 
    ) 
; 
parse | reorganize 

data 탭 구분

UID MSA LATITUDE LONGITUDE 
1 New York-Newark-Jersey City, NY-NJ-PA 40.7127837 -74.0059413 
2 Seattle, WA 47.6062 122.3321 
3 San Francisco, CA 37.7749 122.4194 
4 Savannah, GA 32.0835 81.0998 

다음 명령

$ jq -M -Rsr -f filter.jq data 

포함 다음 필터를 포함하는 경우는

생산
{ 
    "1": { 
    "MSA": "New York-Newark-Jersey City, NY-NJ-PA", 
    "LATITUDE": 40.7127837, 
    "LONGITUDE": -74.0059413 
    }, 
    "2": { 
    "MSA": "Seattle, WA", 
    "LATITUDE": 47.6062, 
    "LONGITUDE": 122.3321 
    }, 
    "3": { 
    "MSA": "San Francisco, CA", 
    "LATITUDE": 37.7749, 
    "LONGITUDE": 122.4194 
    }, 
    "4": { 
    "MSA": "Savannah, GA", 
    "LATITUDE": 32.0835, 
    "LONGITUDE": 81.0998 
    } 
} 
+0

나는 이미 내 문제를 해결했지만이 질문에 다른 사람들에게 올바른 것으로 표시했습니다. :) –

1

질문이 사용자가이 프로세스를 자동화하는 방법을 찾고 있다고 제안하지 않습니다.

This site 당신이 찾고있는 것을 제공 할 수 있습니다. 출력 형식에 JSON-Dictionary를 선택해야합니다.

UID MSA LATITUDE LONGITUDE 
1 New York-Newark-Jersey City, NY-NJ-PA 40.7127837 -74.0059413 
2 Seattle, WA 47.6062 122.3321 
3 San Francisco, CA 37.7749 122.4194 
4 Savannah, GA 32.0835 81.0998 


Output: 
{ 
    "1": { "MSA":"New York-Newark-Jersey City, NY-NJ-PA", "LATITUDE":40.7127837, "LONGITUDE":-74.0059413}, 
    "2": { "MSA":"Seattle, WA", "LATITUDE":47.6062, "LONGITUDE":122.3321}, 
    "3": { "MSA":"San Francisco, CA", "LATITUDE":37.7749, "LONGITUDE":122.4194}, 
    "4": { "MSA":"Savannah, GA", "LATITUDE":32.0835, "LONGITUDE":81.0998} 
} 

여기에서 다운로드 할 수 있습니다 : test.csv 나는 테스트에 사용되었습니다.

+0

다른 도시를 바라 보는 멋진 접촉. –

+0

탁신, 내 생각에 OCD이다. –

관련 문제