【问题标题】:Compare two json files with same name but different values in two files比较两个文件中同名但值不同的两个json文件
【发布时间】:2020-04-17 04:57:35
【问题描述】:

我有两个 json 文件,内容如下:

文件1:

    {
      "name": "SES_ENABLED",
      "value": "true"
    },
    {  
        "name":"SES_ADDRESS",
        "value":"email-xxxxxx.aws.com"    
    },
    {  
        "name":"SES_FROM_EMAIL",
        "value":"abc@gmail.com"  
    },
    {  
        "name":"SES_TO_EMAIL",
        "value":"123@gmail.com"  
    }

文件 2:

   {
      "name": "SES_ENABLED",
      "value": "false"
    },

    {  
        "name":"SES_FROM_EMAIL",
        "value":"xyz@gmail.com"  
    },
    {  
        "name":"SES_ADDRESS",
        "value":"emails-xyzyzyz.aws.com"    
    }

在上述两个文件中,名称变量将相同,但值不同,顺序不同,并且文件 1 中还有一个额外的字段

{
   "name": "SES_TO_EMAIL"
   "value": "123@gmail.com"
}

如何从 file1 比较 file2 是否存在常见的“名称”变量,以及如果 file2 中缺少任何字段而不是 file1,我该如何获得。

例如:

比较 file1 和 file2 后,我需要得到类似 "name": "SES_TO_EMAIL" is not present in file2 的输出。

任何解决方案都会非常有用。

在此先感谢 :)

【问题讨论】:

  • 使用正则表达式根据您的需要过滤文本。 regexone.com
  • 到目前为止你有什么尝试?
  • 检查this。这可能会对您有所帮助。
  • 一个选项是在 file1 中创建所有名称的哈希集,迭代 file2 并检查是否存在于哈希集中(如果可用)从哈希集中删除(或进行进一步处理)

标签: python json shell compare


【解决方案1】:

假设每个文件都包含一个对象流,一个简单的 程序就可以解决问题。

reduce inputs.name as $name ({}; .[input_filename] += [$name])
| (keys_unsorted | combinations(2)) as $pair
| (.[$pair[0]] - .[$pair[1]])[]
| "name: \(.) is not present in \($pair[1])"

调用:

jq -rnf prog.jq file1 file2 file3 ...

【讨论】:

  • 出现错误,无法用字符串“name”索引字符串
  • @Bala 这意味着您的输入样本并不能真正代表您的实际输入。修复它们并让我知道
  • 我有点困惑 oguz,假设我的文件是 file1.json 和 file2.json。并且里面的文件内容与问题中提到的完全一样。你能编辑你的 prog.jq 文件吗?
  • @Bala JQ 无法识别该格式。它应该类似于[{},{},{}](对象数组)或{}{}{}(对象流); {},{},{} 不是有效的 JSON 值。我更新了我的答案以使用{}{}{} 格式。
【解决方案2】:
def compare(files):
    # store all name into list of list
    names = [[prop['name'] for prop in file] for file in files]
    for i, name in enumerate(names):
        # create a temporary list
        temp_name = names.copy()
        # remove current name in list
        temp_name.pop(i)
        for n in name:
            for j, temp in enumerate(temp_name):
                if not (n in temp): # if name in not present in the other file, print it
                    print('name: {} is not present in file {}'.format(n, (j+1 if j < i else j + 2)))

这是我的幼稚方式,我们需要将所有名称存储在list 中,并将每个名称与该列表进行比较。简单地使用它

import json
# open the first file
with open('file1.json', 'r') as file:
    file1 = json.load(file)
# open the second file
with open('file2.json', 'r') as file:
    file2 = json.load(file)
# then compare them
compare([file1, file2])

输出会是这样的

name: SES_TO_EMAIL is not present in file 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2021-11-20
    • 2012-12-31
    相关资源
    最近更新 更多