Importare TXT delimitato da spazi

di il
34 risposte

34 Risposte - Pagina 2

  • Re: Importare TXT delimitato da spazi

    Arrivato

  • Re: Importare TXT delimitato da spazi

    Ho buttato giù un piccolo programmino, ho elaborato il file che mi hai dato, e i risultati delle medie (globali) sono:
    F11 = 432.20
    F22 = 205.88
    F12 = -38.38
    FMax = 0
    FMin = 0
    M11 = 23.94
    M22 = 81.61
    M12 = 11.64
    eccetera eccetera, sono corretti ??

    il tempo di elaborazione (su un computer di media potenza, niente di chè) è stato di 5,6 secondi

  • Re: Importare TXT delimitato da spazi

    Scusami, non mi sono spiegato bene..
    nella colonna AREA ho circa 1200 valori univoci

    nella colonna Outpucase ne ho 169

    prima filtro la colonna area per ogni valore univoco e poi filtro per la colonna outputcase

    calcolo la media dei valori che hanno  area=F_EL_1 e outputcase = LC_SLU_01 e calcolo la media per ogni colonna solo dei valori filtrati ( in questo caso 6 righe)

    poi filtro per LC_SLU_02

     e così via..
    poi ricomincio per il prossimo valore di area e rifaccio sempre la stessa cosa…

  • Re: Importare TXT delimitato da spazi

    E impiega una 40 di minuti circa

  • Re: Importare TXT delimitato da spazi

    Ecco una parte del risultato, dimmi se i valori calcolati sono giusti (tempo di elaborazione 130 secondi)

    F_EL_1     LC_SLU_01  F11       78,3
    F_EL_1     LC_SLU_01  F12      -16,7
    F_EL_1     LC_SLU_01  F22      -26,9
    F_EL_1     LC_SLU_01  FAngle     0,0
    F_EL_1     LC_SLU_01  FMax       0,0
    F_EL_1     LC_SLU_01  FMin       0,0
    F_EL_1     LC_SLU_01  FVM        0,0
    F_EL_1     LC_SLU_01  M11      -75,4
    F_EL_1     LC_SLU_01  M12       67,8
    F_EL_1     LC_SLU_01  M22       35,8
    F_EL_1     LC_SLU_01  MAngle     0,0
    F_EL_1     LC_SLU_01  MMax       0,0
    F_EL_1     LC_SLU_01  MMin       0,0
    F_EL_1     LC_SLU_01  V13       21,7
    F_EL_1     LC_SLU_01  V23       42,7
    F_EL_1     LC_SLU_01  VAngle     0,0
    F_EL_1     LC_SLU_01  VMax       0,0
    F_EL_1     LC_SLU_02  F11       75,2
    F_EL_1     LC_SLU_02  F12      -16,4
    F_EL_1     LC_SLU_02  F22      -26,3
    F_EL_1     LC_SLU_02  FAngle     0,0
    F_EL_1     LC_SLU_02  FMax       0,0
    F_EL_1     LC_SLU_02  FMin       0,0
    F_EL_1     LC_SLU_02  FVM        0,0
    F_EL_1     LC_SLU_02  M11      -76,8
    F_EL_1     LC_SLU_02  M12       66,7
    F_EL_1     LC_SLU_02  M22       33,6
    F_EL_1     LC_SLU_02  MAngle     0,0
    F_EL_1     LC_SLU_02  MMax       0,0
    F_EL_1     LC_SLU_02  MMin       0,0
    F_EL_1     LC_SLU_02  V13       24,7
    F_EL_1     LC_SLU_02  V23       47,9
    F_EL_1     LC_SLU_02  VAngle     0,0
    F_EL_1     LC_SLU_02  VMax       0,0
    
    
  • Re: Importare TXT delimitato da spazi

    Ciao…si sono corrette, come quelle che tiro fuori io con questo procedimento:

    Sono riuscito anche a fare l'import come dicevate con un numero fisso di caratteri in modo da funzionare sempre

    Tu segui lo stesso procedimento? hai impiegato 137 secondi per fare queste due combinazioni o per farle tutte?

    Dim UniqueAREA As System.Collections.Generic.List(Of String) = ((From T In TXT_Datatable.AsEnumerable() Select T.Field(Of String)("Area")).Distinct()).OrderBy(Function(s) s).ToList()
    Dim UniqueCASE As System.Collections.Generic.List(Of String) = ((From T In TXT_Datatable.AsEnumerable() Select T.Field(Of String)("OutputCase")).Distinct()).OrderBy(Function(s) s).ToList()
    
    For Each TXT_AREA As String In UniqueAREA
    
        For Each TXT_OUTPUTCASE As String In UniqueCASE
            Dim filterstr As String = "Area = " & "'" & TXT_AREA & "' " & "AND " & "Outputcase = " & "'" & TXT_OUTPUTCASE & "'"
              	Dim F11_Media As Double = TXT_Datatable.Compute("Avg(F11)", filterstr)
      			Dim F22_Media As Double = TXT_Datatable.Compute("Avg(F22)", filterstr)
      			Dim F12_Media As Double = TXT_Datatable.Compute("Avg(F12)", filterstr)
      			Dim FMax_Media As Double = TXT_Datatable.Compute("Avg(FMax)", filterstr)
      			Dim FMin_Media As Double = TXT_Datatable.Compute("Avg(FMin)", filterstr)
      			Dim FAngle_Media As Double = TXT_Datatable.Compute("Avg(FAngle)", filterstr)
      			Dim FVM_Media As Double = TXT_Datatable.Compute("Avg(FVM)", filterstr)
      			Dim M11_Media As Double = TXT_Datatable.Compute("Avg(M11)", filterstr)
      			Dim M22_Media As Double = TXT_Datatable.Compute("Avg(M22)", filterstr)
      			Dim M12_Media As Double = TXT_Datatable.Compute("Avg(M12)", filterstr)
      			Dim MMax_Media As Double = TXT_Datatable.Compute("Avg(MMax)", filterstr)
      			Dim MMin_Media As Double = TXT_Datatable.Compute("Avg(MMin)", filterstr)
      			Dim MAngle_Media As Double = TXT_Datatable.Compute("Avg(MAngle)", filterstr)
      			Dim V13_Media As Double = TXT_Datatable.Compute("Avg(V13)", filterstr)
      			Dim V23_Media As Double = TXT_Datatable.Compute("Avg(V23)", filterstr)
      			Dim VMax_Media As Double = TXT_Datatable.Compute("Avg(VMax)", filterstr)
      			Dim VAngle_Media As Double = TXT_Datatable.Compute("Avg(VAngle)", filterstr)
      	next
    next
  • Re: Importare TXT delimitato da spazi

    04/01/2024 - hantrax ha scritto:


    Tu segui lo stesso procedimento? hai impiegato 137 secondi per fare queste due combinazioni o per farle tutte?


    No, ho seguito un procedimento completamente diverso
    137 secondi per farle tutte

  • Re: Importare TXT delimitato da spazi

    Sono un autodidatta.. quello che ho  fatto è già un gran passo avanti per me

    ma  posso chiederti che procedimento utilizzi? che lo studio?

  • Re: Importare TXT delimitato da spazi

    In modo sintetico:
    1) apro il file usando un oggetto StreamReader
    2) elimino le prime righe che non servono
    3) faccio un ciclo Do…Loop leggendo riga per riga il file TXT usando StreamReader.ReadLine,
    e per ogni riga mi calcolo il codice Area e il codice OutputCase per capire di quale “gruppo” fa parte.
    Creo una voce su di un dizionario tenendo quindi conto, gruppo per gruppo, il conteggio e, variabile per variabile, la somma
    (detto così sembra difficile ma in termini di programma sono poche righe)
    Una volta che ho letto tutte le righe mi ritrovo un dizionario con tutti i conteggi.
    A questo punto prendo riga per riga del dizionario, prendo la somma e la divido per il suo conteggio relativo e ho la media.

    Il tuo sistema funziona, sia chiaro, però il mio sistema legge solo una volta tutte le righe, mentre tu, una volta che hai creato il DataTable, per ogni media che devi fare si deve comunque rileggere tutte le righe per poter applicare il filtro, ed è proprio lì che secondo me ci mette tanto tempo.
    I dizionari sono ottimizzati proprio per una velocità su ricerche ed estrazione dati, poichè si basano su degli indici univoci, sono derivati dalle HashTable

    P.S.: hai creato gli indici sul campo Area e Outputcase ??

  • Re: Importare TXT delimitato da spazi

    Certo 137 secondi sono una bella differenza…

    provo a vedere come funzionano i dizionari..

  • Re: Importare TXT delimitato da spazi

    Ho visto che il dizionario si crea con due voci

    Dim source = New Dictionary(Of String, String)

    quindi una chiave e il valore

    ti trovi il valore area e outputcase, ma inserisci questi due nel dizionario? non capisco dove inserisci i valori che leggi…

    o crei un dizionario per ogni colonna da calcolare?

  • Re: Importare TXT delimitato da spazi

    Ho definito il dizionario

    Dim risultati = New Dictionary(Of String, Double)

    Dove la chiave la costruisco, ad esempio “F_EL_1 LC_SLU_01 F11”, mentre il valore contiene la somma.


    Su un altro dizionario ho il conteggio di quanti valori leggo, con chiave ad esempio “F_EL_1 LC_SLU_01”

    Alla fine della creazione dei due dizionari, eseguo tutte le divisioni per calcolare la media

  • Re: Importare TXT delimitato da spazi

    Alla chiave ci ero quasi arrivato..ma non avevo pensato che potevo inserire nel dizionario tutte le somme delle colonne…pensavo di creare un dizionario per ogni colonna

    ma avrebbe senso creare una struttura di dati con tutte le colonne tipo e poi definire il dizionario con 

     Dim Totali As New Dictionary(Of String, Riga)??

     Public Structure Riga
    
         Public Area As String
         Public Output As String
    
    .....
     End Structure
     
  • Re: Importare TXT delimitato da spazi

    Allora..ho scritto questo codice…

    ma impiega circa 10 minuti per popolare i dictionary…

         Dim lst_NomiCOL As New List(Of String)
    
         'Read the contents of the textfile into an array
         Dim column_count As Integer = 0
         Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(filename)
    
             lst_intest.Add(MyReader.ReadLine())
             lst_intest.Add(MyReader.ReadLine())
             lst_intest.Add(MyReader.ReadLine())
             lst_intest.Add(MyReader.ReadLine())
             lst_intest.Add(MyReader.ReadLine())
             lst_intest.Add(MyReader.ReadLine())
    
             For Each col As String In lst_intest(4).Split({delimiter}, StringSplitOptions.RemoveEmptyEntries)
                 If header Then
                     'If there's a header then add it by it's name
    
                     lst_NomiCOL.Add(col)
                 End If
    
             Next
    
    
             MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.FixedWidth
             MyReader.SetFieldWidths(12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12)
             'MyReader.Delimiters = New String() {Space(1)}
             Dim currentRow As String()
             'Loop through all of the fields in the file. 
             'If any lines are corrupt, report an error and continue parsing. 
    
             'Dim Totali As New Dictionary(Of String, Riga)
             Dim dic_Totali As New SortedDictionary(Of String, Double)
             Dim dic_chiavi As New SortedDictionary(Of String, Integer)
    
    
    
    
             While Not MyReader.EndOfData
                 Try
    
                     currentRow = MyReader.ReadFields()
    
    
                     If currentRow(0).Equals("") = False Then 'controllo se la riga non è vuota
    
                         For x = 7 To 23
    
                             Dim str_Chiave As String = currentRow(0) & "|" & currentRow(4) & "|" & lst_NomiCOL(x) ' creo una chiave composta da area|combinazione|colonna
    
                             Dim int_ContatoreChiave As Integer = Nothing
                             Dim dbl_TotCella As Double = Nothing
    
                             If dic_chiavi.TryGetValue(str_Chiave, int_ContatoreChiave) Then 'controllo se nel dic chiavi esiste la chiave corrente
    
                                 dic_chiavi(str_Chiave) = int_ContatoreChiave + 1
    
                                 If dic_Totali.TryGetValue(str_Chiave, dbl_TotCella) Then dic_Totali(str_Chiave) = dbl_TotCella + currentRow(x)
    
    
    
                             Else 'non esiste e aggiungo il valore e incremento il contatore
    
                                 dic_chiavi(str_Chiave) = 1
                                 dic_Totali.Add(str_Chiave, currentRow(x))
    
                             End If
    
                         Next
    
                     End If
    
                     ' Include code here to handle the row.
                 Catch
                     MessageBox.Show("errore")
                 End Try
             End While
  • Re: Importare TXT delimitato da spazi

    Aspetta un attimo che ti ottimizzo il codice e poi te lo passo

Devi accedere o registrarti per scrivere nel forum
34 risposte