【问题标题】:How to convert CSV to JSON without JSONArray?如何在没有 JSONArray 的情况下将 CSV 转换为 JSON?
【发布时间】:2017-05-20 17:04:02
【问题描述】:

我有一个如下所示的 CSV(下面是标题列和一个示例行)。

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"
}
]

有没有可以为我做这件事的工具?我可以写一个脚本来做,但我不想。

【问题讨论】:

  • 像 Perl 这样的脚本语言是您正在寻找的工具。在文本转换实用程序有效地转变为编程语言之前,您可以为其赋予多大的灵活性是有限度的。
  • 你有什么理由特别提到 Perl 吗? Python、F# 等会同样好用吗?
  • 我碰巧知道 Perl。我不做太多这种处理,所以我无法告诉你哪种语言最好。

标签: json csv converter


【解决方案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
  }
}

【讨论】:

  • 我已经解决了我的问题,但是对于其他有问题的人来说这是正确的:)
【解决方案2】:

您的问题并不表明您正在寻找一种自动化此过程的方法。

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 我曾经测试过。

【讨论】:

  • 查找其他一些城市很不错。
  • 谢谢,我猜这是我的强迫症。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2017-04-05
  • 2019-03-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多