Importare TXT delimitato da spazi

di il
34 risposte

34 Risposte - Pagina 3

  • Re: Importare TXT delimitato da spazi

    Ho ottimizzato il codice, aggiungendo una List(Of String) di appoggio, e sullo stesso PC che prima ci metteva 135 secondi adesso ci mette 22 secondi
    Crea un form e metteci una bella label, poi ……

    Imports System.Collections.Specialized
    
    
    Public Class Form1
    
        Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Shown
    
            Label1.TextAlign = ContentAlignment.MiddleRight
    
            Dim swTot = Stopwatch.StartNew
    
            Dim campi = New Dictionary(Of String, Integer) ' dizionario che contiene la lista delle variabili con il relativo offset nella stringa
            campi.Add("F11", 85)
            campi.Add("F22", 97)
            campi.Add("F12", 109)
            campi.Add("FMax", 121)
            campi.Add("FMin", 133)
            campi.Add("FAngle", 145)
            campi.Add("FVM", 157)
            campi.Add("M11", 169)
            campi.Add("M22", 181)
            campi.Add("M12", 193)
            campi.Add("MMax", 205)
            campi.Add("MMin", 217)
            campi.Add("MAngle", 229)
            campi.Add("V13", 241)
            campi.Add("V23", 253)
            campi.Add("VMax", 265)
            campi.Add("VAngle", 277)
    
            Dim risultati = New Dictionary(Of String, Double) ' dizionario dei risultati (somma dei valori)
            Dim conteggi = New Dictionary(Of String, Integer) ' dizionario dei "count"
            Dim listaChiavi = New List(Of String) ' lista delle chiavi in ordine
    
            Dim fp = New StreamReader("c:\vbn\test\prova_media.txt")
    
            Dim nRighe = 0
            Do Until (fp.EndOfStream)
                If nRighe Mod 100000 = 0 Then
                    Label1.Text = "Reading " & nRighe.ToString("#,###,##0")
                    Label1.Refresh()
                    Application.DoEvents()
                End If
    
                Dim dati = fp.ReadLine
                If Not dati.TrimStart.StartsWith("F_EL_") Then Continue Do ' tolgo le righe non necessarie
    
                nRighe += 1
    
                Dim Area = dati.Substring(1, 11).Trim
                Dim OutputCase = dati.Substring(49, 11).Trim
    
                If Not conteggi.ContainsKey(Area & "|" & OutputCase) Then
                    conteggi.Add(Area & "|" & OutputCase, 0) ' creo la chiave
                    listaChiavi.Add(Area & "|" & OutputCase) ' e lo metto nella lista ordinata
                End If
    
                conteggi(Area & "|" & OutputCase) += 1 ' incremento il contatore
    
                For Each variabile In campi
                    Dim value = Double.Parse(dati.Substring(variabile.Value, 11), Globalization.NumberStyles.Any, Globalization.CultureInfo.InvariantCulture) ' mi estraggo il valore
                    If Not risultati.ContainsKey(Area & "|" & OutputCase & "|" & variabile.Key) Then
                        risultati.Add(Area & "|" & OutputCase & "|" & variabile.Key, 0) ' mi creo la chiave
                    End If
                    risultati(Area & "|" & OutputCase & "|" & variabile.Key) += value ' incremento il valore
                Next
    
            Loop
    
            fp.Close()
            fp.Dispose()
    
            ' ------------------------------------------------------------
    
            ' scrivo i risultati
            Dim fpOut = New StreamWriter(My.Computer.FileSystem.SpecialDirectories.Desktop & "\result.txt")
    
            nRighe = 0
            For Each chiave In listaChiavi
                If nRighe Mod 10000 = 0 Then
                    Label1.Text = "Writing " & nRighe.ToString("#,###,##0")
                    Label1.Refresh()
                    Application.DoEvents()
                End If
                nRighe += 1
                For Each campo In campi
                    Dim somma = risultati(chiave & "|" & campo.Key)
                    Dim conteggio = conteggi(chiave)
                    Dim dati = chiave.Split("|"c)
                    fpOut.WriteLine(dati(0).PadRight(11) & dati(1).PadRight(11) & campo.Key.PadRight(6) & (somma / conteggio).ToString("#,##0.0").PadLeft(8))
                Next
            Next
    
            fpOut.Close()
            fpOut.Dispose()
    
            swTot.Stop()
            Dim tempo = swTot.ElapsedMilliseconds / 1000
            Label1.Text = "Totale " & tempo.ToString("##0.0") & " secondi"
    
        End Sub
    End Class
    
    
  • Re: Importare TXT delimitato da spazi

    Grazie…..lo confronto con il mio per vedere le differenze..
    sistemo l'output per riadattarlo a come deve riuscire….

  • Re: Importare TXT delimitato da spazi

    Grazie per l'aiuto!!!

    mi hai aperto un mondo sulla gestione di tanti dati che non conoscevo..ero abituato a utilizzare i cicli o avevo trovato il .compute dei datatable.

    Ma il tuo metodo è impressionante come velocità,

    ho adattato il tuo codice nell'esportazione, il txt di uscita è uguale a quello iniziale, ma con le medie..

    gli faccio leggere anche le prime righe di intestazione e le ripropongo nel nuovo file…

        Dim swTot = Stopwatch.StartNew
    
    Dim campi = New Dictionary(Of String, Integer) ' dizionario che contiene la lista delle variabili con il relativo offset nella stringa
    campi.Add("F11", 85)
    campi.Add("F22", 97)
    campi.Add("F12", 109)
    campi.Add("FMax", 121)
    campi.Add("FMin", 133)
    campi.Add("FAngle", 145)
    campi.Add("FVM", 157)
    campi.Add("M11", 169)
    campi.Add("M22", 181)
    campi.Add("M12", 193)
    campi.Add("MMax", 205)
    campi.Add("MMin", 217)
    campi.Add("MAngle", 229)
    campi.Add("V13", 241)
    campi.Add("V23", 253)
    campi.Add("VMax", 265)
    campi.Add("VAngle", 277)
    
    Dim risultati = New Dictionary(Of String, Double) ' dizionario dei risultati (somma dei valori)
    Dim conteggi = New Dictionary(Of String, Integer) ' dizionario dei "count"
    Dim listaChiavi = New List(Of String) ' lista delle chiavi in ordine
    
    Dim fp = New StreamReader(nomeFile)
    
    
    Dim nRighMax As Integer = 0
    
    Dim nRighe = 0
    Do Until (fp.EndOfStream)
        If nRighe Mod 100000 = 0 Then
            'Label2.Text = "Reading " & nRighe.ToString("#,###,##0")
            'Label2.Refresh()
            TextBox_Lette.Text = nRighe.ToString("#,###,##0")
            TextBox_Lette.Refresh()
            Application.DoEvents()
        End If
    
        Dim dati = fp.ReadLine
    
        If Not dati.TrimStart.StartsWith("F_EL_") Then
            lst_intest.Add(dati)
            Continue Do ' tolgo le righe non necessarie
        End If
    
        nRighe += 1
    
        Dim Area = dati.Substring(1, 11).Trim
        Dim OutputCase = dati.Substring(49, 11).Trim
    
        If Not conteggi.ContainsKey(Area & "|" & OutputCase) Then
            conteggi.Add(Area & "|" & OutputCase, 0) ' creo la chiave
            listaChiavi.Add(Area & "|" & OutputCase) ' e lo metto nella lista ordinata
        End If
    
        conteggi(Area & "|" & OutputCase) += 1 ' incremento il contatore
    
        For Each variabile In campi
            Dim value = Double.Parse(dati.Substring(variabile.Value, 11), Globalization.NumberStyles.Any, Globalization.CultureInfo.InvariantCulture) ' mi estraggo il valore
            If Not risultati.ContainsKey(Area & "|" & OutputCase & "|" & variabile.Key) Then
                risultati.Add(Area & "|" & OutputCase & "|" & variabile.Key, 0) ' mi creo la chiave
            End If
            risultati(Area & "|" & OutputCase & "|" & variabile.Key) += value ' incremento il valore
        Next
    
    Loop
    
    nRighMax = nRighe - 6
    
    fp.Close()
    fp.Dispose()
    
    ' ------------------------------------------------------------
    
    ' scrivo i risultati
    Dim fpOut = New StreamWriter(targetName)
    
    For Each Rig In lst_intest
    
        fpOut.WriteLine(Rig)
    
    Next
    
    'Me.ProgressBar_Area.Maximum = listaChiavi.Count
    'Me.ProgressBar_Area.Step = 100000
    nRighe = 0
    For Each chiave In listaChiavi
        If nRighe Mod 10000 = 0 Then
            'Label2.Text = "Writing " & nRighe.ToString("#,###,##0")
            'Label2.Refresh()
            TextBox_Processate.Text = nRighe.ToString("#,###,##0")
            TextBox_Processate.Refresh()
    
            Application.DoEvents()
        End If
        nRighe += 1
    
        Dim dati = chiave.Split("|"c)
        Dim strRiga As String = dati(0).PadLeft(12) & dati(0).PadLeft(12) & "Shell-Thin".PadLeft(12) & "Center".PadLeft(12) & dati(1).PadLeft(12) & "Combination".PadLeft(12) & "Min/Max".PadLeft(12)
    
    
        For Each campo In campi
            Dim somma = risultati(chiave & "|" & campo.Key)
            Dim conteggio = conteggi(chiave)
    
            Dim Media = somma / conteggio
    
            strRiga &= Media.ToString("###0.000").PadLeft(12)
    
    
        Next
    
        fpOut.WriteLine(strRiga) ' scrivo la riga formattata
        'Me.ProgressBar_Area.PerformStep()
        'Me.ProgressBar_Area.Refresh()
        Application.DoEvents()
    Next
    
    fpOut.Close()
    fpOut.Dispose()
    
    swTot.Stop()
    Dim tempo = swTot.ElapsedMilliseconds / 1000
    Label2.Text = "Tempo di Elaborazione " & tempo.ToString("##0.0") & " secondi"
    
    Cursor = Cursors.Default
    MessageBox.Show("Il File TXT è stato salvato nella stessa cartella del file originale con il suffisso ""_Media""")
    Me.Close()
  • Re: Importare TXT delimitato da spazi

    Ottimo !!!
    Tempi di esecuzione ??

  • Re: Importare TXT delimitato da spazi

    Circa 20/22secondi

Devi accedere o registrarti per scrivere nel forum
34 risposte