如何在没有 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
  }
}