ここには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に具体的に言及する理由はありますか? Python、F#などは同様にうまくいくのだろうか? –
私はPerlを知りました。私はその種の処理をあまりしないので、どの言語が最良かを教えてくれませんでした。 –