首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在AWK中打印JSON对象

如何在AWK中打印JSON对象
EN

Stack Overflow用户
提问于 2018-05-23 07:39:36
回答 1查看 1.8K关注 0票数 2

我一直在寻找awk中的一些内置函数来轻松生成JSON对象。我偶然发现了几个答案,并决定创建自己的答案。

我想从存储表格样式数据的多维数组生成JSON,并使用要从这些数据生成的JSON模式的单独和动态定义。

所需输出:

代码语言:javascript
复制
{
"Name": JanA
"Surname": NowakA
"ID": 1234A
"Role": PrezesA
}
{
"Name": JanD
"Surname": NowakD
"ID": 12341D
"Role": PrezesD
}
{
"Name": JanC
"Surname": NowakC
"ID": 12342C
"Role": PrezesC
}

输入文件:

代码语言:javascript
复制
pierwsza linia
druga linia
trzecia linia

dane wspólników
imie JanA
nazwisko NowakA
pesel 11111111111A
funkcja PrezesA

imie Ja"nD
nazwisko NowakD
pesel 11111111111
funkcja PrezesD

imie JanC
nazwisko NowakC
pesel 12342C
funkcja PrezesC

czwarta linia

reprezentanci

imie Tomek

基于输入文件,我创建了一个多维数组:

代码语言:javascript
复制
JanA  NowaA 1234A PrezesA
JanD  NowakD 12341D PrezesD
JanC  NowakC 12342C PrezesC
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-23 07:39:36

我更新的简单数组打印机的awk实现,对每一列进行了基于regex的验证(使用gawk运行):

代码语言:javascript
复制
function ltrim(s) { sub(/^[ \t]+/, "", s); return s }
function rtrim(s) { sub(/[ \t]+$/, "", s); return s }
function sTrim(s){
    return rtrim(ltrim(s));
}

function jsonEscape(jsValue) {
    gsub(/\\/, "\\\\", jsValue)
    gsub(/"/,  "\\\"", jsValue)
    gsub(/\b/, "\\b",  jsValue)
    gsub(/\f/, "\\f",  jsValue)
    gsub(/\n/, "\\n",  jsValue)
    gsub(/\r/, "\\r",  jsValue)
    gsub(/\t/, "\\t",  jsValue)

    return jsValue
}

function jsonStringEscapeAndWrap(jsValue) {
    return "\42" jsonEscape(jsValue) "\42"
}

function jsonPrint(contentArray, contentRowsCount, schemaArray){    
    result = ""
    schemaLength = length(schemaArray)
    for (x = 1; x <= contentRowsCount; x++) {
        result = result "{"
        for(y = 1; y <= schemaLength; y++){

            result = result "\42" sTrim(schemaArray[y]) "\42:" sTrim(contentArray[x, y])

             if(y < schemaLength){
                result = result ","
            }

        }        
        result = result "}"
        if(x < contentRowsCount){
            result = result ",\n"
        }
    }
    return result
}

function jsonValidateAndPrint(contentArray, contentRowsCount, schemaArray, schemaColumnsCount, errorArray){  
    result = ""
    errorsCount = 1
    for (x = 1; x <= contentRowsCount; x++) {
        jsonRow = "{"
        for(y = 1; y <= schemaColumnsCount; y++){

            regexValue = schemaArray[y, 2]
            jsonValue = sTrim(contentArray[x, y])
            isValid = jsonValue ~ regexValue            

            if(isValid == 0){
                errorArray[errorsCount, 1] = "\42" sTrim(schemaArray[y, 1]) "\42"
                errorArray[errorsCount, 2] = "\42Value " jsonValue " not match format: " regexValue " \42"
                errorArray[errorsCount, 3] = x
                errorsCount++
                jsonValue = "null"
            }            

            jsonRow = jsonRow "\42" sTrim(schemaArray[y, 1]) "\42:" jsonValue

            if(y < schemaColumnsCount){
                jsonRow =  jsonRow ","
            }
        }        
        jsonRow = jsonRow "}"
        result = result jsonRow

        if(x < contentRowsCount){
            result = result ",\n"
        }
    }

    return result
}

BEGIN{  
    rowsCount =1
    matchCount = 0
    errorsCount = 0
    shareholdersJsonSchema[1, 1] = "Imie"
    shareholdersJsonSchema[2, 1] = "Nazwisko"
    shareholdersJsonSchema[3, 1] = "PESEL"
    shareholdersJsonSchema[4, 1] = "Funkcja"

    shareholdersJsonSchema[1, 2] = "\\.*"
    shareholdersJsonSchema[2, 2] = "\\.*"
    shareholdersJsonSchema[3, 2] = "^[0-9]{11}$"
    shareholdersJsonSchema[4, 2] = "\\.*"


    errorsSchema[1] = "PropertyName"    
    errorsSchema[2] = "Message"
    errorsSchema[3] = "PositionIndex"

    resultSchema[1]= "ShareHolders"
    resultSchema[2]= "Errors"
}

/dane wspólników/,/czwarta linia/{      

    if(/imie/ || /nazwisko/ || /pesel/ || /funkcja/){

        if(/imie/){
            shareholdersArray[rowsCount, 1] = jsonStringEscapeAndWrap($2)
            matchCount++ 
        }
        if(/nazwisko/){ 
            shareholdersArray[rowsCount, 2] = jsonStringEscapeAndWrap($2)
            matchCount ++ 
        }
        if(/pesel/){             
            shareholdersArray[rowsCount, 3] = $2
            matchCount ++ 
        }
        if(/funkcja/){ 
            shareholdersArray[rowsCount, 4] = jsonStringEscapeAndWrap($2)
            matchCount ++
        }

        if(matchCount==4){
            rowsCount++
            matchCount = 0;
        }         
    } 
}

END{
    shareHolders = jsonValidateAndPrint(shareholdersArray, rowsCount - 1, shareholdersJsonSchema, 4, errorArray)

    shareHoldersErrors = jsonPrint(errorArray, length(errorArray) / length(errorsSchema), errorsSchema)

    resultArray[1,1] = "\n[\n" shareHolders "\n]\n"
    resultArray[1,2] = "\n[\n" shareHoldersErrors "\n]\n"

    resultJson = jsonPrint(resultArray, 1, resultSchema)
    print resultJson    
}

生成输出:

代码语言:javascript
复制
{"ShareHolders":
[
{"Imie":"JanA","Nazwisko":"NowakA","PESEL":null,"Funkcja":"PrezesA"},
{"Imie":"Ja\"nD","Nazwisko":"NowakD","PESEL":11111111111,"Funkcja":"PrezesD"},
{"Imie":"JanC","Nazwisko":"NowakC","PESEL":null,"Funkcja":"PrezesC"}
]
,"Errors":
[
{"PropertyName":"PESEL","Message":"Value 11111111111A not match format: ^[0-9]{11}$ ","PositionIndex":1},
{"PropertyName":"PESEL","Message":"Value 12342C not match format: ^[0-9]{11}$ ","PositionIndex":3}
]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50477885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档