将纯数据转换为 json 文件

将纯数据转换为 json 文件

每个人。我对 Linux 还很陌生,通过阅读这个网站,我学到了很多东西。我的会计程序遇到了一些麻烦,这就是我向您重复的原因。我想将数据从纯文本移动到 json,我相信这会给我带来更好的结果和更大的灵活性。

我有一个文件夹,其中包含单独文件中的信息。文件是这样的:

20170404
pago
80051442-4
002-001-0080057
310000


310000
si
2017-06-05

我想将此信息复制到新文件中,其中每一行都是一个新的 json 字段。像这样的东西:

{
"field1":"20170404",
"field2":"pago",
"field3":"80051442-4",
"field4":"002-001-0080057",
"field5":"310000"
"field6":"",
"field7":"";
"field8":"310000"
"field9":"si"
"field10":"2017-06-05"
}

我正在寻找一个脚本来读取整个目录并构建这些新文件:oldfile.json。

之后,我想在不同的列中标记其中几个文件的结果:

file1    field1    field2    field3   field4    field5    field6    field7
file2    field1    field2    field3   field4    field5    field6    field7
file3    field1    field2    field3   field4    field5    field6    field7
file4    field1    field2    field3   field4    field5    field6    field7
file5    field1    field2    field3   field4    field5    field6    field7

感谢大家抽出宝贵的时间。

答案1

我会使用解决这个问题杰克工具(一个合适的 JSON 解析/操作工具):

for f in *; do
    jq -R -s 'rtrimstr("\n") | split("\n") | to_entries | reduce .[] as $o ({}; .["field" + ($o.key+1|tostring)] |= $o.value )' "$f" > "$f".json; 
done

  • -R( ) 与( )--raw-input结合- 将整个输入作为单个长字符串传递到过滤器-s--slurp

答案2

for file in *; do
    awk 'BEGIN { print "{" }  END { print "\n}" } { printf( "%s",newrec); printf( "\"field%d\": \"%s\"", NR, $0); newrec=",\n" }' "$file" > "${file}.json"
done

NR是文件中迄今为止已处理的记录数(或行数)。这是在第一行、第二行等等1上工作时的情况。2

$0是整个未修改的输入记录(或行)。

如果字段的名称相同,您可以labels[]在节中定义一个数组(例如 )BEGIN,然后通过索引引用它们(例如labels[NR])。

答案3

回答第二部分 - 将 json 文件转换为表。

用法: ./json_to_table.sh *.json

#!/bin/bash

for i in "$@"; do
    file_content=$(sed -n 's/".*":"\(.*\)",\?/\1/p' "$i" | tr '\n' ' ')
    printf "%s %s\n" "$i" "$file_content"
done | column -t

如果您不需要漂亮的表格格式,那么您可以删除 | column -t部分(在底部,之后done)。然后行的字段将由一个空格分隔,因此,每个字段都有自己的宽度。它有利于程序解析,例如awk, sed,但不方便人类阅读。

笔记:json 文件中的每条记录之后(最后一条除外)都应该是逗号。我的意思是说:

"field8":"310000", <- here
"field9":"si", <-here
"field10":"2017-06-05" <- not here. Last record without comma.
}

答案4

所以第一部分的最终脚本是:

for file in facturas/*; do
    awk 'BEGIN {
        split("fechae tpago ruc nfactura total iva10 iva5 iva0 archivado fechap",campos)
        print "{" 
    }
    END {
        print "\n}" 
    }
    {
        printf( "%s",newrec)
        printf( "\"%s\":\"%s\"", campos[NR], $0)
        newrec=",\n"
    }' "$file" > "${file}.json"
done

第二部分的最终结果:

#!/bin/bash

for i in "$@"; do
    printf "%s " "$i"
    sed -n 's/".*":"\(.*\)"/\1/p' "$i" | tr ',\n' ' ' 
    echo
done | column -t

感谢大家的关注。

相关内容