首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从csv构建Json的JQ语句

从csv构建Json的JQ语句
EN

Stack Overflow用户
提问于 2020-07-06 13:02:48
回答 4查看 1.1K关注 0票数 1

我有一个CSV文件,我想把它转换成一个JSON文件,在shell脚本中使用JQ删除CSV中的引号。

下面是名为input.csv的CSV:

代码语言:javascript
复制
1,"SC1","Leeds"
2,"SC2","Barnsley"

以下是JQ摘录:

代码语言:javascript
复制
jq --slurp --raw-input --raw-output \
   'split("\n") | .[1:] | map(split(",")) |
    map({
         "ListElementCode": .[0],
         "ListElement": "\(.[1]) \(.[2])
      })' \
  input.csv > output.json

这将写入output.json:

代码语言:javascript
复制
[
  {
    "ListElementCode": "1",
    "ListElement": "\"SC1\" \"Leeds\""
  },
  {
    "ListElementCode": "2",
    "ListElement": "\"SC2\" \"Barnsley\""
  }
]

您知道如何删除放在ListElement部件中的两个文本值周围的引号吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-07-06 13:43:23

为了只解决最直接的问题,我们可以编写一个函数,如果-和-当它们存在时,它可以去掉引号:

代码语言:javascript
复制
jq -n --raw-input --raw-output '
    def stripQuotes: capture("^\"(?<content>.*)\"$").content // .;

    [inputs | split(",") | map(stripQuotes) |
     {
         "ListElementCode": .[0],
         "ListElement": "\(.[1]) \(.[2])"
     }]
' <in.csv >out.json

也就是说,要真正正确地处理CSV,您不能只使用split(","),而只需要在逗号上拆分不是引号内的逗号(并且需要将双倍引号识别为单引号的转义形式)。实际上,我会使用Python而不是jq来完成这项工作--在编写本文时,烹饪书同意认为本机jq代码只适合于“非常简单”的CSV文件。

票数 1
EN

Stack Overflow用户

发布于 2020-07-06 14:26:36

如前所述,Ruby的回答是:

代码语言:javascript
复制
ruby -rjson -rcsv -e '
  data = CSV.foreach(ARGV.shift)
            .map do |row|
              {
                ListElementCode: row.first,
                ListElement: row.drop(1).join(" ")
              }
            end
  puts JSON.pretty_generate(data)
' input.csv
代码语言:javascript
复制
[
  {
    "ListElementCode": "1",
    "ListElement": "SC1 Leeds"
  },
  {
    "ListElementCode": "2",
    "ListElement": "SC2 Barnsley"
  }
]
票数 1
EN

Stack Overflow用户

发布于 2020-07-06 15:50:55

CSV/JSON中使用适当的珀尔解析器

代码语言:javascript
复制
#!/usr/bin/env perl

use strict; use warnings;

use JSON::XS;
use Text::CSV qw/csv/;

# input.csv:
#1,"SC1","Leeds"
#2,"SC2","Barnsley"
my $vars = [csv in => 'input.csv'];
#use Data::Dumper;
#print Dumper $vars; # display the data structure

my $o = [ ];
foreach my $a (@{ $vars->[0] }) {
   push @{ $o }, {
       ListElementCode => $a->[0],
       ListElement     => $a->[1] . " " . $a->[2]
   };
}

my $coder = JSON::XS->new->ascii->pretty->allow_nonref;
print $coder->encode($o);

输出

代码语言:javascript
复制
[
   {
      "ListElement" : "SC1 Leeds",
      "ListElementCode" : "1"
   },
   {
      "ListElement" : "SC2 Barnsley",
      "ListElementCode" : "2"
   }
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62756705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档