xml_data_aggregator

Xml 2 xlsx tab
 avatar
user_2065311
python
7 months ago
7.0 kB
2
Indexable
Never
''' 
Название скрипта: "xml_data_aggregator2xlsx"

Описание:
Данный скрипт предназначен для агрегации данных из нескольких XML-файлов, находящихся в выбранной директории. Скрипт определяет заголовки данных, извлекает информацию из XML-файлов и сохраняет ее в удобном формате CSV. Просто выберите директорию с XML-файлами, и скрипт самостоятельно проведет анализ структуры файлов, извлечет данные и создаст CSV-файл для удобного использования.
''' 

import os
import xml.etree.ElementTree as ET
import pandas as pd
from collections import defaultdict
from tkinter import filedialog
from tkinter import Tk

# Создаем окно для выбора директории
root = Tk()
root.withdraw()  # Скрываем окно

# Запрашиваем путь к директории с XML файлами
directory = filedialog.askdirectory(title="Выберите директорию с XML файлами")

if not directory:
    print("Директория не выбрана. Выход из программы.")
    exit()

# Список для хранения данных
data = []

# Шаг 1: Определение заголовков из структуры XML-файлов
headers = set()

for filename in os.listdir(directory):
    if filename.endswith('.xml'):
        file_path = os.path.join(directory, filename)

        # Парсинг XML-файла
        tree = ET.parse(file_path)
        root = tree.getroot()

        # Анализ структуры XML-файла и сбор всех возможных заголовков
        for document in root.findall('.//Документ'):
            headers.update(document.keys())
            for element in document.iter():
                headers.update(element.keys())

headers = list(headers)
print(f"Определенные заголовки: {headers}")

# Шаг 2: Извлечение и сохранение данных из XML-файлов
for filename in os.listdir(directory):
    if filename.endswith('.xml'):
        file_path = os.path.join(directory, filename)

        tree = ET.parse(file_path)
        root = tree.getroot()

        for document in root.findall('.//Документ'):
            record = defaultdict(str)
            for header in headers:
                record[header] = document.get(header, '')
                for element in document.iter():
                    if header in element.keys():
                        record[header] = element.get(header)

            data.append(record)

# Шаг 3: Преобразование данных в DataFrame
df = pd.DataFrame(data)

# Шаг 4: Сохранение данных в CSV файл
output_file = 'aggregated_data_modern_3.csv'
df.to_csv(output_file, index=False, encoding='utf-8-sig')

print(f'Данные успешно сохранены в файл {output_file}')


'''
#нужно обозначить заголовки

import os
import xml.etree.ElementTree as ET
import pandas as pd

# Путь к директории с XML файлами
directory = '/Users/wl/Downloads/≈ Safari/data-20231225-structure-20200408/test'

# Список для хранения данных
data = []

# Шаг 1: Перебор всех файлов в директории
for filename in os.listdir(directory):
    if filename.endswith('.xml'):
        file_path = os.path.join(directory, filename)
        
        # Шаг 2: Парсинг XML файла
        tree = ET.parse(file_path)
        root = tree.getroot()
        
        # Извлечение и сохранение нужных данных из файла
        for document in root.findall('.//Документ'):
            record = {
                'ИдДок': document.get('ИдДок'),
                'ДатаДок': document.get('ДатаДок'),
                'НаимОрг': document.find('.//СведНП').get('НаимОрг'),
                'ИННЮЛ': document.find('.//СведНП').get('ИННЮЛ'),
                'КолРаб': document.find('.//СведССЧР').get('КолРаб'),
            }
            data.append(record)

# Шаг 3: Преобразование данных в DataFrame
df = pd.DataFrame(data)

# Шаг 4: Сохранение данных в CSV файл
output_file = 'aggregated_data.csv'
df.to_csv(output_file, index=False, encoding='utf-8-sig')

print(f'Данные успешно сохранены в файл {output_file}')

'''

'''

# не нужно обозначать заголовки, определяет автоматически

import os
import xml.etree.ElementTree as ET
import pandas as pd
from collections import defaultdict

# Путь к директории с XML файлами
directory = '/Users/wl/Downloads/≈ Safari/data-20231225-structure-20200408/test'

# Список для хранения данных
data = []

# Шаг 1: Определение заголовков из структуры XML-файлов
headers = set()

for filename in os.listdir(directory):
    if filename.endswith('.xml'):
        file_path = os.path.join(directory, filename)

        # Парсинг XML-файла
        tree = ET.parse(file_path)
        root = tree.getroot()

        # Анализ структуры XML-файла и сбор всех возможных заголовков
        for document in root.findall('.//Документ'):
            headers.update(document.keys())
            for element in document.iter():
                headers.update(element.keys())

headers = list(headers)
print(f"Определенные заголовки: {headers}")

# Шаг 2: Извлечение и сохранение данных из XML-файлов
for filename in os.listdir(directory):
    if filename.endswith('.xml'):
        file_path = os.path.join(directory, filename)

        tree = ET.parse(file_path)
        root = tree.getroot()

        for document in root.findall('.//Документ'):
            record = defaultdict(str)
            for header in headers:
                record[header] = document.get(header, '')
                for element in document.iter():
                    if header in element.keys():
                        record[header] = element.get(header)

            data.append(record)

# Шаг 3: Преобразование данных в DataFrame
df = pd.DataFrame(data)

# Шаг 4: Сохранение данных в CSV файл
output_file = 'aggregated_data_modern.csv'
df.to_csv(output_file, index=False, encoding='utf-8-sig')

print(f'Данные успешно сохранены в файл {output_file}')

'''