从多个txt文件创建JSON文件

Create JSON file from multiple txt files

本文关键字:JSON 文件 文件创建 txt      更新时间:2023-09-26

我有以下问题:

*我想要一个JSON文件的键,{"key1","key2"}每个有几个值,并写入一个txt文件。每个密钥的txt文件如下所示:

key1.txt:
val1
val2
val3
..

和类似的结构用于key2.txt。使用这些,我想创建一个json文件,具有以下结构:

{
    key1:
    [ "val1"
      "val2"
       ...
    ]
    key2:
    [ "val1"
      "val2"
       ...
    ]
}
我希望你的问题很清楚。如果可能的话,我更喜欢使用bash。

#!/bin/bash
json="{"
for f in <path of directory>/*.txt
do
filename=$(basename "$f")
filename="${filename%.*}"  
json=$json'"'$filename'"'": ["
while IFS= read -r line; do
echo $filename
json=$json'"'$line'",'
done < $f  
json="${json%?}"
json=$json"],"
done
json="${json%?}"
json=$json"}"
echo $json

jq可用于使用--slurpfile选项读取多个文件。但是文件必须是一个实际的json文件。因为你的文件不是json格式的,所以你需要转换它们。

$ jq -R '.' key1.txt > /tmp/key1.json && '
  jq -R '.' key2.txt > /tmp/key2.json && '
  jq --slurpfile key1 /tmp/key1.json '
     --slurpfile key2 /tmp/key2.json '
     -n '{ key1: $key1, key2: $key2 }'

否则,如果你不想处理临时文件,你可以使用子shell来创建json数组,并使用--argjson传递它们。

$ jq --argjson key1 "$(jq -R '.' key1.txt | jq -s '.')" '
     --argjson key2 "$(jq -R '.' key2.txt | jq -s '.')" '
     -n '{ key1: $key1, key2: $key2 }'

使用循环构建条目数组,然后将循环输出与最终的jq调用合并。

for f in *.txt; do
  <"$f" jq -nR --arg key "${f%.txt}" '{$key,value:[inputs]}';
done | jq -s 'from_entries'

请注意,这个问题的答案非常类似于如何使用jq从其他文件读取内容来更新json文件?在shell脚本循环中使用jq工具构造json