Comparaison dans TXT multi ligne [Résolu]

Signaler
Messages postés
83
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
17 juin 2011
-
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
-
Bonjour a tous
Voila j'ai TXT multi ligne qui ressemble à cela :
3000 500 200
3000 2500
3000 500 200
J'aimerais pouvoir comparer les lignes et supprimer les doublons
Mais il faut aussi que dans ma première ligne figure le nombre total de ligne identique :
Ce qui donne
2* 3000 500 200
1* 3000 2500
Si jamais vous avez une idée?
Merci d'avance

22 réponses

Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
qu'as tu dans listbox1 ?
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
ok je viens juste de recevoir le message
après avoir envoyé le mien
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
66
Salut

Et as-tu tapé "doublon" dans la recherche de <codes en .Net> ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
83
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
17 juin 2011

Oui, je viens de regarder mais je n'ais rien vue
Je sais cela ne doit pas être trop difficile avec une boucle for
Mais vue que je fais du développement une semaine par ans je suis toujours un éternel débutant....
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
Salut

Essaie
Imports System.IO
Public Class Form1

    Private Structure datarecord
        Public count As Integer
        Public chaine As String
    End Structure
    Private tableout As New List(Of datarecord)
    Private table As New List(Of String)

    Private Sub ReadFile()
        Dim pathfichier As String
        pathfichier = "E:\test.TXT"
        'je lis tout le fichier dans listitems
        Try
            table = System.IO.File.ReadAllLines(pathfichier).ToList
        Catch ex As Exception
            'en cas d'exception affiche l'erreur 
            MessageBox.Show(ex.Message)

        End Try
    End Sub

    Private Sub WriteFile()
        Dim pathfichier As String
        pathfichier = "E:\testout.TXT"
        Dim outfile As New StreamWriter(pathfichier)
        'j'écris  le fichier 
        Try
            For Each element In tableout
                outfile.WriteLine(String.Concat(element.count, " ", element.chaine))

            Next
            outfile.Close()
        Catch ex As Exception
            'en cas d'exception affiche l'erreur 
            MessageBox.Show(ex.Message)

        End Try

    End Sub
    Private Sub Process()
        Dim count As Integer
        Dim str As String
        Dim datarec As datarecord

        count = 0
        table.Sort()
        str = table(0)
        For Each element In table
            If element = str Then
                count += 1
            Else
                datarec.chaine = str
                datarec.count = count
                tableout.Add(datarec)
                count = 0
                str = element
            End If
        Next
        datarec.chaine = str
        datarec.count = count
        tableout.Add(datarec)
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ReadFile()
        Process()
        WriteFile()
    End Sub
End Class
Messages postés
83
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
17 juin 2011

Merci beuacoup je vais essayer.
mais en faite je me suis mal exprimé mes donneés
ne se trouve pas dans un fichier TXT mais dans un textBox multi ligne sur mon form1.
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
Bon
'plus facile de mettre tes données dans un listbox


Imports System.IO
Public Class Form1

    Private Structure datarecord
        Public count As Integer
        Public chaine As String
    End Structure
    Private tableout As New List(Of datarecord)
    Private table As New List(Of String)


    Private Sub ReadListbox()
        table.Clear()
        For Each item In ListBox1.Items
            table.Add(item)
        Next
    End Sub

    Private Sub WriteTolistbox()
        For Each item In tableout
            ListBox2.Items.Add(String.Concat(item.count, " )", item.chaine))
        Next

    End Sub
    Private Sub Process()
        Dim count As Integer
        Dim str As String
        Dim datarec As datarecord

        count = 0
        table.Sort()
        str = table(0)
        For Each element In table
            If element = str Then
                count += 1
            Else
                datarec.chaine = str
                datarec.count = count
                tableout.Add(datarec)
                count = 0
                str = element
            End If
        Next
        datarec.chaine = str
        datarec.count = count
        tableout.Add(datarec)
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ReadListbox()
        Process()
        WriteTolistbox()
    End Sub
End Class
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
supprime
Imports System.IO

pas besoin
Messages postés
83
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
17 juin 2011

Voici les erreurs que ton code me donne:
Private Structure datarecord
Public count As Integer
Public chaine As String
End Structure
Private tableout As New List(Of datarecord) Private table As New List(Of String)


Private Sub ReadListbox()
table.Clear()
For Each item In ListBox1.Items
table.Add(item)
Next
End Sub

Private Sub WriteTolistbox()
For Each item In tableout
ListBox2.Items.Add(String.Concat(item.count, " )", item.chaine))
Next

End Sub
Private Sub Process()
Dim count As Integer
Dim str As String
Dim datarec As datarecord

count = 0
table.Sort()
str = table(0)
For Each element In table
If element = str Then
count += 1
Else
datarec.chaine = str
datarec.count = count
tableout.Add(datarec)
count = 0
str = element
End If
Next
datarec.chaine = str
datarec.count = count
tableout.Add(datarec)
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ReadListbox()
Process()
WriteTolistbox()
End Sub
Messages postés
83
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
17 juin 2011

