bash 스크립트를 사용하여 json 맵 객체를 관리형 csv 행으로 변환

bash 스크립트를 사용하여 json 맵 객체를 관리형 csv 행으로 변환

properties아래와 같이 Customer.json 파일의 키 아래에 json 매핑이 있습니다.

{
    "customer": {
        "properties": {
            "customerId": {
                "type": "string",
                "index": "not_analyzed"
            },
            "name": {
                "type": "string",
                "index": "not_analyzed"
            }
        }
    }
}

위의 매핑을 사용 key하여 displayName복사하고 다음과 같이 변환하고 싶습니다 .type

field(key: 'customerId',     displayName: 'customerId', type: 'String')
field(key: 'name',           displayName: 'name',       type: 'String')

치고 시도했는데배쉬 + 파이썬아래와 같이 먼저 클라이언트 키를 가져오고 속성 내부에서 루프를 반복한다고 가정합니다.

$ cat Customer.json | python -c 'import sys; import simplejson as json; \
print "\n".join( [i["properties"] for i in json.loads( sys.stdin.read() )["customer"]] )'

Traceback (most recent call last):
File "<string>", line 2, in <module>
TypeError: string indices must be integers, not str

다른 솔루션에도 열려 있습니다.

답변1

이러한 구조화된 데이터를 구문 분석하는 것은 이전처럼 전용 구문 분석기를 사용하여 수행하는 것이 가장 좋습니다. 그러나 이 특별한 경우에는 다음을 수행할 수 있습니다.

$ grep -B 1 '"type":' Customer.json | tr $'"' $"'" | sed 's/[:,]//g' | 
    awk '{print "field(key: "$1",\tdisplayName: "$1",\t type: "$NF")"}' RS="--" 

반품:

field(key: 'customerId',    displayName: 'customerId',   type: 'string')
field(key: 'name',  displayName: 'name',     type: 'string')

답변2

for오류는 나에게 분명해 보입니다. 루프가 "고객" 사전/맵의 값을 반복하기 때문에 변수 "i"는 문자열입니다 . 값은 사전/맵 자체이며, 이를 반복하면 키 목록(예: ["속성"])이 상속됩니다.

cat Customer.json |  python -c 'import sys; import simplejson as json; \
print "\n".join( [i for i in json.loads( sys.stdin.read() )["customer"]["properties"] ] )'

당신에게 줄 것이다

 customerid
 name

다음을 수행하면 목표에 더 가까워질 수 있습니다.

cat Customer.json |  python -c 'import sys; import simplejson as json; \
print "\n".join( ["{} {}".format(k, v) for k,v in json.loads( sys.stdin.read() )["customer"]["properties"].iteritems() ] )'

이것은 만든다:

customerId {'index': 'not_analyzed', 'type': 'string'}
name {'index': 'not_analyzed', 'type': 'string'}

거기에서 실제로 스크립트에서 Python을 생성하는 것이 좋습니다. 추가 서식 지정 방법 string과 수행 방법을 결정해야 합니다 String. 여러 줄은 항상 디버깅하기 쉽고(귀하의 질문에 설명된 사례) 유지 관리가 가능하며 더 의미 있는(줄 번호) 오류 메시지를 제공합니다.

답변3

그리고 jq:

jq -r '.customer.properties | to_entries[] | 
    "field(key: \u0027\(.key)\u0027, displayName: \u0027\(.key)\u0027, type: \u0027\(.value.type)\u0027)"' Customer.json

그러면 값이 properties키와 . 각각은 키 값(즉, 합계)을 가지며, 각각은 하위 개체의 값을 갖습니다.keyvaluekeypropertiescustomerIdnamevalueproperties

이러한 항목이 있으면 해당 항목의 key값과 값을 추출하여 텍스트 문자열 템플릿에 삽입합니다. 문자열에 표시되는 모든 문자는 작은따옴표 문자입니다.typevalue\u0027

예제 입력 파일이 주어지면 출력은 다음과 같습니다.

field(key: 'customerId', displayName: 'customerId', type: 'string')
field(key: 'name', displayName: 'name', type: 'string')

관련 정보