Json JQ替换“替换”\";从编码字段内部
到目前为止,我已经尝试了很多解决方案,但我担心我对JQ的理解正在减弱,我从2天前开始尝试使用它 我得到了一个非常好的解决方案,可以将我的文件从Json解析为Csv,但只需要一个小pitfal Json内部有一个base64编码的(.data)字段,它本身就是一个编码的Json。在这个子Json中,有一个包含文本(.text)的字段,其中包含“\n”,在转换时,由于“\n”被转换为最终文件中的实际换行符,该行将被损坏 这是我现在拥有的命令:Json JQ替换“替换”\";从编码字段内部,json,bash,export-to-csv,jq,gsub,Json,Bash,Export To Csv,Jq,Gsub,到目前为止,我已经尝试了很多解决方案,但我担心我对JQ的理解正在减弱,我从2天前开始尝试使用它 我得到了一个非常好的解决方案,可以将我的文件从Json解析为Csv,但只需要一个小pitfal Json内部有一个base64编码的(.data)字段,它本身就是一个编码的Json。在这个子Json中,有一个包含文本(.text)的字段,其中包含“\n”,在转换时,由于“\n”被转换为最终文件中的实际换行符,该行将被损坏 这是我现在拥有的命令: jq-linux64 -r '["ackId&
jq-linux64 -r '["ackId","data","senderPhoneNumber","eventType","eventId","messageId2","postbackData","text","sendTime","project_number","type","event_type","product","messageId","publishTime"], (.receivedMessages[] | [.ackId, .message.data, (.message.data | @base64d | fromjson | .senderPhoneNumber, .eventType, .eventId, .messageId, .postbackData, .text, .sendTime), .message.attributes.project_number, .message.attributes.type, .message.attributes.event_type, .message.attributes.product, .message.messageId,.message.publishTime]) | @csv' <inputfile.txt >outputfile.txt
当我使用上述命令处理此文件时,它会给出:
"ackId","data","senderPhoneNumber","eventType","eventId","messageId2","postbackData","text","sendTime","project_number","type","event_type","product","messageId","publishTime"
"xxxxxx","eyJzZW5kZXJQaG9uZU51bWJlciI6ICIrOTk5OTk5OTk5OTk5OSIsIm1lc3NhZ2VJZCI6ICIyM2QyM2QyM2QzMmQiLCJzZW5kVGltZSI6ICIyMDIxLTAyLTAyVDIwOjAwOjAwLjAwMDAxIiwidGV4dCI6ICJYWFhYWCBYWFhYWFhYRSwgWFhYWFhYWC8gWHh4eHh4LlxuXG5YeHh4eHh4eHg6XG5cbjEgeHh4eCB4eCB4eHh4ICgyMDAgeHgpXG4yLDUgeHh4eHhcbjEgeHh4eCBcblxuWHh4eHh4IHh4eHh4eCJ9Cg==","+9999999999999",,,"23d23d23d32d",,"XXXXX XXXXXXXE, XXXXXXX/ Xxxxxx.
Xxxxxxxxx:
1 xxxx xx xxxx (200 xx)
2,5 xxxxx
1 xxxx
Xxxxxx xxxxxx","2021-02-02T20:00:00.00001","XXXXXX","message",,"XXXX","234234234234234234","2021-02-02T20:15:22.888Z"
字段“.text”从编码的“\n”生成换行符,使一行变为多行,从而损坏该行以便后续处理
---由@peak应答的完整应答代码
jq-linux64 -r '["ackId","data","senderPhoneNumber","eventType","eventId","messageId2","postbackData","text","sendTime","project_number","type","event_type","product","messageId","publishTime"], (.receivedMessages[] | [.ackId, .message.data, (.message.data|@base64d|fromjson|.senderPhoneNumber,.eventType,.eventId,.messageId,.postbackData,(.text | tostring | gsub("\n"; "|")),.sendTime),.message.attributes.project_number,.message.attributes.type,.message.attributes.event_type,.message.attributes.product,.message.messageId,.message.publishTime]) | @csv' <input.json >output.csv
jq-linux64-r'[“ackId”、“data”、“senderPhoneNumber”、“eventType”、“eventId”、“messageId2”、“postbackData”、“text”、“sendTime”、“project_number”、“type”、“event_type”、“product”、“messageId”、“publishTime”],(.receivedMessages[.ackId、.message.data、.message.data |@base64d | fromjson |.senderPhoneNumber、.eventType、.eventId、.messageId、.postbackData、,(.text | tostring | gsub(“\n”;“|”),.sendTime),.message.attributes.project_number、.message.attributes.type、.message.attributes.event_type、.message.attributes.product、.message.messageId、.message.publishTime])@csv'output.csv
将-r选项与@csv
过滤器一起使用,旨在(实际上在这种情况下)根据各种csv标准生成有效的csv,这些标准允许在引用的字符串值中嵌入换行符
因此,您似乎面临的问题是,用于接收CSV的程序不接受双引号字段中嵌入的换行符
因此,最简单的解决方法可能是以您和其他程序都能接受的方式对换行符进行“编码”
例如,可以使用jq过滤器将新行编码为管道(“|”)符号:
gsub("\n"; "|")
假设“text”是一个字符串值字段,其中可能包含嵌入的换行符,则将.text
替换为
(.text | gsub("\n"; "|"))
如果.text
的值可能为空,则必须决定如何处理空值。(一种可能是:.text | tostring | gsub(“\n”;“|”)
)
如果要将转换应用于所有字符串字段,请将|@csv
替换为以下内容:
| map(if type == "string" then gsub("\n"; "|") else . end)
| @csv
包含换行符(CRLF)、双引号和逗号的字段应包含在双引号中
请将示例输入(无描述、无图像、无链接)和该示例输入的所需输出添加到您的问题中(无注释)。如果没有输入,示例命令太大。更简单的示例(具有相应的输入)就足够了。不清楚为什么换行会引起问题。显示说明问题的.text字段的值以及您期望的相应值可能就足够了。很可能您尝试的内容与需要的内容非常接近,因此请同时显示一个示例。问题在中用示例更新输入ans输出,当数据被编码时,它提供了一些工作,并且所有数据都包含合理的联系数据。为什么要使用-r选项?你能展示一下在我的snipet的一部分中这会是什么样子吗?很抱歉没有添加示例,但我尝试使用“gsub”但无法找到一种方法让jq无误地接受它。不确定这是一种方法,但我尝试了“…,(.text|gsub(\\n“;“|”),…”jq:error(at:14004):null(null)无法匹配,因为它不是字符串,你是对的,我不需要正确的csv,只需要在数据库中加载一个由某些字符分隔的平面文件(oracle11g sqlloader)。请参阅更新。这很有效,我发现在“fromjson”之后的代码中有一个额外的“[…]”导致了问题,当它们被删除时,它就像一个符咒一样工作,谢谢!
| map(if type == "string" then gsub("\n"; "|") else . end)
| @csv