Converter / importar arquivo simples com vários registros, uma variável por linha

2

Estou procurando uma maneira eficiente de usar ferramentas de linha de comando (UNIX) para ler um arquivo simples em um banco de dados (ny), talvez depois de convertê-lo para um formato estruturado intermediário, por exemplo, XML ou csv. O arquivo simples possui vários registros, com linhas contendo cada uma, uma única chave e valor, como a seguir. O número de variáveis pode variar entre os registros e seus números, e os nomes são conhecidos somente após a leitura do arquivo de entrada. (Outra complicação é que pode haver algum aninhamento de variáveis repetidas, mas isso pode ser ignorado por enquanto).

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

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

Eu verifiquei as respostas dadas para transformar linhas em colunas e outras respostas neste site, mas nenhuma delas parecia se encaixar. O problema parece semelhante a ler arquivos INI ou VCARD, mas não consegui encontrar uma solução genérica; uma transformação XSL pode ser concebível, mas não foi encontrada. Quaisquer ponteiros seriam mais que bem-vindos, obrigado.

    
por Gilles 24.07.2015 / 14:34

1 resposta

0

Não sei exatamente o que você está procurando como um resultado final, mas aqui está um script Python que converterá seus dados em XML:

#!/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"))

Se colocarmos os seguintes dados (ou seja, os dados de exemplo da sua pergunta) em um arquivo chamado data.txt :

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

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

E, em seguida, execute o script:

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

Em seguida, obtemos a seguinte saída:

<?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>
    
por 10.12.2017 / 00:52