Cumuler une variable string

Résolu
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 - 29 nov. 2015 à 21:47
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 - 31 janv. 2016 à 10:21
Bonjour ,
Je suis entrain de lire en vb 2010 un fichier txt ligne par ligne dans une variable string, mon souci maintenant et de sommer cette variable comme par exemple faire un sum(variable) dans sql.
Merci d'avance pour votre aide

8 réponses

Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
29 nov. 2015 à 23:03
Bonsoir, peux tu donner un exemple de ton fichier texte.
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
30 nov. 2015 à 23:23
Bonsoir,
Merci pour votre repense , mais j'ai résolu le problème autrement .
C'est que j'ai pu sommer les variables à la sortie du fichier de lecture. autrement dit les variables sont prêtes à l’exploitation, après je me demande si ça ne serait pas plus intéressant de continuer à résoudre le problème!. dans ce cas là je pourrai afficher mon exemple.
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656 > cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019
1 déc. 2015 à 06:39
Bonjour, sans exemple c'est sûr que je ne pourrai rien te proposer....
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3 > Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024
1 déc. 2015 à 14:36
Voila, finalement j'aurais besoin de résoudre ce problème
le fichier en question, ce pressente approximativement sous cette forme.

Voyage : 11 Elyros 2015-01-02
ComPax ComVeh
1-Italie |A | 5 02,04 | 19 04,88 | LIV
1-Italie | A | 53 ,04 | 19 54,88 | LIV
3-France | A | 20,00 | 21,10 | EUR
4-Espagne | A | 753,30 | 937,60 | EUR
4-Espagne | A | 25,50 | 12,92 | EUR
4-Espagne | A | 232,80 | 235,30 | EUR
4-Espagne | A | 57,80 | 48,62 | EUR
4-Espagne | E | 70,80 | 40,62 | EUR


je précise que le nombre de ligne est aléatoire..
Mon souci , maintenant est comment sommer toute les lignes de chaque secteur, pour avoir au final

1-Italie A sum som LIV
3-France A sum sum EUR
4-Espagne A sum sum EUR

ci-dessous le programme qui affiche pour le moment que le détail
Et merci pour votre précieuse aide



Dim objstreamreader As System.IO.StreamReader
Dim objstreamwriter As System.IO.StreamWriter
objstreamreader = System.IO.File.OpenText("E:\export\ManifesteCom.txt")
objstreamwriter = System.IO.File.CreateText("E:\export\PB18Com.txt")

Do Until objstreamreader.Peek = -1

strLine = objstreamreader.ReadLine()
secteur = Mid(strLine, 1, 7)

'devise = Mid(strLine, 1, 6)
rot = Mid(strLine, 1, 6)
'dt = Mid(strLine, 86, 4)
Dim comPax As String
Dim comVeh As String


If rot = "Voyage" Then

' If dt = "Date" Then
Vnavire = Mid(strLine, 51, 5)
trajet = Mid(strLine, 71, 7)
trajet = Replace(trajet, "/", "")

numV = Mid(strLine, 31, 3)

numV = String.Format("000{0}", numV, " ", vbNullString)
numV = numV.Substring(numV.Length - 3, 3)

jj = Mid(strLine, 99, 2)
mm = Mid(strLine, 96, 2)
aa = Mid(strLine, 93, 2)

ElseIf Vnavire = "Elyro" Then

If secteur = "1-Franc" Then

dev = Mid(strLine, 91, 3)

a = Mid(strLine, 21, 1)

If a = "A" Then

comPax = RTrim(Mid(strLine, 31, 18))
comPax = Replace(comPax, " ", vbNullString)

comVeh = RTrim(Mid(strLine, 51, 18))
comVeh = Replace(comVeh, " ", vbNullString)

Affiche = comPax + " "+ comVeh



objstreamwriter.WriteLine(affiche)



End If

ElseIf secteur = "1-Espag" Then

dev = Mid(strLine, 91, 3)

a = Mid(strLine, 21, 1)

If a = "A" Then

comPax = RTrim(Mid(strLine, 31, 18))
comPax = Replace(comPax, " ", vbNullString)

comVeh = RTrim(Mid(strLine, 51, 18))
comVeh = Replace(comVeh, " ", vbNullString)

