Conteggio totale numeri uguali

di il
13 risposte

Conteggio totale numeri uguali

 Buongiorno ho due file da confrontare e trovare la somma totale dei numeri corrispondenti 
 file1      file2
 1;          1;
 2;          1;
 3;          1;
 4;          2;
             2; 
             3;
             4;
             4;
   risultato 1=3   2=2  3=1  4=2
         mi rendo conto di aver scritto un codice non funzionante e semplicistico ma non riesco a pensare un giusto approccio
          da trasformare in codice un consiglio?  Uso VB.net 2010    grazie di tutto
                                       
         For Each trovanumero As String In System.IO.File.ReadAllLines("c:\Archivio\file1.txt")
         dim s() as string
            s = Split(trovanumero, ";")
            Dim numero As String
            numero = s(0)
            For Each trova As String In System.IO.File.ReadAllLines("c:\Archivio\file2.txt")
                s = Split(trova, ";")
                Dim numerouguale As String
                numerouguale = s(0)
                If numero = numerouguale Then
                    Dim conta As Integer
                    conta = "0"
                    conta += 1
                    dim dati as integer
                    dati = conta.ToString
                    Dim aggiorna As IO.StreamWriter
                    aggiorna = IO.File.AppendText("c:\Archivio\risultato .txt")
                    aggiorna.WriteLine(numero & ";" & dati)
                    aggiorna.Close()
                End If
            Next
        Next
        
        