oublie la réponse précédente erreur de frappe
j'ai mis mes données dans une listbox
mais maintenant j'ai plusieurs problème:

1
Private tableout As New List(Of datarecord)(TYPE LIST NON DEFINI)
Private table As New List(Of String)

2
rivate Sub ReadListbox()
table.Clear()
For Each item In ListBox1.Items(ITEM n'est pas déclarer)

3
Private Sub WriteTolistbox()
For Each item In tableout (ITEM n'est pas déclarer)

4
For Each element In table (element n'est pas déclarer)
If element = str Then
count += 1

en tout cas merci beauoup pour ton aide
bonne journée
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
Salut
as tu bien copié le code
tu as du oublié les lignes suivantes
Private Structure datarecord
    Public count As Integer
     Public chaine As String
End Structure


qu'il faut placer après
Public Class Form1
Messages postés
83
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
17 juin 2011

Non je n'ais pas oublié de mettre ce code.
mes problème commence içi
 Private tableout As New Generic.List(Of datarecord)          ' List(Of datarecord)
    Private table As New Generic.List(Of String)              'List(Of String)


je dois mettre generic. avant List(Of datarecord)
???
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
Envoie ton code pour voir
chez moi ça marche
Messages postés
83
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
17 juin 2011

Voila

Public Class frmOpti
   

    Inherits System.Windows.Forms.Form
    Private Structure datarecord
        Public count As Integer
        Public chaine As String
    End Structure Private Sub Calculate()
        If bLoaded = False Then Exit Sub
        '****** recuperation de la longueur de barres - les chutes******
        BinPackingGraph2.BinHeight = CType(nudBinHeight.Value - CInt(cmbchute.Text) - CInt(cmbchute.Text), Integer)
        '*********************                               *****************************
        BinPackingGraph2.Decreasing = cbDecreasing.Checked
        BinPackingGraph2.Algorithm = CType(cbBinPackingAlgorithm.SelectedIndex, Bin_Packing_Graph.BinPackingGraph.BinPackingAlgorithm)

        Dim strElements() As String = txtElements.Text.Split(" "c)
        Dim intElements(strElements.GetUpperBound(0)) As Integer
        Dim bSuccess As Boolean = True
        Dim i As Integer

        For i = 0 To strElements.GetUpperBound(0)
            If IsNumeric(strElements(i)) Then
                intElements(i) = CType(strElements(i), Integer)
            Else
                bSuccess = False
            End If
        Next

        If bSuccess Then
            BinPackingGraph2.Elements = intElements
            BinPackingGraph2.Compute()
        End If

        ' ****** somme des barres ******
        Dim somme As String

        somme = Bin_Packing_Graph.BinPackingGraph.Nbrs
        txtNbrsBarres.Text = somme


        '****** içi on rempli le txt ******
        Me.txtLigne.Text = ""

        Dim enligne()() As Integer
        Dim k, j As Integer

        enligne = Bin_Packing_Graph.BinPackingGraph.liste


        For k = 0 To enligne.Length - 1
            For j = 0 To enligne(k).Length - 1
                If chkEpaisseur.Checked = False Then
                    txtLigne.Text = txtLigne.Text & enligne(k)(j) & "   "

                Else
                    txtLigne.Text = txtLigne.Text & enligne(k)(j) - 8 & "   "

                End If
            Next

            txtLigne.Text = txtLigne.Text & Environment.NewLine

        Next



        ' içi on rempli le listBox avec le contenu du textBox 
        Dim Tab1() As String
        Dim x As Integer
        Me.ListBox1.Items.Clear()
        Tab1 = Split(txtLigne.Text, vbCrLf)

        For x = 0 To UBound(Tab1)
            ListBox1.Items.Add(Tab1(x))
        Next


        ReadListbox()
        Process()
        WriteTolistbox()
  
    Private tableout As New Generic.List(Of datarecord)          ' List(Of datarecord)
    Private table As New Generic.List(Of String)              'List(Of String)


    Private Sub ReadListbox()




        table.Clear()
        For Each item In ListBox1.Items
            table.Add(item)
        Next
    End Sub

    Private Sub WriteTolistbox()
   

        For Each item In tableout
            ListBox2.Items.Add(String.Concat(item.count, " )", item.chaine))
        Next

    End Sub
    Private Sub Process()
        Dim count As Integer
        Dim str As String
        Dim datarec As datarecord
     

        count = 0
        table.Sort()
        str = table(0)
        For Each element In table
            If element Is str Then
                count += 1
            Else
                datarec.chaine = str
                datarec.count = count
                tableout.Add(datarec)
                count = 0
                str = element
            End If
        Next
        datarec.chaine = str
        datarec.count = count
        tableout.Add(datarec)
    End Sub

 


End Class
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
c'est quoi cette ligne
End Structure Private Sub Calculate()


où se termine la sub calculate ?
Messages postés
83
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
17 juin 2011

Dans mon code c'est comme ça:
End Structure
Private Sub Calculate()


la sub calcule se termine juste après
ReadListbox()
Process()
WriteTolistbox()

end sub
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
places
Private tableout As New Generic.List(Of datarecord)          ' List(Of datarecord)
    Private table As New Generic.List(Of String) 

au début
Private Structure datarecord
        Public count As Integer
        Public chaine As String
    End Structure
    Private tableout As New List(Of datarecord)
    Private table As New List(Of String)
 


je ne sais pas s'il faut generic
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
La sub caculate à l'air compliqué
on peut surement simplifier
Messages postés
83
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
17 juin 2011

Super ça progresse:
donc voici le code que j'ai utilisé sans Bug, mais si tu as encore un peut de temps regarde le résultat il ne correspond pas encore à mes attentes:
  Public Class frmOpti
   

    Inherits System.Windows.Forms.Form
    Private Structure datarecord
        Public count As Integer
        Public chaine As String
    End Structure
    Private tableout As New Generic.List(Of datarecord)
    Private table As New Generic.List(Of String)

Private bLoaded As Boolean = False

    Private Sub Calculate()
        If bLoaded = False Then Exit Sub
        '****** recuperation de la longueur de barres - les chutes******
        BinPackingGraph2.BinHeight = CType(nudBinHeight.Value - CInt(cmbchute.Text) - CInt(cmbchute.Text), Integer)
        '*********************                               *****************************
        BinPackingGraph2.Decreasing = cbDecreasing.Checked
        BinPackingGraph2.Algorithm = CType(cbBinPackingAlgorithm.SelectedIndex, Bin_Packing_Graph.BinPackingGraph.BinPackingAlgorithm)

        Dim strElements() As String = txtElements.Text.Split(" "c)
        Dim intElements(strElements.GetUpperBound(0)) As Integer
        Dim bSuccess As Boolean = True
        Dim i As Integer

        For i = 0 To strElements.GetUpperBound(0)
            If IsNumeric(strElements(i)) Then
                intElements(i) = CType(strElements(i), Integer)
            Else
                bSuccess = False
            End If
        Next

        If bSuccess Then
            BinPackingGraph2.Elements = intElements
            BinPackingGraph2.Compute()
        End If

        ' ****** somme des barres ******
        Dim somme As String

        somme = Bin_Packing_Graph.BinPackingGraph.Nbrs
        txtNbrsBarres.Text = somme


        '****** içi on rempli le txt ******
        Me.txtLigne.Text = ""

        Dim enligne()() As Integer
        Dim k, j As Integer

        enligne = Bin_Packing_Graph.BinPackingGraph.liste


        For k = 0 To enligne.Length - 1
            For j = 0 To enligne(k).Length - 1
                If chkEpaisseur.Checked = False Then
                    txtLigne.Text = txtLigne.Text & enligne(k)(j) & "   "

                Else
                    txtLigne.Text = txtLigne.Text & enligne(k)(j) - 8 & "   "

                End If
            Next

            txtLigne.Text = txtLigne.Text & Environment.NewLine

        Next



        ' içi on rempli le listBox avec le contenu du textBox 
        Dim Tab1() As String
        Dim x As Integer
        Me.ListBox1.Items.Clear()
        Tab1 = Split(txtLigne.Text, vbCrLf)

        For x = 0 To UBound(Tab1)
            ListBox1.Items.Add(Tab1(x))
        Next

        ' içi on rempli le listBox2 avec le contenu du ListBox1 


        ReadListbox()
        Process()
        WriteTolistbox()
End Sub
 
    Private Sub ReadListbox()
       Dim item As String   '''Rajout de ma part
   table.Clear()
        For Each item In ListBox1.Items
            table.Add(item)
        Next
    End Sub

    Private Sub WriteTolistbox()
        Dim item As datarecord   '''Rajout de ma part

        For Each item In tableout
            ListBox2.Items.Add(String.Concat(item.count, " )", item.chaine))
        Next

    End Sub
    Private Sub Process()

        Dim count As Integer
        Dim str As String
        Dim datarec As datarecord
        Dim element As String   '''Rajout de ma part

        count = 0
        table.Sort()
        str = table(0)
        For Each element In table
            If element Is str Then
                count += 1
            Else
                datarec.chaine = str
                datarec.count = count
                tableout.Add(datarec)
                count = 0
                str = element
            End If
        Next
        datarec.chaine = str
        datarec.count = count
        tableout.Add(datarec)
    End Sub


Resultat :
1 )
0 )3500 2500
0 )3500 2500
0 )1500 700

Resultat attendu:
2 )3500 2500
1 )1500 700
Messages postés
83
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
17 juin 2011

dans la Listbox1 il y a :
3500 2500
3500 2500
1500 700
c'est la même chose que dans la Listbox2
après traitement sans 1 ) 0) etc...