从 JSON 文件中提取字段,将其与纯文本文件匹配值进行比较,并从 JSON 文件中提取特定字段

Posted

技术标签:

【中文标题】从 JSON 文件中提取字段,将其与纯文本文件匹配值进行比较,并从 JSON 文件中提取特定字段【英文标题】:To extract field from JSON file comparing it with plain text file matching values and extract specific field from JSON file 【发布时间】:2021-09-24 13:46:59 【问题描述】:

我有file1.json 和纯文本file2,如果使用file2 值与file.json 进行比较,匹配值为file2 会有相应的字段,即file1.json 中的CaseID@ 结果文件应该由这些值组成。我在下面提到了预期结果的案例。

我尝试使用 awk 工具进行提取,但没有得到预期的答案

 awk -F, 'FNR==NR f2[$1];next !($0 in f2)' file2 file1

file1.json


    "Cases": [
            "CaseID": "100",
            "CaseUpdatedByUser": "XYZ",
            "Case": 
                "CaseName": "Apple",
                "ID": "1"
            
        ,
        
            "CaseID": "350",
            "CaseUpdatedByUser": "ABC",
            "Case": 
                "CaseName": "Mango",
                "ID": "1"
            
        ,
        
            "CaseID": "440",
            "CaseUpdatedByUser": "PQR",
            "Case": 
                "CaseName": "Strawberry",
                "ID": "1"
            
        
    ]

文件2

Apple
Strawberry
Mango

预期输出:

100
350
440

【问题讨论】:

这可能会有所帮助:jq -r '.Cases[] | "\(.Case.CaseName);\(.CaseID)"' file1 @Cyrus 我的系统配置了自定义repo,所以无法下载jq @Cyrus 是将值与 file2 进行比较的命令。我在命令中看不到有关 file2 的任何信息 没有。正确的。但这使得使用awk 处理输出变得更容易。 @Cyrus 不知何故我设法使用jq 提取结果.. 这个结果我使用awk 但它会导致最后一个参数的文件内容被传递.. jq -r '.Cases[] | "\(.Case.CaseName);\(.CaseID)"' file1 >> f1 我将结果重定向到 f1 文件的 f1 内容~~~ Apple;100 Mango;350 Strawberry;440 ~~~ 现在如果使用 awk ``` awk -F, 'FNR==NR f2[$1];next ! ($0 in f2)' file2 f1```会变成f1的内容 【参考方案1】:

如果您编写一个extract.py 模块来帮助您获得所需的确切信息,怎么样。

模块很灵活,可以作为模块导入到任何项目中。

我尝试了一个复杂而长的 json 文件,它工作得很好。

这个模块的代码是:

#extract.py

def json_extract(obj, key):
    arr = []

    def extract(obj, arr, key):
        if isinstance(obj, dict):
            for k, v in obj.items():
                if isinstance(v, (dict, list)):
                    extract(v, arr, key)
                elif k == key:
                    arr.append(v)
        elif isinstance(obj, list):
            for item in obj:
                extract(item, arr, key)
        return arr
    
    values = extract(obj, arr, key)
    return values

为了进一步解释,这是原帖的URL (Extract Nested Data From Complex JSON)。

【讨论】:

【参考方案2】:

使用jqawksort

jq -r '.Cases[] | "\(.Case.CaseName);\(.CaseID)"' file1 \
  | awk -F ';' 'NR==FNRarray[$1]=$2; next print array[$1]' - file2 \
  | sort -n

输出:

100 350 440

【讨论】:

以上是关于从 JSON 文件中提取字段,将其与纯文本文件匹配值进行比较,并从 JSON 文件中提取特定字段的主要内容,如果未能解决你的问题,请参考以下文章

从Python中的json文件中的特定字段中提取文本

从特定 JSON 字段中提取数据,将其用作变量,并更新字段值?

Apache Tika 的进度报告?

从文件夹中的所有文本文件中提取与模式匹配的行到单个输出文件

关于C#从Word文件中提取内容(包括样式文字,图片,公式,表格)等信息,解析分字段写入数据库的问题。

从多个表中提取时 PHP while 循环和 if 语句问题