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()