Affiche = comPax + " "+ comVeh
objstreamwriter.WriteLine(affiche)



objstreamwriter.WriteLine(affiche)

End If
End If

End If
Loop

objstreamreader.Close()
objstreamwriter.Close()


0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
1 déc. 2015 à 17:28
Bonjour,

Avec la méthode Split:

  Dim Str As String = "1-Italie |A | 5 02,04 | 19 04,88 | LIV "
        Dim strarr() As String
        strarr = Str.Split(CChar("|")) 'séparateur
        For Each s As String In strarr
            MsgBox(s)
        Next

0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
1 déc. 2015 à 17:49
Si tu veux les mettre dans des TextBox ou des variables:

  Dim Str As String = "1-Italie |A | 5 02,04 | 19 04,88 | LIV "
        Dim strarr() As String
        strarr = Str.Split(CChar("|"))
        TextBox1.Text = (strarr(0))
        TextBox2.Text = (strarr(1))
        TextBox3.Text = (strarr(4))
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
1 déc. 2015 à 19:11
bonjour,
Une solution ADEQUATE sera proposée lorsque le demandeur aura su définir avec plus de précision ce qu'il veut faire;
Dans l'état actuel des choses, je crois avoir deviné son but, mais estime que nous ne sommes pas là pour ... deviner ...
C'est à LUI qu'il appartient de se montrer très précis.
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
1 déc. 2015 à 21:01
Bonsoir,
d'abord, merci pour vous d avoir essayer de résoudre un problème sans le comprendre, alors, dans le fichier présenté ci-dessus , j'essaye de sommer les variables de la colonne paxCom et PaxVeh par secteur.
dans mon code affiché ci-dessus j'arrive juste à lire les données ligne par ligne et les écrire dans un autre fichier, en revanche ce que je cherche et d’écrire dans l autre fichier la somme de toutes les variables groupé par secteur, pour mon exemple : j 'aimerai avoir ce résultat.

3-France | A | 20,00 | 21,10 | EUR
4-Espagne | A | 1069,4 | 1234,44 | EUR
1-Italie | A | 555,08 | 3859,76 | LIV
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 1/12/2015 à 21:35
C'est bien ce que je pensais (avais deviné) et que tu aurais dû préciser d'entrée de jeu.
La solution la plus pratique est alors
1) de transformer ton fichier texte en fichier texte CSV avec la virgule comme séparateur (un simple Replace)
puis
2) d'exploiter ce fichier CSV en l'injectant dans une pseudo base de données (une table créée dynamiquement)
puis
3) effectuer des requêtes sur la table ainsi créée
Tu trouveras dans le lien ci-dessous un exemple de création dynamique d'une telle table gérable par requêtes (le dernier message de la discussion) :

http://vbcity.com/forums/t/115981.aspx

Tu vas devoir bûcher à partir de cela.
Bonne étude et bon travail

Tu as bien évidemment également la possibilité de travailler autrement, mais beaucoup plus lourdement (avec les lenteurs induites) en triant tes données puis en les exploitant par des boucles de parcours (bonjour la lourdeur, alors ...)


________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
1 déc. 2015 à 22:12
Bonsoir,

j'ai commencé par corrigé ton exemple de manière à ce que chaque ligne suive le même modèle, si ça n'est pas le cas, on pourra adapter.

Voyage : 11 Elyros 2015-01-02
ComPax ComVeh
1-Italie | A | 502,04 | 1904,88 | LIV
1-Italie | A | 53,04 | 1954,88 | LIV
3-France | A | 20,00 | 21,10 | EUR
4-Espagne | A | 753,30 | 937,60 | EUR
4-Espagne | A | 25,50 | 12,92 | EUR
4-Espagne | A | 232,80 | 235,30 | EUR
4-Espagne | A | 57,80 | 48,62 | EUR
4-Espagne | E | 70,80 | 40,62 | EUR


Le Pivert t'a proposé de spliter tes lignes utiles, pour ça il te faudra exclure les 2 premières, les spliter, convertir dans une collection les bonnes cellules et ensuite les sommer.

C'est possible.

Je te propose une autre approche.
En utilisant une Regex pour vérifier le modèle de ligne de données, si elle "match" alors on charge dans une liste d'une classe dédiée, ensuite on les groupe par pays et on somme chaque groupe.

