【问题标题】:Converting CSV to JSON Solution将 CSV 转换为 JSON 解决方案
【发布时间】:2022-02-09 05:03:27
【问题描述】:

我刚刚为我的后端服务器开发了一个使用 parse 的 iOS 应用程序。我已经完成了应用程序并准备好了,并且有大量的元素要添加到解析后端,但是我已经积累了数据,直到现在才意识到要上传一个类,包括我需要使用 json 的地理点。我的数据文件结构如下:

Country,PostCode,State,Suburb,location/__type,location/latitude,location/longitude,locname,phone,streetaddress,website
Australia,2000,NSW,Cronulla,GeoPoint,-33.935434,151.026887,Shop ABC,+61297901401,ABC Canterbury Road,http://www.123.com.au

我需要将此格式转换为以下格式

{ "results": [
    {
        "Country": "Australia",
        "PostCode": "2000",
        "State": "NSW",
        "Suburb": “Crounlla”,
        "location": {
            "__type": "GeoPoint",
            "latitude": -33.935434,
            "longitude": 151.026887
        },
        "locname": "Shop ABC”,
        "phone": "+123456”,
        "streetaddress": “ABC Canterbury Road",
        "website": "http://www.123.com.au"
    }
] }

我有几千个条目,所以你可以想象我不想手动完成。我只能使用 Mac,因此任何建议都需要对 Mac 友好。由于地理数据,我发现以前的答案无效。

【问题讨论】:

    标签: json csv parse-platform


    【解决方案1】:

    您可以使用python脚本(Mac预装了python) 示例代码:

    #!/usr/bin/python
    
    import csv
    import json
    
    
    header = []
    results = []
    with open('data.csv', 'rb') as f:
        reader = csv.reader(f)
        for row in reader:
            if len(header) > 0:
                location = {}
                datarow = {}
                for key, value in (zip(header,row)):
                    if key.startswith('location'):
                        location[key.split('/')[1]] = value
                    else:
                        datarow[key] = value
                datarow['location'] = location
                results.append(datarow)
            else:
                header = row
    
            print json.dumps(dict(results=results))
    

    【讨论】:

      【解决方案2】:

      也许你可以使用http://www.convertcsv.com/csv-to-json.htm -website 来转换这些东西?

      【讨论】:

        【解决方案3】:

        这是使用jq 的解决方案。

        如果filter.jq 包含以下过滤器

        def parse:
          [
              split("\n")[]                       # split string into lines
            | split(",")                          # split data
            | select(length>0)                    # eliminate blanks
          ]
        ;
        
        def reformat:
          [
              .[0]    as $h                       # headers
            | .[1:][] as $v                       # values
            | [   [$h, $v]                   
                | transpose[]                     # convert array 
                | {key:.[0], value:.[1]}          # to object
              ] | from_entries                    #
            | reduce (
                  keys[]                          # 
                | select(startswith("location/")) # move keys starting
              ) as $k (                           # with "location/"
                  .                               # into a "location" object
                ; setpath($k|split("/");.[$k])    # 
                | delpaths([[$k]])                #
              )
            | .location.latitude  |= tonumber     # convert "latitude" and
            | .location.longitude |= tonumber     # "longitude" to numbers
          ]
        ; 
        
        {
          results: (parse | reformat)
        }
        

        data 包含样本数据,然后是命令

        $ jq -M -Rsr -f filter.jq data
        

        生产

        {
          "results": [
            {
              "Country": "Australia",
              "PostCode": "2000",
              "State": "NSW",
              "Suburb": "Cronulla",
              "locname": "Shop ABC",
              "phone": "+61297901401",
              "streetaddress": "ABC Canterbury Road",
              "website": "http://www.123.com.au",
              "location": {
                "__type": "GeoPoint",
                "latitude": -33.935434,
                "longitude": 151.026887
              }
            }
          ]
        }
        

        【讨论】:

          猜你喜欢
          • 2020-06-07
          • 1970-01-01
          • 1970-01-01
          • 2012-08-22
          • 1970-01-01
          • 2014-02-11
          • 2016-11-05
          • 1970-01-01
          • 2011-03-16
          相关资源
          最近更新 更多