Problema programma python che converte da XML a CSV

di il
3 risposte

Problema programma python che converte da XML a CSV

Ciao, mi servirebbe aiuto a completare questo programma. Il programma dovrebbe prendere da una cartella contenente molteplici fatture in formato .XML, leggerli e infine scrivere su un file CSV degli specifici campi che vengono estratti da ogni file (Descrizione, Quantità, Prezzo Unitario e Prezzo Totale).  Ogni file può contenere uno o più prodotti quindi da ogni file .XML potrebbe essere che bisogna estrarre più righe; il programma che ho adesso funziona parzialmente nel senso che legge correttamente i file ma quando arriva a scrivere i dati estratti nel file CSV finale invece che scrivermi i dati di ogni prodotto in riga me li scrive in colonna e se il file contiene più di un prodotto i seguenti li scrive sempre in colonna però nella cella successiva all'ultimo prodotto. Allego l'immagine di come vorrei che scrivesse e di come scrive attualmente il programma, ho anche aggiunto un valore con scritto il numero di fattura per chiarire quale prodotto è di quale fattura ma il programma non lo scrive in realtà.

ATTUALE:

CORRETTO:

import os
import csv
import xml.etree.ElementTree as ET


def leggi_file(folder_path):
    data = []
    for filename in os.listdir(folder_path):
        if filename.endswith(".xml"):
            file_path = os.path.join(folder_path, filename)
            tree = ET.parse(file_path)
            root = tree.getroot()

            descrizione = [element.text for element in root.findall(".//Descrizione")]
            data.append(descrizione)
            quantita = [element.text for element in root.findall(".//Quantita")]
            data.append(quantita)
            prezzo = [element.text for element in root.findall(".//PrezzoUnitario")]
            data.append(prezzo)
            prezzototale = [element.text for element in root.findall(".//PrezzoTotale")]
            data.append(prezzototale)

    return data

def write_to_csv(data, output_file):
    with open(output_file, 'w', newline='') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerows(data)


folder_path = (r"C:\Users\Desktop\XML")

data = leggi_file(folder_path)

output_file = (r"C:\Users\Desktop\XML\output.csv")

write_to_csv(data, output_file)

print("Esecuzione avvenuta con successo. I valori sono stati scritti in", output_file)

3 Risposte

  • Re: Problema programma python che converte da XML a CSV

    Mancando i file XML di esempio, l'unica cosa che posso dirti è che ci sono alcune cose che non mi convincono.

    Quando iteri sugli XML, metti tutti i valori di uno stesso tipo in un array. Quindi se file1.xml ha Gelato, 1, 2, 2, Caffè, 2, 1.5, 3 tu avrai un array ‘data’ fatto così:

    [['Gelato','Caffè'],[1,2],[2,1.5],[2,3]]

    Se il CSV ha le intestazioni (esplicite o implicite), ogni colonna in teoria è omogenea, quindi dovresti avere una colonna Descrizione, una Quantità, ecc. Ma con il tuo array avrai un CSV fatto così:

    GelatoCaffè
    12
    21.5
    23

    Che non è quello che volevi…

    Quello che volevi è (penso) questo:

    Gelato122
    Caffè21.53

    Per ottenere questo risultato devi iterare sugli XML in modo diverso, per ottenere questo array:

    [['Gelato', 1, 2, 2], ['Caffè', 2, 1.5, 3]]

    Con questa modifica dovresti risolvere il 95% dei tuoi problemi. Il restante 5% sarà composto dalle ‘varie ed eventuali’ che si intravedono nei tuoi screenshot, ma che per ora facciamo finta non esistano.

  • Re: Problema programma python che converte da XML a CSV

    Al limite, la soluzione e' fare la TRASPOSTA dei dati cosi' raccolti

  • Re: Problema programma python che converte da XML a CSV

    05/07/2023 - Andrea Quaglia ha scritto:


    Mancando i file XML di esempio, l'unica cosa che posso dirti è che ci sono alcune cose che non mi convincono.

    Quando iteri sugli XML, metti tutti i valori di uno stesso tipo in un array. Quindi se file1.xml ha Gelato, 1, 2, 2, Caffè, 2, 1.5, 3 tu avrai un array ‘data’ fatto così:

    [['Gelato','Caffè'],[1,2],[2,1.5],[2,3]]

    Se il CSV ha le intestazioni (esplicite o implicite), ogni colonna in teoria è omogenea, quindi dovresti avere una colonna Descrizione, una Quantità, ecc. Ma con il tuo array avrai un CSV fatto così:

    GelatoCaffè
    12
    21.5
    23

    Che non è quello che volevi…

    Quello che volevi è (penso) questo:

    Gelato122
    Caffè21.53

    Per ottenere questo risultato devi iterare sugli XML in modo diverso, per ottenere questo array:

    [['Gelato', 1, 2, 2], ['Caffè', 2, 1.5, 3]]

    Con questa modifica dovresti risolvere il 95% dei tuoi problemi. Il restante 5% sarà composto dalle ‘varie ed eventuali’ che si intravedono nei tuoi screenshot, ma che per ora facciamo finta non esistano.

    06/07/2023 - migliorabile ha scritto:


    Al limite, la soluzione e' fare la TRASPOSTA dei dati cosi' raccolti


    Vi ringrazio molto dell'aiuto. Capisco che senza i file XML annessi non era molto d'aiuto ma avevano troppi dati sensibili.

Devi accedere o registrarti per scrivere nel forum
3 risposte