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