Faisabilité _ Opérations mathématiques VB.net [Résolu]

Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 4 nov. 2009 à 16:10 - Dernière réponse :
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Dernière intervention
26 novembre 2013
- 5 nov. 2009 à 16:16
Bonjour à tous,

Alors je viens juste de me mettre à la programmation sur visual basic express 2008, et j'aurais besoin de savoir si je suis bien parti, ou si je me suis complètement planté de voie pour aboutir à mon projet.

Je vais essayer de faire simple :
1 - J'ai une interface utilisateur ou je load des fichiers .txt (ou .bat) (+500.000 lignes)
2 - Ces fichiers sont transformés en datagridview
3 - Je dois faire des opérations mathématiques entre différentes tables (multiplication, etc.)
4 - j'exporte mes tables de résultats.

Voilà pour mon cahier des charges.

Je bloque sur plusieurs points :

D'une part pour la transformations en datagridview, j'aimerais plusieurs choses :
- Commencer la lecture des lignes à partir de la 6ème (par exemple)
- Changer de colonne (non déclarée car non connu à l'avance) à chaque présence d'une chaine de caractère dans une ligne. Par exemple :

TS 1.58
52
58
59
TS 2.68
62
15
45


faire des mes lignes TS ### un début de colonne pour les valeurs qui suivent, et ceux jusqu'à ce qu'il n'y ai plus données.

Et ensuite, j'aimerais savoir si c'est possible de faire des manipulations entre plusieurs datagridview... ou si je dois utiliser une autre méthode.


Merci d'avance pour vos commentaires et vos conseils.

Bonne journée
Afficher la suite 

Votre réponse

21 réponses

Meilleure réponse
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Dernière intervention
26 novembre 2013
- 5 nov. 2009 à 00:56
3
Merci
Voici un exemple concret :


    Public Function ReadTS(ByVal TSfile As String) As DataTable

        Try
            '
            Dim return_DataTable As New DataTable
            '
            Dim cnt As Int16 = 0
            Dim col_Index As Integer = 0
            Dim row_Index As Integer = 0
            Dim fs As New IO.FileStream(TSfile, IO.FileMode.Open)
            Dim sr As New IO.StreamReader(fs)
            '
            While Not SR.EndOfStream
                '
                cnt += 1
                '
                Dim line As String = SR.ReadLine
                '
                If cnt > 6 Then' On ne tient compte de la lecture qu'a partir de la 7ème ligne 
                    If line.Substring(0, 2) = "TS" Then' Nouvelle colonne ?
                        return_DataTable.Columns.Add(line, GetType(System.String))' Ajout dans la table
                        col_Index += 1
                        row_Index = 0
                    Else
                        If col_Index = 1 Then' Nouvelle ligne ?
                            Dim Row As DataRow = return_DataTable.NewRow' On ajoute la ligne à la table
                            Row.Item(col_Index - 1) = line
                            return_DataTable.Rows.Add(Row)
                        Else' Nouvelle valeur de ligne ?
                            return_DataTable.Rows(row_Index).Item(col_Index - 1) = line' On ajoute la valeur à la ligne existante
                            row_Index += 1
                        End If
                    End If
                End If
            End While
            '
            Return return_DataTable
            '
        Catch ex As Exception
            '
            Return Nothing
            '
        End Try
        '
    End Function



Ces quelques lignes de code te permettent, dans la mesure ou toutes tes colonnes de fichiers ont le même nombre de lignes, de lire ce fichier à partir de la 6ème ligne et de le convertir en DataTable, celui-ci peut ainsi être utilisé pour remplir un DataGridView de façon automatique :

MonDataGrid.DataSource = ReadTS("C:\test_ts.txt")

C'est je pense, la base du traitement de ton application, j'ai testé en recréant un fichier avec ton exemple et cela fonctionne.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.

Merci Mayzz 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de Mayzz
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Dernière intervention
26 novembre 2013
- 4 nov. 2009 à 20:47
0
Merci
Pour ton problème c'est bien entendu gérable, il te suffit de créer une fonction qui va lire ton fichier texte et le retranscrire sous forme de DataTable, qui servira de source de données pour ton datagridview

Par contre je ne comprend pas très bien...

faire des mes lignes TS ### un début de colonne


Qu'appeles-tu un 'début de colonne' ?

Un datagridview n'est rien d'autre qu'un tableau, tu peux y créer autant de colonnes/lignes que tu veux. Bien entendu, toutes les données affichés dans tes lignes devront correspondre au colonnes, logique...


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 4 nov. 2009 à 22:00
0
Merci
Oui j'ai réussi à créer ma datagridview sans problème, mais le seul souci c'est que d'une part elle reprend toutes mes lignes de mon .txt (mais je pense avoir trouvé une solution pour ça), et que d'autres part je souhaite créer des colonnes "à la volée" lors de la lecture du fichier pour chaque chaîne de caractère de ce type (TS X,XXX). Après que TS X,XX apparaisse en nom de colonne ou sur la première ligne de chaque colonne ça ne me dérange pas (en nom de colonne ça serait mieux néanmoins).

C'est pour cela que je ne peux pas les créer avant la lecture de mon fichier car je ne sais pas combien j'en ai (ça peux aller jusqu'à 3000 colonnes de + de 200.000 lignes (c'est de la modélisation).

Peut tu également m'éclairer sur les méthodes que je devrais appliquer pour mes opérations inter-datagridview? (je m'efforcerais de créer une structure identique, e donc de ce fait les champs sur lesquels les opérations devront avoir lieu seront les mêmes (Table 1 A1 x Table 2 A1 par exemple, et mettre le résultat dans une Table 3).

Merci d'avance de m'éclairer (je ne souhaite pas que l'on me donne les codes mais juste les pistes à approfondir )
Commenter la réponse de Neiflheim1
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Dernière intervention
26 novembre 2013
- 4 nov. 2009 à 22:25
0
Merci
Heu... si je comprend bien...

Tu as ce type de données :

TS 1.58
52
58
59
TS 2.68
62
15
45

Il te faut donc commencer par créer tes colonnes :

TS 1.58 | TS 2.68

et par la suite l'affichage des données donnera :

TS 1.58 | TS 2.68 |

     52 |      62 |
     58 |      15 |
     59 |      45 |


est-ce bien ce que tu veux ??? Donc tu ne connais pas à l'avance ni le nombre de colonnes, ni le nombre de lignes ???

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 4 nov. 2009 à 23:11
0
Merci
Voilà c'est exactement ce que je veux

Le TS (time step) contient à chaque fois le nombre même de ligne, et les colonnes peuvent varier (en fonction du pas de temps sur lequel on fais tourner le modèle).
Cependant le nombre de ligne est connu d'avance dans le début de mon fichier .txt

Mon fichier commence comme cela :
DATASET
OBJTYPE "grid3d"
BEGSCL
ND 8000
NC 8000
NAME "benzene"
TS 1 3.1536e+007
2.15396e-031
4.83953e-030
1.71941e-028
4.12743e-027
6.69154e-026
7.97027e-025
7.46346e-024
5.75921e-023


et quelques 8000lignes plus tards =>
TS 1 6.3072e+007
2.09474e-011
1.94691e-011
1.81398e-011
1.70581e-011
1.61885e-011
1.52008e-011
1.25477e-011


donc dans ce cas là il y a 8000 lignes par Time Step

Donc c'est pour cela que je dois dégager le début de mon fichier
afin de garder que les TS et les valeurs, et mettre le tout sous forme de tableau comme tu as fais.
Commenter la réponse de Neiflheim1
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Dernière intervention
26 novembre 2013
- 5 nov. 2009 à 00:40
0
Merci
Le problème c'est que tu dois avoir le même nombre de ligne à chaque fois su tu souhaite un traitement efficace :

TS 1 3.1536e+007 <= Colonne avec 8 lignes
2.15396e-031
4.83953e-030
1.71941e-028
4.12743e-027
6.69154e-026
7.97027e-025
7.46346e-024
5.75921e-023


TS 1 6.3072e+007 Colonne avec 7 lignes...
2.09474e-011
1.94691e-011
1.81398e-011
1.70581e-011
1.61885e-011
1.52008e-011
1.25477e-011

Est ce que c'est parce que tu n'a pas copier l'intégalité de l'exemple ? (une ligne en moins mais celle-ci est présente dans le fichier)

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 5 nov. 2009 à 08:22
0
Merci
Dans mon exemple je n'ai pas tout mis, (vu qu'il y a plusieurs milliers de lignes), mais il y a toujours le même nombre de ligne pour chaque TS

Merci beaucoup pour ton code je vais tester tout ça aujourd'hui et je te tiens au courant !
Commenter la réponse de Neiflheim1
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 5 nov. 2009 à 09:48
0
Merci
Bon j'ai failli devenir fou

J'ai codé selon mes besoins mais quand je lance mon application, ma datagridview reste vide...

Ne doutant pas une seule seconde de ton code, j'ai changé ma source de données de 300.000 lignes en une dizaine, et la ça marche ! Donc le code que tu as fais ne marche pas pour de grandes quantités de données, saurais tu d'où cela peut venir? (dois je par exemple faire tourner le code en arrière plan? il y a t-il une limite de calcul que l'application peut exécuter? )
Commenter la réponse de Neiflheim1
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 5 nov. 2009 à 09:57
0
Merci
C'est dommage qu'on ne puisse pas éditer ses messages

Bon je sais d'ou cela vient et je vais chercher la solution :

 If col_Index = 1 Then' Nouvelle ligne ?
                            Dim Row As DataRow = return_DataTable.NewRow' On ajoute la ligne à la table
                            Row.Item(col_Index - 1) = line
                            return_DataTable.Rows.Add(Row)


En fait il ne prend en compte que deux colonnes (qu'importe le nombre de lignes), à la troisième colonne ça reste vide.

Si entre temps tu sais comment régler ça je suis preneur
Commenter la réponse de Neiflheim1
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Dernière intervention
26 novembre 2013
- 5 nov. 2009 à 10:17
0
Merci
Bien en fait, tu ne dois pas avoir le même nombre de ligne par colonnes à mon avis... c'est ce qui provoque ce bug, car pour tester j'ai utilisé ceci :

DATASET
OBJTYPE "grid3d"
BEGSCL
ND 8000
NC 8000
NAME "benzene"
TS 1 3.1536e+007
2.15396e-031
4.83953e-030
1.71941e-028
4.12743e-027
6.69154e-026
7.97027e-025
7.46346e-024
5.75921e-023
TS 1 3.1536e+008
2.15396e-031
4.83953e-030
1.71941e-028
4.12743e-027
6.69154e-026
7.97027e-025
7.46346e-024
5.75921e-023
TS 1 3.1536e+009
2.15396e-031
4.83953e-030
1.71941e-028
4.12743e-027
6.69154e-026
7.97027e-025
7.46346e-024
5.75921e-023
TS 1 3.1536e+010
2.15396e-031
4.83953e-030
1.71941e-028
4.12743e-027
6.69154e-026
7.97027e-025
7.46346e-024
5.75921e-023

Dans un fichier texte, copier/coller d'après ton exemple de données...

Et j'ai bien toutes les colonnes/lignes.

Ce qui peut se produire éventuellement, c'est que le traitement soit plus long si tu as beaucoup de lignes dans le fichier, mais c'est tout à fait normal...

Au pire, dis le moi et je te laisse mon mail en mp, pour que tu m'envoi le fameu fichier en question.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 5 nov. 2009 à 10:55
0
Merci
Bon après quelques tests, j'ai trouvé ce qui pose problème Le nombre de ligne est identique donc la dessus ça roule.

En fait il bug quand les lignes sont identiques.

Par exemple si j'ai :

DATASET
OBJTYPE "grid3d"
BEGSCL
ND 8000
NC 8000
NAME "benzene"
TS 1 3.1536e+007
1
1
1
6.69154e-026
7.97027e-025
7.46346e-024
5.75921e-023
TS 1 3.1536e+008
1
1
1
6.69154e-026
7.97027e-025
7.46346e-024
5.75921e-023
TS 1 3.1536e+009
1
1
1
6.69154e-026
7.97027e-025
7.46346e-024
5.75921e-023
TS 1 3.1536e+010
1
1
1
6.69154e-026
7.97027e-025
7.46346e-024
5.75921e-023



Par contre dans le code je ne vois pas où ça pose souci
Ca bug juste pour des nombres entiers (1,2,3), si on fais une suite de nombre complexe (6.69154e-026 ou 7.97027) ça marche...
Commenter la réponse de Neiflheim1
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 5 nov. 2009 à 11:06
0
Merci
C'est même pas une question de ligne identique, c'est juste qu'il ne prend pas en compte les valeurs uniques [0-9] par contre au delà ça marche, donc surement un souci au niveau de là :

Dim line As String = sr.ReadLine
Commenter la réponse de Neiflheim1
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Dernière intervention
26 novembre 2013
- 5 nov. 2009 à 11:55
0
Merci
Heu...

Je ne suis plus la...

Tu as essayé avec le contenu de ce que j'ai posté et chez toi cela ne fonctionne pas ???

Je viens de tester chez moi avec le fichier de ton post précédent et ca fonctionne, t'as faire une erreur quelque part..?

voir capture

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 5 nov. 2009 à 12:07
0
Merci
Dans le doute d'une erreur de manipulation de ma part, j'ai copié collé exactement le code que tu m'a passé, en prenant comme fichier celui que tu a essayé pour l'exemple ci dessus.

Et pour moi ça ne marche pas.

le déboguage me sort l'exception suivante :

Une exception de première chance de type 'System.ArgumentOutOfRangeException' s'est produite dans mscorlib.dll


et ma datagridview reste vide.

Et après une rapide recherche sur cette erreur, il semble que ça soit l'emploi de substring(0,2) sur une chaine de moins de 2 caractères... Après si ça marche de ton côté c'est qu'il doit y avoir autre chose...
Commenter la réponse de Neiflheim1
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 5 nov. 2009 à 12:31
0
Merci
je confirme mon message ci dessus avec un test :

If cnt > 6 Then ' On ne tient compte de la lecture qu'a partir de la 7ème ligne 
                    If line.Length < 2 Then
                        line = "0" + line
                    End If
                    MsgBox(line.Length.ToString) 'Affiche 2 
                    If line.Substring(0, 2) = "TS" Then ' Nouvelle colonne ?
                        return_DataTable.Columns.Add(line, GetType(System.String)) ' Ajout dans la table
                        col_Index += 1
                        row_Index = 0
                    Else...


Il me ressort ensuite bien mon tableau avec au lieu des "1" des 01... mais comme ça ça marche bien que ça ne soit pas très propre comme code
Commenter la réponse de Neiflheim1
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Dernière intervention
26 novembre 2013
- 5 nov. 2009 à 12:46
0
Merci
Arf ! Effectivement, c'est vrais...

Autant pour moi, mais ce que je ne comprend pas c'est que chez moi je n'ai pas eu l'erreur

Voici la petite correction qui mettera ton code au propre :


If line.Length >= 2 AndAlso _
   line.Substring(0, 2) = "TS" Then


Au lieu de :

If line.Substring(0, 2) = "TS" Then



Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 5 nov. 2009 à 13:29
0
Merci
Niquel il à l'air de tourner pour toutes les lignes du document Je ne connaissais pas la méthode AndAlso, ça facilite bien des choses !

Par contre ma table ne s'ouvre toujours pas, mais c'est du à un autre problème :

Une exception de première chance de type 'System.OverflowException' s'est produite dans ...


lors de l'ouverture de mon datagrid au niveau de ce code ci :
            Dim newDataTable As DataTable
            newDataTable = ReadTS(openDataFileDialog.FileName)


Qu'est ce qui peux être à l'origine d'une telle erreur?
Commenter la réponse de Neiflheim1
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 5 nov. 2009 à 14:05
0
Merci
J'ai effectué quelques tests, et en fait cette erreur surgit lorsque j'ai + de 32.000 lignes de données (soit 2 colonnes de 16.000).

Si j'ai juste deux colonnes le datagrid se crée, sinon ça me renvoie 'System.OverflowException' et il n'y a rien de créé...
Commenter la réponse de Neiflheim1
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Dernière intervention
26 novembre 2013
- 5 nov. 2009 à 16:01
0
Merci
Bien,

Je ne pensais pas que tu pouvais avoir autant de lignes:

Remplace :
Dim cnt As Int16 = 0


par:
Dim cnt As Integer = 0


Int16 est limité 32767, voila ;O)

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Messages postés
31
Date d'inscription
vendredi 6 février 2009
Dernière intervention
20 janvier 2010
- 5 nov. 2009 à 16:08
0
Merci
Excellent tout marche niquel !

Merci de ta patience et de ton aide en tout cas, tu m'as fais gagner un précieux temps. J'espère pouvoir te rendre la pareille (en VB j'en doute mais bon )
Commenter la réponse de Neiflheim1

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.