"for" 루프를 사용하여 텍스트 레코드만 변환

"for" 루프를 사용하여 텍스트 레코드만 변환

다음과 같은 줄로 구성된 텍스트 입력 파일이 있습니다.

352|C|PAID|7036|VOICE|01-FEB-12

각 줄을 (파이프라인) 문자의 필드로 분할 |하고 레이블을 사용하여 각 필드를 출력해야 합니다. 즉, 다음 형식의 줄을 생성해야 합니다.

{ "IMSI":"352", "Status":"C", "ServiceType":"PAID", "Number":"7036", "ConnectionType":"VOICE", "ActivationDate":"01-FEB-12" }

어떻게 해야 하나요?

답변1

이 작업을 완전히 셸에서 수행하려면 다음을 수행하세요.

while IFS="|" read -r im st se nu co ac
do
    printf '{ "%s":"%s", "%s":"%s", "%s":"%s", "%s":"%s", "%s":"%s", "%s":"%s" }\n' \
        IMSI           "$im" \
        Status         "$st" \
        ServiceType    "$se" \
        Number         "$nu" \
        ConnectionType "$co" \
        ActivationData "$ac"
done < input > output

답변2

약간의 Python으로 바꿔보세요.

#!/usr/bin/env python

import csv
import json
import sys
from collections import OrderedDict

keys = ['IMSI', 'Status', 'ServiceType', 'Number', 'ConnectionType', 'ActivationData']

with open(sys.argv[1], 'rt') as csvfile:
    reader = csv.reader(csvfile, delimiter='|')
    for row in reader:
        print json.dumps(OrderedDict(zip(keys, row)))

산출:

{"IMSI": "352", "Status": "C", "ServiceType": "PAID", "Number": "7036", "ConnectionType": "VOICE", "ActivationData": "01-FEB-12"}

관련 정보