la classe d'abord
 Class DonneeMohelli
        Public Sub New(ByVal Lettre As String, ByVal Pays As String, ByVal Prix1 As Double, ByVal Prix2 As Double, ByVal Devise As String)
            Me.Pays = Pays
            Me.Lettre = Lettre
            Me.Prix1 = Prix1
            Me.Prix2 = Prix2
            Me.Devise = Devise
        End Sub

        Public Sub New(ByVal M As Match)
            Pays = M.Groups("pays").Value
            Lettre = M.Groups("lettre").Value
            Dim prix1 As String = M.Groups("prix").Value
            Dim prix2 As String = M.Groups("prix2").Value
            Me.Prix1 = Convert.ToDouble(prix1)
            Me.Prix2 = Convert.ToDouble(prix2)
            Devise = M.Groups("devise").Value
        End Sub

        Public Property Pays() As String

        Public Property Lettre() As String

        Public Property Prix1() As Double

        Public Property Prix2() As Double

        Public Property Devise() As String
    End Class


et le traitement du fichier de données
   Private Sub ParseCsMohellebi()
        Dim lignes() As String = File.ReadAllLines("testMohelli.txt") 'Lit le fichier d'un coup et charge chaque ligne dans un tableau de string


        Dim maRegex As New Regex("^\d-(?<pays>([A-Z]|[a-z])+) \| (?<lettre>([A-Z])) \| (?<prix>\d+,\d{2}) \| (?<prix2>\d+,\d{2}) \| (?<devise>([A-Z]){3}) $")

        Dim mesDonnees As New List(Of DonneeMohelli)()

        For Each l As String In lignes 'charge les lignes qui correspondent au modèle
            Dim m As Match = maRegex.Match(l)
            If m.Success Then
                mesDonnees.Add(New DonneeMohelli(m))
            End If
        Next l

        Dim groupement = mesDonnees.GroupBy(Function(d) d.Pays) 'Groupe les données par Pays

        'Somme chaque groupe dans une liste de résultats
        Dim sommes As List(Of DonneeMohelli) =
            ( From g In groupement
            Let prix1 = g.Sum(Function(d) d.Prix1)
            Let prix2 = g.Sum(Function(d) d.Prix2)
            Select New DonneeMohelli(g.ElementAt(0).Lettre, g.Key, prix1, prix2, g.ElementAt(0).Devise)).ToList()
    End Sub


La deuxième partie peut être condensée en utilisant une ou deux requêtes Linq, mais analyse d'abord ceci.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 2/12/2015 à 06:11
salut, Whism,
Son fichier texte peut (j'ai eu l'an dernier l'occasion de montrer - une discussion relative à un jeu de lettres - comment) devenir une pseudo table d'une pseudo base de données en le transformant ainsi
1) remplacement des "," (ses chiffres) par "."
2) en remplaçant ses "|" par ","
3 ) en remplaçant les deux 1ères lignes par la liste des pseudos champs ===>>
Pays,Lettre,Prix1,Prix2,Devise
1-Italie,A,502.04,1904.88,LIV
1-Italie,A,53.04,1954.88,LIV
3-France,A,20.00,21.10,EUR
4-Espagne,A,753.30,937.60,EUR
4-Espagne,A,25.50,12.92,EUR
4-Espagne,A,232.80,235.30,EUR
4-Espagne,A,57.80,48.62,EUR
4-Espagne,E,70.80,40.62,EUR

et cette pseudo table se prête ainsi directement à toute requête
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
2 déc. 2015 à 07:26
Bonjour Uc,
c'est exact, mais quelque soit le séparateur, la solution du split proposée par Le Pivert ou la regex sont applicables.
Derrière, il sera toujours plus simple de traiter une collection de classe qu'un tableau de tableau.

Par contre, tu mets le doigts sur une précision que je n'ai pas faite: la virgule.
Le fichier est "en virgule", mon pc aussi, donc je n'ai pas traité l'incompatibilité dans mon code exemple.
0
cs_mohellebi Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 1 août 2019 3
Modifié par cs_mohellebi le 31/01/2016 à 10:22
désolé pour la repense tardive, car j étais en congé
vraiment soulagé d'avoir résolu ce problème
Merci à vous tous
0
Rejoignez-nous