저는 (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>