13 Risposte

  • Re: Conteggio totale numeri uguali

    Immagino intendessi le occorrenze dei numeri nel primo file. In base al tuo esempio: tre volte l'1, due volte il 2, una volta il 3, due volte il 4.

    Posso consigliarti solo un approccio di tipo logico, non masticando VB, che utilizza un vettore come struttura di appoggio, inizialmente con gli elementi tutti a zero.
    Quando scorri gli elementi del secondo file, ogni volta che incontri un dato numero aumenti di uno il valore corrispondente all'elemento di indice pari al numero trovato:

    file  vettore
    1      v[1] = 3
    2      v[2] = 2
    2      v[3] = 2
    1      v[4] = 1
    3
    3
    1
    4

    Tutto questo se i numeri del primo file non sono grandi, esempio tutti inferiori al 100 o giù di lì, perchè con l'approccio suggerito bisogna prevedere un vettore con un numero di elementi almeno pari al valore max contenuto nel primo file.

  • Re: Conteggio totale numeri uguali

    Se il tuo codice funziona ok, è una bella soddisfazione per te, però tieni conto che per un volume di numeri grande è assolutamente inefficiente, soprattutto per il fatto che il file2 lo apri e lo scansioni per ogni numero di file1

    La soluzione di Euscar è buona, ma come ha detto anche lui non è validissima per numeri alti poichè crea un array sovradimensionato.
    Eccoti come farei io, usando un Dictionary, probabilmente anche questa non è la soluzione migliore, ma non ci ho pensato più di tanto.
    Il file2.txt viene letto una volta sola e viene creato un Dictionary (o chiamata anche Map)
    Ovviamente poi il file risultato lo puoi formattare come vuoi tu, io ho fatto solo un esempio

            Dim dict = New Dictionary(Of Integer, Integer)
    
            ' faccio la scansione di file2.txt e mi creo una mappa
            For Each trova As String In System.IO.File.ReadAllLines("c:\Archivio\file2.txt")
                Dim num = Integer.Parse(trova.Replace(";", ""))
                If dict.ContainsKey(num) Then
                    dict(num) += 1
                Else
                    dict.Add(num, 1)
                End If
            Next
    
            ' ora, in base a file1.txt estraggo solo i dati che mi interessano
            Dim sb = New System.Text.StringBuilder
            For Each trovanumero As String In System.IO.File.ReadAllLines("c:\Archivio\file1.txt")
                Dim num = Integer.Parse(trovanumero.Replace(";", ""))
                If dict.ContainsKey(num) Then
                    sb.Append(num.ToString).Append("=").AppendLine(dict(num).ToString)
                Else
                    sb.Append(num.ToString).Append("=").AppendLine("0")
                End If
            Next
            My.Computer.FileSystem.WriteAllText("c:\Archivio\risultato.txt", sb.ToString, True)
    
  • Re: Conteggio totale numeri uguali

    Grazie Sirio ma ancora sembra che non ci siamo il risultato di questo codice non è quello sperato  
    
    si può anche semplificare la cosa perché posso lavorare solo su due file che hanno numeri e basta che possono arrivare 
     da 1 fino a 350
    
    file1 file2 
    
    1       1
    
    2       1
    3       1
    4       2
    350
            2
    
            3
    
            4
            
            350
            350
     oppure semplicemente lavorare su unico file che penso sia la soluzione migliore contando i numeri uguali in progressione  
     1
     1
     1
     2
     2
     3
     4
     4
     .
     .
     350
     350
     soluzione 1=3   2=2  3=1 4=2 arrivando fino a 350=2 
    ma purtroppo non riesco proprio a trovare codice giusto per farlo 
  • Re: Conteggio totale numeri uguali

    Un algoritmo per controllare velocemente i due file richiede che questi siano ordinati (quindi qualora non lo siano si impiega un “sort”); dopodiché si controlla che ciascun dato del primo file sia contenuto nel secondo e può accadere che il dato del primo file sia uguale, minore o maggiore del dato nel secondo file.
    Nel caso di uguaglianza si incrementa il contatore; nel caso di minore si incrementa (sul primo file) la lettura del record mentre nel caso di maggiore si incrementa (sul secondo file) la lettura del record. 
    L'algoritmo è quello classico che viene impiegato per il "merge".
    Ti indico alcuni link che possono fornirti spunti su alcuni aspetti della problematica:
    https://www.includehelp.com/vb-net/sort-an-integer-array-using-merge-sort.aspx
    http://www.vb-helper.com/howto_mergesort.html
    https://www.programmingalgorithms.com/algorithm/merge-sort-iterative/vb-net/
    https://www.mattepuffo.com/blog/articolo/3762-implementare-il-merge-sort-in-vb.net.html
    https://stackoverflow.com/questions/19840692/i-want-to-compare-two-text-files-in-vb-net-to-check-if-there-are-values-that-are
    https://www.vbforums.com/showthread.php?458578-Easiest-and-quick-way-to-check-if-files-are-identical

  • Re: Conteggio totale numeri uguali

    Salve,

    io, una volta che i 2 array siano in memoria, utilizzerei direttamente linq…

    Dim f1() As Integer = {1, 2, 3, 4} ' caricati ad esempio con ReadAllLines e poi split come aggrada...
    Dim f2() As Integer = {1, 1, 1, 1, 2, 2, 2, 3, 4, 4}
    
    For Each item In f1
        Console.WriteLine($"{item} - count in F2: {f2.Count(Function(x) x = item)}")
    Next

    salutoni romangoli
    – 
    Andrea

  • Re: Conteggio totale numeri uguali

    Grazie per le vostre risposte ma forse l'intestazione che ho scritto può  ingannare i numeri sono già ordinati quindi sort è inutile ora cambio intestazione e analizzando il problema si può benissimo eliminare (o usare) file1 a seconda di come vogliamo affrontarlo 

    in realtà devo solo trovare la somma dei numeri uguali da un unico file già ordinati in progressione 1,1,1, 2,2, 3,4,4,4,4,5,      Risultato 1=3   2=2    3=1    4=4    5=1

  • Re: Conteggio totale numeri uguali

    Il codice che ti ho fornito è corretto, sia che usi due file, sia che ne usi uno solo, quindi c'è qualcosa che ti/ci sfugge
    Crea un file2.txt reale con dentro dati reali e mandacelo, perchè così riusciamo a fare prove reali

  • Re: Conteggio totale numeri uguali

    Grazie Sirjo come faccio a mandarlo?

  • Re: Conteggio totale numeri uguali

    Visto che è un file di testo, scrivilo qui su un post, ma non scriverci altro niente così vado meglio a prenderlo

  • Re: Conteggio totale numeri uguali

    1
    1
    1
    1
    1
    2
    2
    3
    3
    4
    5
    5
    5
    6
    6
    6
    7
    7
    7
    8
    8
    8
    8
    9
    9
    9
    9
    9
    10
    10
    10
    11
    11
    13
    14
    14
    14
    14
    15
    15
    15
    15
    16
    16
    16
    16
    17
    17
    17
    18
    18
    18
    18
    18
    19
    19
    19
    20
    20
    20
    21
    22
    22
    22
    23
    24
    24
    24
    24
    25
    25
    25
    29
    29
    29
    30
    31
    31
    32
    32
    32
    33
    33
    34
    35
    35
    35
    36
    36
    36
    36
    38
    38
    39
    40
    41
    41
    41
    42
    43
    43
    44
    45
    45
    45
    46
    46
    47
    48
    48
    49
    49
    50
    50
    51
    51
    52
    53
    53
    54
    54
    55
    55
    55
    55
    56
    56
    57
    57
    57
    57
    58
    59
    59
    60
    60
    61
    61
    62
    62
    63
    63
    64
    64
    65
    65
    65
    66
    66
    67
    68
    68
    68
    69
    69
    69
    69
    70
    70
    70
    71
    72
    72
    72
    72
    73
    73
    73
    74
    74
    75
    75
    76
    76
    76
    76
    76
    77
    78
    78
    78
    78
    79
    80
    80
    83
    84
    84
    85
    85
    86
    86
    86
    86
    87
    87
    87
    87
    87
    88
    89
    90
    90
    90
    90
    91
    92
    92
    93
    94
    94
    94
    95
    96
    96
    97
    99
    100
    100
    101
    102
    102
    103
    104
    105
    105
    105
    105
    105
    105
    106
    107
    107
    108
    109
    110
    110
    110
    112
    113
    113
    114
    114
    115
    115
    116
    116
    116
    116
    117
    117
    117
    117
    118
    119
    119
    121
    122
    123
    123
    123
    123
    123
    124
    124
    124
    125
    126
    127
    128
    129
    130
    130
    131
    132
    132
    133
    133
    135
    136
    136
    137
    137
    138
    139
    141
    141
    142
    142
    142
    142
    142
    143
    143
    144
    144
    144
    145
    145
    146
    146
    147
    147
    148
    148
    148
    149
    149
    150
    150
    151
    151
    152
    152
    153
    153
    155
    156
    157
    157
    157
    158
    158
    159
    160
    160
    160
    162
    162
    163
    163
    164
    165
    165
    165
    165
    166
    166
    166
    167
    167
    167
    167
    168
    168
    168
    168
    169
    169
    169
    169
    170
    170
    170

  • Re: Conteggio totale numeri uguali

    quello sopra è il risultato finale di File2 che ho ridotto tramite codice a semplici numeri in colonna a questo 
    punto dovrei contare i numeri uguali   risultato  1=5   2=2   ….. e cosi via fino all'ultimo questo è il codice
     che porta a file2
     If IO.File.Exists("c:\GestioneArchivio\provvisorio1.txt") Then
                    For 
                    Each trovadafare As String In System.IO.File.ReadAllLines("c:\GestioneArchivio\provvisorio1.txt")
                        s = Split(trovadafare, ";")
                        numero = s(0)
                        For Each trova As String In System.IO.File.ReadAllLines("c:\GestioneArchivio\tutti.txt")
                            s = Split(trova, ";")                        
                            numerouguale = s(0)
                            nome = s(1) 
                            data = s(2)
                            If numero = numerouguale Then
                                    dim dati as string
                                dati = numerouguale        '& ";" & nome & ";" & data
                                Dim aggiornastorico As IO.StreamWriter
                                aggiornastorico = IO.File.AppendText("c:GestioneArchivio\file2.txt")
                                aggiornastorico.WriteLine(dati)
                                RichTextBox1.AppendText(dati & vbCrLf)
                                aggiornastorico.Close()
                            End If
                        Next
                    Next
    End if
  • Re: Conteggio totale numeri uguali

    Ecco il risultato che ho ottenuto:

    1 = 5
    2 = 2
    3 = 2
    4 = 1
    5 = 3
    6 = 3
    7 = 3
    8 = 4
    9 = 5
    10 = 3
    11 = 2
    13 = 1
    14 = 4
    15 = 4
    16 = 4
    17 = 3
    18 = 5
    19 = 3
    20 = 3
    21 = 1
    22 = 3
    23 = 1
    24 = 4
    25 = 3
    29 = 3
    30 = 1
    31 = 2
    32 = 3
    33 = 2
    34 = 1
    35 = 3
    36 = 4
    38 = 2
    39 = 1
    40 = 1
    41 = 3
    42 = 1
    43 = 2
    44 = 1
    45 = 3
    46 = 2
    47 = 1
    48 = 2
    49 = 2
    50 = 2
    51 = 2
    52 = 1
    53 = 2
    54 = 2
    55 = 4
    56 = 2
    57 = 4
    58 = 1
    59 = 2
    60 = 2
    61 = 2
    62 = 2
    63 = 2
    64 = 2
    65 = 3
    66 = 2
    67 = 1
    68 = 3
    69 = 4
    70 = 3
    71 = 1
    72 = 4
    73 = 3
    74 = 2
    75 = 2
    76 = 5
    77 = 1
    78 = 4
    79 = 1
    80 = 2
    83 = 1
    84 = 2
    85 = 2
    86 = 4
    87 = 5
    88 = 1
    89 = 1
    90 = 4
    91 = 1
    92 = 2
    93 = 1
    94 = 3
    95 = 1
    96 = 2
    97 = 1
    99 = 1
    100 = 2
    101 = 1
    102 = 2
    103 = 1
    104 = 1
    105 = 6
    106 = 1
    107 = 2
    108 = 1
    109 = 1
    110 = 3
    112 = 1
    113 = 2
    114 = 2
    115 = 2
    116 = 4
    117 = 4
    118 = 1
    119 = 2
    121 = 1
    122 = 1
    123 = 5
    124 = 3
    125 = 1
    126 = 1
    127 = 1
    128 = 1
    129 = 1
    130 = 2
    131 = 1
    132 = 2
    133 = 2
    135 = 1
    136 = 2
    137 = 2
    138 = 1
    139 = 1
    141 = 2
    142 = 5
    143 = 2
    144 = 3
    145 = 2
    146 = 2
    147 = 2
    148 = 3
    149 = 2
    150 = 2
    151 = 2
    152 = 2
    153 = 2
    155 = 1
    156 = 1
    157 = 3
    158 = 2
    159 = 1
    160 = 3
    162 = 2
    163 = 2
    164 = 1
    165 = 4
    166 = 3
    167 = 4
    168 = 4
    169 = 4
    170 = 3

  • Re: Conteggio totale numeri uguali

     Dim dict = New Dictionary(Of Integer, Integer)
            ' faccio la scansione di file2.txt e mi creo una mappa
            For Each trova As String In System.IO.File.ReadAllLines("c:\Archivio\file2.txt")
                Dim num = Integer.Parse(trova.Replace(";", ""))
                If dict.ContainsKey(num) Then
                    dict(num) += 1
                Else
                    dict.Add(num, 1)
                End If
            Next
            ' ora, in base a file1.txt estraggo solo i dati che mi interessano
            Dim sb = New System.Text.StringBuilder
            For Each trovanumero As String In System.IO.File.ReadAllLines("c:\Archivio\file1.txt")
                Dim num = Integer.Parse(trovanumero.Replace(";", ""))
                If dict.ContainsKey(num) Then
                    sb.Append(num.ToString).Append("=").AppendLine(dict(num).ToString)
                Else
                    sb.Append(num.ToString).Append("=").AppendLine("0")
                End If
            Next
            My.Computer.FileSystem.WriteAllText("c:\Archivio\risultato.txt", sb.ToString, True)
            
            ok grazie Sirjo si è perfettamente funzionante problema risolto 
Devi accedere o registrarti per scrivere nel forum
13 risposte