여러 레코드가 포함된 플랫 파일 변환/가져오기(한 줄에 변수 1개)

여러 레코드가 포함된 플랫 파일 변환/가져오기(한 줄에 변수 1개)

저는 (UNIX) 명령줄 도구를 사용하여 플랫 파일을 (NY) 데이터베이스로 읽는 효율적인 방법을 찾고 있습니다. 아마도 먼저 중간 구조 형식(예: XML 또는 csv)으로 변환한 후일 것입니다. 플랫 파일에는 아래와 같이 각 행에 키와 값이 포함된 여러 레코드가 있습니다. 변수의 수는 레코드마다 다를 수 있으며, 변수의 수와 이름은 입력 파일을 읽은 후에만 알 수 있습니다. (문제를 더 복잡하게 만들기 위해 중복 변수가 중첩될 수 있지만 지금은 무시할 수 있습니다.)

[RecordUUID.1]
"Variable1Key"="Variable1Value"
"Variable2Key"="Variable2Value"
"Variable3Key"="Variable3Value"

[RecordUUID.4]
"Variable1Key"="Variable1Value"
"Variable5Key1"="Variable51Value1"
"Variable5Key1"="Variable51Value2"
"Variable5Key2"="Variable52Value1"
"Variable5Key2"="Variable52Value2"

행을 열로 변환하는 방법에 대한 이 사이트의 답변과 기타 답변을 확인했지만 적절한 답변은 없는 것 같습니다. 문제는 INI 또는 VCARD 파일을 읽는 것과 비슷해 보이지만 일반적인 해결책을 찾을 수 없습니다. XSL 변환이 가능할 수도 있지만 아직 찾지 못했습니다. 어떤 조언이라도 매우 환영합니다. 감사합니다.

답변1

최종 결과로 정확히 무엇을 원하는지 잘 모르겠지만 다음은 데이터를 XML로 변환하는 Python 스크립트입니다.

#!/usr/bin/env python2
# -*- coding: ascii -*-
"""transform.py

Parses a data file contain textual records in the following format:

    [RecordUUID.n]
    "Variable1Key"="Variable1Value"
    "Variable2Key"="Variable2Value"
    "Variable3Key"="Variable3Value"

and converts it to an XML document with record-elements of the following form:

    <RecordUUID.1>
        <Variable1Key>Variable1Value</Variable1Key>
        <Variable2Key>Variable2Value</Variable2Key>
        <Variable3Key>Variable3Value</Variable3Key>
    </RecordUUID.1>
"""

import sys
import re
from xml.etree.ElementTree import Element, SubElement, tostring
from xml.dom.minidom import parseString

# Creat a root element for the XML document
root = Element('root')

# Set a variable to keep track of the current record
current_record = None

# Parse the data and construct an XML representation
with open(sys.argv[1]) as datafile:

    # Extract the non-empty lines from the data file
    lines = [line.strip() for line in datafile if line.strip()]

    # Iterate over the lines
    for line in lines:

        # Check to see if we've reached a new record
        if "RecordUUID" in line:

            # Extract the record ID
            eid = line.strip()[1:-1]

            # Add a new child element to the document
            # and update the current record
            current_record = SubElement(root, eid)

        # Check to see if we've reached a new key-value pair
        else:
            match = re.match(r'^"(\w+)"="(\w+)"$', line.strip())

            # If we have a key-value pair then update the current record
            if match:
                key, value = match.groups()
                SubElement(current_record, key).text = value

# Display the generated XML document
print(parseString(tostring(root)).toprettyxml(indent="\t"))

다음 데이터(예: 질문의 예제 데이터)를 다음이라는 파일에 넣으면 data.txt:

[RecordUUID.1]
"Variable1Key"="Variable1Value"
"Variable2Key"="Variable2Value"
"Variable3Key"="Variable3Value"

[RecordUUID.4]
"Variable1Key"="Variable1Value"
"Variable5Key1"="Variable51Value1"
"Variable5Key1"="Variable51Value2"
"Variable5Key2"="Variable52Value1"
"Variable5Key2"="Variable52Value2"

그런 다음 스크립트를 실행합니다.

user@host:~$ python transform.py data.txt

그러면 다음과 같은 결과가 나옵니다:

<?xml version="1.0" ?>
<root>
    <RecordUUID.1>
        <Variable1Key>Variable1Value</Variable1Key>
        <Variable2Key>Variable2Value</Variable2Key>
        <Variable3Key>Variable3Value</Variable3Key>
    </RecordUUID.1>
    <RecordUUID.4>
        <Variable1Key>Variable1Value</Variable1Key>
        <Variable5Key1>Variable51Value1</Variable5Key1>
        <Variable5Key1>Variable51Value2</Variable5Key1>
        <Variable5Key2>Variable52Value1</Variable5Key2>
        <Variable5Key2>Variable52Value2</Variable5Key2>
    </RecordUUID.4>
</root>

관련 정보