Cancellare numeri doppi su file txt

di il
13 risposte

Cancellare numeri doppi su file txt

Ho necessita di cancellare da un file txt i numeri che sono uguali
esempio
1 <----------rimane perché non doppio
2 <----------rimane perché non doppio
3 <----------cancellato perché doppio
4 <----------cancellato perché doppio
3 <----------cancellato perché doppio
5 <----------rimane perché non doppio
4 <----------cancellato perché doppio
alla fine il file txt si presenta cosi
1
2
5
questo il codice che ho scritto ma sono completamente fuori strada perché non funziona dove sto sbagliando? grazie di tutto
Dim numero As String
        If IO.File.Exists("c:\archivio\prova1.txt") Then
            For Each trovadoppio As String In System.IO.File.ReadAllLines("c:\archivio\prova1.txt")
                Dim s2() As String
                s2 = Split(trovadoppio, )
                numero = s2(0)
                For Each trova As String In System.IO.File.ReadAllLines("c:\archivio\prova1.txt")
                    Dim numero2 As String
                    Dim doppione As String
                    Dim s22() As String
                    s22 = Split(trova, )
                    numero2 = s22(0)
                    If numero = numero2 Then
                        doppione = (trova)
                        Dim filetesto As String = ("c:\archivio\prova1.txt")
                        Dim ssrc As String = trova
                        Dim flines() As String = System.IO.File.ReadAllLines(filetesto)
                        Dim sw As New System.IO.StreamWriter(filetesto)
                     
                        For i = 0 To flines.Count - 1
                            If Not flines(i).StartsWith(ssrc) Then
                                sw.WriteLine(flines(i))
                            End If
                        Next
                        sw.Close()
                      
                        Dim aggiorna As IO.StreamWriter
                        aggiorna = IO.File.AppendText("c:\archivio\prova1.txt")
                        aggiorna.WriteLine(trova)
                        aggiorna.Close()
                    End If
                Next
            Next
        End If

