Cumuler une variable string [Résolu]

cs_mohellebi 101 Messages postés mercredi 31 octobre 2007Date d'inscription 1 novembre 2017 Dernière intervention - 29 nov. 2015 à 21:47 - Dernière réponse : cs_mohellebi 101 Messages postés mercredi 31 octobre 2007Date d'inscription 1 novembre 2017 Dernière intervention
- 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
Afficher la suite 

13 réponses

Répondre au sujet
Whismeril 10530 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 14 décembre 2017 Dernière intervention - 29 nov. 2015 à 23:03
0
Utile
3
Bonsoir, peux tu donner un exemple de ton fichier texte.
cs_mohellebi 101 Messages postés mercredi 31 octobre 2007Date d'inscription 1 novembre 2017 Dernière intervention - 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.
Whismeril 10530 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 14 décembre 2017 Dernière intervention > cs_mohellebi 101 Messages postés mercredi 31 octobre 2007Date d'inscription 1 novembre 2017 Dernière intervention - 1 déc. 2015 à 06:39
Bonjour, sans exemple c'est sûr que je ne pourrai rien te proposer....
cs_mohellebi 101 Messages postés mercredi 31 octobre 2007Date d'inscription 1 novembre 2017 Dernière intervention > Whismeril 10530 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 14 décembre 2017 Dernière intervention - 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()


Commenter la réponse de Whismeril
cs_Le Pivert 4767 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 décembre 2017 Dernière intervention - 1 déc. 2015 à 17:28
0
Utile
1
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

cs_Le Pivert 4767 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 décembre 2017 Dernière intervention - 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))
Commenter la réponse de cs_Le Pivert
ucfoutu 18022 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 1 déc. 2015 à 19:11
0
Utile
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.
Commenter la réponse de ucfoutu
cs_mohellebi 101 Messages postés mercredi 31 octobre 2007Date d'inscription 1 novembre 2017 Dernière intervention - 1 déc. 2015 à 21:01
0
Utile
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
Commenter la réponse de cs_mohellebi
ucfoutu 18022 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - Modifié par ucfoutu le 1/12/2015 à 21:35
0
Utile
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.
Commenter la réponse de ucfoutu
Whismeril 10530 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 14 décembre 2017 Dernière intervention - 1 déc. 2015 à 22:12
0
Utile
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.
Commenter la réponse de Whismeril
ucfoutu 18022 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - Modifié par ucfoutu le 2/12/2015 à 06:11
0
Utile
1
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.
Whismeril 10530 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 14 décembre 2017 Dernière intervention - 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.
Commenter la réponse de ucfoutu
cs_mohellebi 101 Messages postés mercredi 31 octobre 2007Date d'inscription 1 novembre 2017 Dernière intervention - Modifié par cs_mohellebi le 31/01/2016 à 10:22
0
Utile
désolé pour la repense tardive, car j étais en congé
vraiment soulagé d'avoir résolu ce problème
Merci à vous tous
Commenter la réponse de cs_mohellebi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.