如何在没有 JSON 数组的情况下将 CSV 转换为 JSON?
How to convert CSV to JSON without JSONArray?
我有一个 CSV,看起来像这样(下面是 header 列和一个示例行)。
UID MSA Latitude Longitude
1 New York-Newark-Jersey City, NY-NJ-PA 40.7127837 -74.0059413
我想将其转换为 JSON。 this 之类的网站对我不起作用,因为它们会将其转换为 JSON 的数组。相反,我想要的是一系列以 UID 为标题的 JSON object。这看起来像下面这样(假设第二个 object 与第一个有不同的数据)。
[
"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"
}
]
有没有可以为我做这件事的工具?我可以编写一个脚本来执行此操作,但我不想这样做。
您的问题并不表示您正在寻找一种方法来自动执行此过程。
This site 可能会提供您正在寻找的内容。您将需要 select 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 我曾经测试过。
这是一个使用 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
}
}
我有一个 CSV,看起来像这样(下面是 header 列和一个示例行)。
UID MSA Latitude Longitude
1 New York-Newark-Jersey City, NY-NJ-PA 40.7127837 -74.0059413
我想将其转换为 JSON。 this 之类的网站对我不起作用,因为它们会将其转换为 JSON 的数组。相反,我想要的是一系列以 UID 为标题的 JSON object。这看起来像下面这样(假设第二个 object 与第一个有不同的数据)。
[
"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"
}
]
有没有可以为我做这件事的工具?我可以编写一个脚本来执行此操作,但我不想这样做。
您的问题并不表示您正在寻找一种方法来自动执行此过程。
This site 可能会提供您正在寻找的内容。您将需要 select 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 我曾经测试过。
这是一个使用 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
}
}