Applicazione per leggere dati da fonti diverse

di il
22 risposte

Applicazione per leggere dati da fonti diverse

Buongiorno a tutti. Sto mettendo mani ad una vecchia applicazione scritta in VB.NET con il pattern MVVM. Dopo diversi anni di modifiche sta diventando impegnativo il mantenimento dei diversi Model-ViewModel e mi chiedo se esiste un modo per rendere il tutto più snello. L'applicazione in buona sostanza legge un file strutturato e presenta i dati in un Datagrid. Fin qui tutto normale. Il problema è che il file cambia praticamente ogni 6 mesi e i Model aggiunti sono davvero tanti. I file dati si differenziano per il numero di campi in cui ogni singola riga deve essere divisa. Il Model che utilizzo legge e divide i dati attraverso un TextFieldParser e un array che sfrutta FixedWidth per dividere i singoli campi.

Mi chiedo se l'approccio sia corretto o se sia meglio migliorare il tutto per renderlo più flessibile.

22 Risposte

  • Re: Applicazione per leggere dati da fonti diverse

    Ciao,
    puoi postare 1 esempio di questo tipo di file?
    Per capire la sua struttura ecc ecc...

    Grazie ciao
  • Re: Applicazione per leggere dati da fonti diverse

    Ciao, il file di per se è una sequenza di caratteri, ogni riga si compone di 155 caratteri alfanumerici. La strutturazione viene fatta in fase di lettura. Cerco di semplificare il tutto:

    -Stringa di testo: "0AB00123055ff00CIAO MARE 000100"

    Prima versione dove viene definito un vettore di 7 elementi
    FileReader.FieldWidths = New Integer() {5, 4, 6, 15, 4, 2}
    Risultato: "0AB00-1230-55ff00-CIAO MARE -0001-00"

    Seconda versione in cui viene definito un vettore di 8 elementi
    FileReader.FieldWidths = New Integer() {1,4, 4, 6, 15, 4, 2}
    Risultato: "0-AB00-1230-55ff00-CIAO MARE -0001-00"
    Il risultato viene poi visualizzato in un datagrid in binding con la versione scelta.

    Ho definito un model per ogni versione di vettore con proprietà e funzioni, ma è un lavoro immenso di copia\incolla con modifiche che creano solo un sacco di errori e confusione. Al momento sono arrivato ad avere una cosa tipo 102 model diversi ma molto simili e sta crescendo ancora. Nel pattern MVVM dovrei tenere tutto separato, quindi nella mia View, non potendo fare un'associazione a posteriori, carico tutto nello stesso ViewModel. Spero sia più chiaro adesso.
  • Re: Applicazione per leggere dati da fonti diverse

    jotric ha scritto:


    Mi chiedo se l'approccio sia corretto o se sia meglio migliorare il tutto per renderlo più flessibile.
    Non sarebbe possibile generalizzare il parser affinché le operazioni che compie tramite codice diventino "configurabili"?
    Ad esempio, creando un file JSON oppure XML che contenga la struttura del file da interpretare e le regole da applicare?
  • Re: Applicazione per leggere dati da fonti diverse

    In effetti è quello che mi chiedo, ma volendo restare in ottica MVVM, mi chiedo se con un file di configurazione esterno, sia possibile creare una classe generica con n proprietà generiche da adattare a posteriori una volta scelto il tipo di lettura. Stavo cercando di risolvere con poliformismo, ma in realtà il risultato finale cambia di poco...
  • Re: Applicazione per leggere dati da fonti diverse

    jotric ha scritto:


    In effetti è quello che mi chiedo, ma volendo restare in ottica MVVM, mi chiedo se con un file di configurazione esterno, sia possibile creare una classe generica con n proprietà generiche da adattare a posteriori una volta scelto il tipo di lettura. Stavo cercando di risolvere con poliformismo, ma in realtà il risultato finale cambia di poco...
    Diciamo che da questa risposta, secondo il mio parere, stai cercando di affrontare troppe problematiche allo stesso tempo: un conto è il parsing dei dati, un conto è la proiezione sul modello, un conto è la visualizzazione, un conto è l'architettura delle classi volta a soddisfare queste esigenze. A mio avviso, dovresti osservare una problematica alla volta.

    Comunque credo che la casistica da analizzare sia troppo specifica per poter dare dei suggerimenti che non siano ovviamente troppo astratti e generici.
  • Re: Applicazione per leggere dati da fonti diverse

    Il problema è che il parser codificato oppure salvato in esterno, non risolve il problema o meglio lo sposta. Poi quello che leggo va cmq associato alle proprietà. Correggimi se sbaglio.
  • Re: Applicazione per leggere dati da fonti diverse

    Ciao,
    per capire... come definisci i 7 o 8 vettori? Perché dici che ci sono 7 o 8 elementi nelle stringhe?

    Vedendo come è composta per me ci sono 6 e 7.
    Perché ciao mare definisci 15 caratteri per sono 10.

    Corregimi se sbaglio...

    Ciao
  • Re: Applicazione per leggere dati da fonti diverse

    La stringa ha lunghezza fissa 155 caratteri. In base alla versione di codifica, passo un vettore che la spezza per essere letta.
    Il vettore che viene passato al TextFieldParser è diverso per ogni versione di file. In buona sostanza io ricevo un file di testo con n righe, e una stringa tipo '{14, 14, 3, 1, 14, 3, 3, 3, 2, 4, 2, 1, 12, 9, 3, 9, 12, 1, 7, 1, 8, 2, 8, 6, 2, 2, 50, -1}' che mi divide in numero di campi e lunghezza degli stessi. La stinga cambia con ogni file che mi viene passato.
  • Re: Applicazione per leggere dati da fonti diverse

    Vediamo se ho capito bene, hai sempre una stringa con lunghezza fissa di 155 caratteri.

    Poi hai un tacciato della lunghezza delle "parole". {12, 3, 5,...}. Giusto?

    Questo tracciato che hai varia sempre. Corretto?

    La somma dei numeri che hai tra le graffe non arriva sempre a 155 caratteri. Corretto?

    Diciamo che ogni numero nella graffe è una parola. Ho capito bene?

    Ogni parola la devi esporre in una griglia o tabella. Giusto?

    Ciao
  • Re: Applicazione per leggere dati da fonti diverse

    Ti rispondo fra le righe, ma hai centrato il dunque...

    cali ha scritto:


    Vediamo se ho capito bene, hai sempre una stringa con lunghezza fissa di 155 caratteri.
    In realtà è la lunghezza massima...

    cali ha scritto:


    Poi hai un tacciato della lunghezza delle "parole". {12, 3, 5,...}. Giusto?
    Questo tracciato che hai varia sempre. Corretto?
    Diciamo che ogni numero nella graffe è una parola. Ho capito bene?
    Si esatto...i numeri sono i caratteri da leggere e compongono una parola

    cali ha scritto:


    La somma dei numeri che hai tra le graffe non arriva sempre a 155 caratteri. Corretto?
    Esatto il "-1 " indentifica il fine linea.

    cali ha scritto:


    Ogni parola la devi esporre in una griglia o tabella. Giusto?
    Ovviamente il file si compone di n righe che poi vengono esposte su una griglia.Tutte le righe del file vanno divise con il tracciato assegnato per quel file.
  • Re: Applicazione per leggere dati da fonti diverse

    Ciao,
    io farei così, siccome hai la lunghezza dei caratteri, ad ogni lunghezza estrai la parola.

    Esempio {5, 8, 9, 12,...., -1}

    Da 1 a 5 è una parola, la seconda è da 5 + 8, la terza sarà da 5+8+9 e così via. Ovviamente controlla se il numero successivo è -1. Se si vai a capo.

    Può andare?

    Ciao
  • Re: Applicazione per leggere dati da fonti diverse

    Ciao

    Non capisco una cosa...
    Nella richiesta originale parli di diversi model/view-model che sono cresciuti nel tempo.
    Però poi parli di un qualcosa di sempre uguale:
    • Un file di testo coi dati
    • Una stringa (altro file di testo?) con cui viene specificato come suddividere il file del punto precedente in tante parole
    Detta così a me pare tanto che ti basti una sola classe che riceve in input la stringa con le dimensioni delle parole e in output riporti le parole estratte.

    Invece tu parli di avere tanti metodi/classi... Dove sto sbagliando?
    Puoi postare almeno due di queste classi per far capire meglio come stai affrondando il discorso?
  • Re: Applicazione per leggere dati da fonti diverse

    cali ha scritto:


    Ciao,
    io farei così, siccome hai la lunghezza dei caratteri, ad ogni lunghezza estrai la parola.

    Esempio {5, 8, 9, 12,...., -1}

    Da 1 a 5 è una parola, la seconda è da 5 + 8, la terza sarà da 5+8+9 e così via. Ovviamente controlla se il numero successivo è -1. Se si vai a capo.

    Può andare?

    Ciao
    L'applicazione funziona proprio così. In base alla divisione stringa, legge parola per parola e popola le proprietà di una classe. Ogni singola riga diventa, scomposta nelle parole, il record di un datagrid.
  • Re: Applicazione per leggere dati da fonti diverse

    PiGi78 ha scritto:


    Ciao

    Non capisco una cosa...
    Nella richiesta originale parli di diversi model/view-model che sono cresciuti nel tempo.
    Però poi parli di un qualcosa di sempre uguale:
    • Un file di testo coi dati
    • Una stringa (altro file di testo?) con cui viene specificato come suddividere il file del punto precedente in tante parole
    Detta così a me pare tanto che ti basti una sola classe che riceve in input la stringa con le dimensioni delle parole e in output riporti le parole estratte.

    Invece tu parli di avere tanti metodi/classi... Dove sto sbagliando?
    Puoi postare almeno due di queste classi per far capire meglio come stai affrondando il discorso?
    Di uguale c'è solo la logica. Ogni singolo formato di spezzettamento è un model a se.
    Come ho scritto,
    -vettore 1{14,14,3,8,14,50,-1}
    -vettore 2{14,14,3,8,7,4,3,50,-1}
    I due vettori sono diversi per cui ogni vettore viene rappresentato da un diverso Model. Ogni model ha il suo ViewModel. Nel tempo i formati di divisione sono diventati tanti e volevo modificare il tutto per rendere il codice più semplice creando un qualcosa che ereditasse da una classe base le differenze. La logica a prescindere dal model è la stessa.
Devi accedere o registrarti per scrivere nel forum
22 risposte