13 Risposte

  • Re: Cancellare numeri doppi su file txt

    facocero ha scritto:


    Ho necessita di cancellare da un file txt i numeri che sono uguali
    [...]
    questo il codice che ho scritto ma sono completamente fuori strada perché non funziona dove sto sbagliando?
    Se hai la garanzia che il file non sia mai troppo grande e carichi tutto in memoria, come sembra che tu stia facendo, ti è sufficiente dividere il problema in sottoproblemi:
  • Re: Cancellare numeri doppi su file txt

    Ok grazie di tutto
  • Re: Cancellare numeri doppi su file txt

    Secondo me non puoi usare LINQ.Distinct perchè comunque ti ritorna anche il 3 e il 4 che tu non vuoi.
    Ho creato sul desktop un file chiamato "num.txt" e ci ho messo dentro questa roba
    
    1 <----------rimane perché non doppio
    2 <----------rimane perché non doppio
    3 <----------cancellato perché doppio
    4 <----------cancellato perché doppio
    3 <----------cancellato perché doppio
    5 <----------rimane perché non doppio
    4 <----------cancellato perché doppio
    ed ecco il codice che ho usato, mi ritorna correttamente
    1
    2
    5
    
            Dim dati = IO.File.ReadAllLines(My.Computer.FileSystem.SpecialDirectories.Desktop & "\num.txt") ' leggo il file
    
            Dim lst = New Dictionary(Of Integer, Boolean) ' creo il dizionario
    
            For Each dato In dati
                Dim datoInt = Integer.Parse(dato.Substring(0, 1)) ' converto in Integer
                If lst.ContainsKey(datoInt) Then
                    ' esiste già, sarà da escludere
                    lst.Item(datoInt) = False
                Else
                    ' non esiste, lo creo e lo setto come da tenere
                    lst.Add(datoInt, True)
                End If
            Next
    
            ' ora mi ricavo il risultato
            Dim risultato = ""
            For Each entry In lst
                If entry.Value Then
                    risultato &= entry.Key.ToString & Environment.NewLine
                End If
            Next
    
            MessageBox.Show(risultato)
    
    Prova e facci sapere
    Sergio
  • Re: Cancellare numeri doppi su file txt

    SirJo ha scritto:


    Secondo me non puoi usare LINQ.Distinct perchè comunque ti ritorna anche il 3 e il 4 che tu non vuoi.
    In effetti, ho dato per scontato che per "eliminare i doppioni" volesse tenere almeno la prima occorrenza e non ho fatto caso all'esempio. E' possibile comunque condensare tutto in una istruzione LINQ facendo un raggruppamento (Group) ed escludendo (con Where) tutti i gruppi che hanno un Count() maggiore di 2 (e che quindi sono presenti più di una volta sola).

    In questo modo, si eliminano anche i duplicati.
    
    rows = rows _
    	.GroupBy(Function (w) w) _
    	.Where(Function(g) g.Count() <= 1) _
    	.Select(Function (g) g.Key) _
    	.ToArray() _
    
    Ciao!
  • Re: Cancellare numeri doppi su file txt

    Grande ALKA come sempre !!!
  • Re: Cancellare numeri doppi su file txt

    Grazie Sergio per il codice ma provandolo da errore Dim datoInt = Integer.Parse(dato.Substring(0, 1)) ' converto in Integer
    > Index e length devono fare riferimento a una posizione nella stringa.
    Nome parametro: length <
  • Re: Cancellare numeri doppi su file txt

    facocero ha scritto:


    provandolo da errore
    > Index e length devono fare riferimento a una posizione nella stringa.
    Nome parametro: length <
    Hai controllato se ci sono righe vuote nel file? E se sì, hai scritto il codice necessario per saltarle?
  • Re: Cancellare numeri doppi su file txt

    Ok Alka hai ragione per fare una prova avevo scritto io direttamente su file txt e mi dava errore cosa che non accade se scritto da programma... fino a qui tutto bene ma il codice ugualmente non funziona i numeri doppi non vengono cancellati e i singoli è logico non rimangono
  • Re: Cancellare numeri doppi su file txt

    Dim datoInt = Integer.Parse(dato.Substring(0, 1)) ' converto in Integer 
    questa riga è solo di esempio (e ti ho messo il commento in fondo proprio per farti capire cosa facevo)
    tu sai esattamente cosa c'è scritto nel file c:\archivio\prova1.txt e dovresti quindi essere in grado di convertirlo in Integer.

    Mostraci il file c:\archivio\prova1.txt
  • Re: Cancellare numeri doppi su file txt

    Il file prova1.txt è composto semplicemente da numeri in colonna come sopra descritto
    1
    5
    8
    9
    11
    1
    5
    9
    in pratica a me non serve nemmeno cancellare i doppioni ma visualizzare solo quelli singoli ( in questo caso 8 e 11) in una listbox. il codice proposto sopra che avrebbe dovuto visualizzare i numeri in messagebox risulta " " ho aggiunto ListBox1.Items.Add(risultato)
  • Re: Cancellare numeri doppi su file txt

    facocero ha scritto:


    ListBox1.Items.Add(risultato)
    Sbagliato, se è una ListBox devi aggiungere ogni singolo elemento.
    
            Dim dati = IO.File.ReadAllLines("c:\archivio\prova1.txt") ' leggo il file
    
            Dim lst = New Dictionary(Of Integer, Boolean) ' creo il dizionario
    
            For Each dato In dati
                If dato <> "" Then
                    Dim datoInt = Integer.Parse(dato) ' converto in Integer
                    If lst.ContainsKey(datoInt) Then
                        ' esiste già, sarà da escludere
                        lst.Item(datoInt) = False
                    Else
                        ' non esiste, lo creo e lo setto come da tenere
                        lst.Add(datoInt, True)
                    End If
                End If
            Next
    
            ' ora mi ricavo il risultato
            ListBox1.Items.Clear()
            For Each entry In lst
                If entry.Value Then
                    ListBox1.Items.Add(entry.Key.ToString)
                End If
            Next
    
    Con i dati che hai scritto prima, nella listbox mi ritrovo 8 e 11
  • Re: Cancellare numeri doppi su file txt

    Grande SirJo.. perfettamente funzionante grazie di tutto
  • Re: Cancellare numeri doppi su file txt

    Bene, ora però cerca di studiarti il codice e capire cosa fà, direi di iniziare a documentarsi che cos'è un Dictionary

    Ovviamente Alka aveva dato la soluzione ottima, poichè risolveva tutto in un'unica riga, però non so se per te il LINQ è troppo difficile
Devi accedere o registrarti per scrivere nel forum
13 risposte