【问题标题】:JSON to CSV conversion via JQ command in bash通过 bash 中的 JQ 命令将 JSON 转换为 CSV
【发布时间】:2019-09-20 14:22:50
【问题描述】:

想要将 json 转换为 CSV 文件。 CSV 文件要求每行的所有行项目对象 1 + 该行还应包含 PURCHASEORDERNO。

尝试使用 .HEADER[].PURCHASEORDERNO 从 LINE ARRAY 访问 HEADER 数组的对象 PURCHASEORDERNO。但是得到错误 jq: error (at :1): Cannot iterate over null (null)

JQ 命令:-

echo '{"RECEIPT":{"HEADER":[{"LINE":[{"ITEMCODE":"CF7219","QUANTITY":"6"},{"ITEMCODE":"CF7223","QUANTITY":"8"},{"ITEMCODE":"CF7223L","QUANTITY":"8"},{"ITEMCODE":"CF7419","QUANTITY":"6"},{"ITEMCODE":"CF7119","QUANTITY":"3"},{"ITEMCODE":"AP7119/7219L","QUANTITY":"4"},{"ITEMCODE":"CF7620","QUANTITY":"6"},{"ITEMCODE":"HP7313","QUANTITY":"40"}],"SUPPCUSTNAME":"CONFOIL CONTAINERS","SUPPCUSTCODE":"CON001","PROCESSDATE":"20190321","PURCHASEORDERNO":"P6254"},{"LINE":[{"ITEMCODE":"CF7219","QUANTITY":"6"},{"ITEMCODE":"CF7223","QUANTITY":"8"},{"ITEMCODE":"CF7223L","QUANTITY":"8"},{"ITEMCODE":"CF7419","QUANTITY":"6"},{"ITEMCODE":"CF7119","QUANTITY":"3"},{"ITEMCODE":"AP7119/7219L","QUANTITY":"4"},{"ITEMCODE":"CF7620","QUANTITY":"6"},{"ITEMCODE":"HP7313","QUANTITY":"40"}],"SUPPCUSTNAME":"CONFOIL CONTAINERS","SUPPCUSTCODE":"CON001","PROCESSDATE":"20190321","PURCHASEORDERNO":"P6254"}]}}'
 | jq -r '.RECEIPT.HEADER[].LINE[] | ["","ANCPACMEL","ADS",.HEADER[].PURCHASEORDERNO,"",.ITEMCODE,.QUANTITY,"","","","","","","","","","","","","","","","","","","","","","","","","","","",""]|@csv'


错误:-

jq: error (at :1): Cannot iterate over null (null)

所需的输出:-

#CustomsEntryNo,ClientCode,Warehouse,Reference,ArrivalDate,ProductCode,Quantity,QuantityUQ,Pallets,Location,Attribute1,Attribute2,Attribute3,ExpiryDate,PackingDate,CustomsEntryLineNo,CustomsEntryDate,CustomsAddInfo,CustomsQty,CustomsUQ,CtryOfOrigin,ValueForDuty,BondedWhsQty,BondedWhsUQ,TILV,CustomsSecondQuantity,CustomsSecondUnitQty,Tariff,PrimaryPreference,CustomsThirdQuantity,CustomsThirdUnitQty,ManufacturerCode,ZoneStatus,IsFromOtherFTZWarehouse,OutwardType,OutwardType
,ANCPACMEL,ADS,P62541,,CF721911,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62541,,CF722311,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62541,,CF7223L11,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62541,,CF741911,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62541,,CF711911,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62541,,AP7119/7219L11,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62541,,CF762011,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62541,,HP731311,40,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62542,,CF7219,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62542,,CF7223,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62542,,CF7223L,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62542,,CF7419,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62542,,CF7119,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62542,,AP7119/7219L,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62542,,CF7620,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,ANCPACMEL,ADS,P62542,,HP7313,40,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

【问题讨论】:

  • 这里没有问题。
  • 欢迎来到 Stack Overflow!请澄清您的具体问题。目前,如果您有问题,或者您只是想为问题提供解决方案,我们会感到有些困惑。如果您想做后者,请更新问题,使其清楚地代表问题,然后自己添加答案。请查看How to Ask,不要害怕接受tour
  • 输入与您想要的输出不匹配。输入包含两次相同的“PURCHASEORDERNO`“P6254”。但您想要的输出包含两个不同的数字:“P62541”、“P62542”。

标签: json bash csv unix jq


【解决方案1】:

您必须将PURCHASEORDERNO 存储在一个变量中才能将其添加到每一行。

jq -r '.RECEIPT.HEADER[] | .PURCHASEORDERNO as $pono | .LINE[] | [ $pono, .ITEMCODE, .QUANTITY ] | @csv' input

更新标题:

{
  echo '#Reference,ProductCode,Quantity'
  jq -r '.RECEIPT.HEADER[] | .PURCHASEORDERNO as $pono | .LINE[] | [ $pono, .ITEMCODE, .QUANTITY ] | @csv' input
} > output

【讨论】:

  • 如何添加标题
  • @Prabhjot209 在jq 之前使用echoprintf
  • 感谢 ceving,尝试使用以下内容但未获取标题。 echo "#CustomsEntryNo,ClientCode,Warehouse,Reference,ArrivalDate,ProductCode,Quantity,QuantityUQ,Pallets,Location,Attribute1,Attribute2,Attribute3,ExpiryDate,PackingDate,CustomsEntryLineNo,CustomsEntryDate,CustomsAddInfo,CustomsQty,CustomsUQ,CtryOfOrigin,ValueForDuty,BondedWhsQty$" | jq -r '.RECEIPT.HEADER[] | .PURCHASEORDERNO 作为 $pono | .LINE[] | ["","ANCPACMEL","AFS DANDENONG SOUTH", $pono,"", .ITEMCODE, .QUANTITY ,"","","","","","","","", "","","","","","","","","","","","","","","","","" ,"","",""] | @csv' test1.json
  • 不要将标头通过管道传输到jq。这是两个分别生成输出的命令。中间加分号或换行。
  • 我想将包含标题的输出放入文件中。因为我必须传输文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多