다음은 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
}
}
Perl과 같은 스크립팅 언어가 당신이 찾고있는 도구입니다. 텍스트 변환 유틸리티를 프로그래밍 언어로 바꾸기 전에 얼마만큼의 유연성을 가질 수 있는지에 대한 제한이 있습니다. –
Perl을 특별히 언급하는 이유가 있습니까? 파이썬, F # 등은 똑같이 잘 작동할까요? –
나는 펄을 알고있다. 나는 그런 종류의 처리를 많이하지 않으므로 어떤 언어가 최선인지 말할 수는 없습니다. –