LINUX - Shell 脚本 - 从平面文件生成映射(键值对)

标签 linux shell csv parsing

我有一个类似于 JSON 的平面文件(不完全相同)。 最终动机是将其转换为 CSV(按特定顺序,与输入 JSON 文件不同)并转储到数据库中。现在由于输入文件并不总是以相同的顺序 AWK,剪切等不会有用。需要像 HASHMAP 这样的东西。附加示例输入和预期输出。请提出建议。

输入 JSON 文件示例(我有 1000 个文件,每个文件 50K 行,每个文件 200 列)

{"Field1":{"string":"Value,123"},"Field2":{"string":"564243"},"Field3":{"string":"SWCHP0001155"},"LOCATION":null,"OWNERUID":{"string":"655,,34"}}
{"Field1":{"string":"Value,456"},"Field2":{"string":"89565655"},"Field3":{"string":"SWCHP0001166"},"LOCATION":{"string":"BEACH,"},"OWNERUID":{"string":"65534"}}
........

按特定顺序输出 CSV 文件,假设按顺序(OWNERUID、LOCATION、Field1、Field2、Field3)

655;;34,null,Value;123,564243,SWCHP0001155
65534,BEACH;,Value;456,89565655,SWCHP0001166

到目前为止,我的想法是做一些字符串操作,改变标准格式,如下所示,将数据传输到 hashmap,获取所需的内容并转储到 CSV 中

中级标准格式:(可以更改,请建议)

Field1?Value;123,Field2?564243,Field3?SWCHP0001155,LOCATION?null,OWNERUID?655;;34
Field1?Value;456,Field2?89565655,Field3?SWCHP0001166,LOCATION?BEACH;,OWNERUID?65534
........

注意:

  1. 值包含 , 和其他特殊字符
  2. 我可以更改值,有点像将逗号转换为分号(如上)
  3. 有 NULL 值要处理

最佳答案

jq 是一个旨在处理 JSON 字符串的 C 工具。它充当过滤器(或过滤器链),一次处理一个输入,并有相当不错的文档。它可能在您的发行版中可用,或者假装是从源代码构建的,除了 C 编译器之外几乎没有任何依赖性。在您的示例中,这应该足够了:

$ cat file.json |  jq '[.OWNERUID.string, .LOCATION.string?, .Field1.string?, .Field2.string?, .Field3.string?]|join(";")'
"655,,34;;Value,123;564243;SWCHP0001155"
"65534;BEACH,;Value,456;89565655;SWCHP0001166"
$

或者,如果您想去掉引号,sed 过滤器可以删除它们:

$ cat ess.txt |  jq '[.OWNERUID.string, .LOCATION.string?, .Field1.string?, .Field2.string?, .Field3.string?]|join(";")' | sed -e 's/^"\(.*\)"$/\1/'
655,,34;;Value,123;564243;SWCHP0001155
65534;BEACH,;Value,456;89565655;SWCHP0001166
$

关于LINUX - Shell 脚本 - 从平面文件生成映射(键值对),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47218169/

相关文章:

php - 如何获取php系统函数的全部输出

database - postgres 实用程序脚本中的参数

regex - shell 命令: need help about a regex match

javascript - 是否可以使用 Papa 解析从文件目录中自动选取 CSV 文件?

csv - phpmyadmin:导入制表符分隔文件

java - 解析 CSV : Count the number of columns using Univocity with bean processor

linux - 从根 bash 脚本以非根身份运行文件

java - 如何覆盖服务器上的文件

linux - 用于创建文件夹和移动文件的 bash 脚本

shell - 如何在 unix shell 中调用 Octave 脚本