Lire fichier texte et extraire des parties

Résolu
edwinzap - 23 mai 2013 à 22:35
 Utilisateur anonyme - 6 juin 2013 à 23:03
Bonjour.
Je désirerais pouvoir lire un fichier texte contenant des coordonnées de points (X,Y) par ligne comme ceci:
1.000000 0.113161
1.000000 -0.090921
0.975530 -0.089751
0.938150 -0.089231

et extraire chaque coordonnée afin de les mettre dans un tableau pour les utiliser par la suite.
Quel serait la meilleur façon de procéder?
-Lire chaque ligne et les mettre dans un tableau et ensuite extraire de ce tableau les coordonnées ou bien
-Prendre les 8 premiers caractères, puis les 8 suivants (après l'espace)
J'ai tester un peu la fonction Readblock mais je ne crois pas que se soit la meilleur solution (d'autant plus que je n'ai pas trouvé cmt extraire toutes les valeurs du buffer afin de placer le chiffre complet dans un tableau)
Il y a sans doute encore d'autres solutions

Merci de m'aider

24 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
23 mai 2013 à 23:37
Salut
peut etre ainsi

Private Function GetListPoint() As List(Of PointF)
        Dim list1 As New List(Of String)
        Dim listp As New List(Of PointF)
        Dim val() As String
        Dim pt As PointF
        Try
            list1 = File.ReadAllLines("C:\test.txt").ToList
            For Each element As String In list1
                val = element.Split(" "c)
                pt.X = Convert.ToSingle(val(0))
                pt.Y = Convert.ToSingle(val(1))
                listp.Add(pt)
            Next

        Catch ex As Exception
            MessageBox.Show(ex.ToString)
        End Try
        Return listp
    End Function
3
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
23 mai 2013 à 23:06
Bonjour,

Pourquoi ne pas utiliser System.IO.File.ReadAllLines et MaChaine.Split ?

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
24 mai 2013 à 11:01
Bonjour,

En programmation objet, pourquoi ne pas utiliser un objet, une liste invisible...

Dim p As New System.IO.StreamReader(My.Application.Info.DirectoryPath & "\fichier.txt")
  Do While p.Peek >= 0
    ListBox1.Items.Add(Replace(p.ReadLine(), ".", ","))
  Loop
p.Close()


Et pour le lire, le 3eme élément par exemple :

Dim v1 As Double = 0.0
Dim v2 As Double = 0.0
v1 = CDbl(Trim(Mid(ListBox1.Items(2), 1, 8)))
v2 = CDbl(Trim(Mid(ListBox1.Items(2), 10)))


*


MsgBox(v1 & vbLf & v2)


Cordialement, Joe.
0
Utilisateur anonyme
24 mai 2013 à 12:58
Bonjour EhJoe,
pourquoi ne pas utiliser un objet, une liste invisible...

Parce que c'est du gaspillage de ressources.
0

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

Posez votre question
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
24 mai 2013 à 21:48
Bonjour Banana n°32

Ben c'est-à-dire qu'on est en 2013, le PC de base c'est 8 Go de RAM, c'est un DD d'1 To, un ecr (16/9) de 1900*900 px...

Alors comme ça utiliser des objets pour la programmation objet (tri en objet invisible) serait mal supporté...

On devrait revenir à la programmation console avec les bonnes veilles variables indicées et les tris bulle...

Mais non, mais non... Une application vbNet12 sur une FramWork 4 et > se moque d'une liste invisible de quelques éléments... heureusement encore.

Cordialement, Joe.
0
Utilisateur anonyme
24 mai 2013 à 21:57
Oui mais puisqu'on peut faire sans autant s'en passer. Mais ça n'engage que moi.
Bonne soirée à toi
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
24 mai 2013 à 22:00
Ah, si ça n'engage que toi, alors bonne soirée à toi aussi, bien que tu dois être en fin d'après-midi...
Cordialement, Joe.
0
Utilisateur anonyme
25 mai 2013 à 06:20
Bonjour heJoe,
le PC de base c'est 8 Go de RAM


Si tu as un windows 7 ou vista 32 bits, que reconnait-il comme mémoire ?

(Démarrer => click droit sur ordinateur => Propriétés)


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
25 mai 2013 à 09:05
Active,

Oh, bientôt tout le monde sera en 64 bits, tout comme on est passé de 16 à 32 dans les années 1995.

Les particuliers sont généralement rapidement à jour. Ce sont les entreprises qui sont toujours en retard, partant du principe que tant que ça marche y a pas lieu de changer (ce qui est logique, la notion de plaisir n'entrant pas en jeu). Vers 1986 j'ai connu des entreprises qui avaient 11 ans de retard, tournant encore en 16 bits sous Windows 3.11, j'étais obligé de programmer en vb4/16, alors qu'on en était au vb6...

En fait, de 16 à 32 bits j'ai vu une large différence, mais j'avoue que de 32 à 64 je ne vois (à l'œil), aucune différence sur les logiciels !
C'est un peu logique, car pour optimiser 32 bits (ou 2 fois 16 je crois), ben en fait, il faut goinfrer les registres au maximum, or un programme classique de calcul n'a pas besoin sans cesse de 32 bits, d'où le fait qu'il n'y a guère de différence.

Derrière la technologie ne suit pas, où alors elle est arrivée à son ratio maximum (prix, taille, performance), un peu comme les avions de lignes qui volent pas plus vite qu'il y a un demi siècle (850 km/h environ). Le seul ennui, c'est qu'il y a 50 ans, on faisait maximum 6000 km en avion, et que désormais on en fait 18.000 assez souvent (Asie). Faudrait quand même trouver quelque chose de plus rapide, parce que 15h00 d'avion c'est dur, surtout sans fumer, ça devient une torture !

Les processeur stagnent à 2,6 Ghz en portable, et à 5 Ghz environ en PC de bureau. Les écrans je ne sais pas s'ils freinent la vitesse, sans doute.

Mais le gros problème est actuellement le disque dur mécanique, qui lui depuis 30 ans se balade dans les 10 ms. Je crois que là est l'avancée attendue. Il faut passer aux DD électronique à mémoire morte, qui de la milliseconde vont sauter à la nanoseconde.

Après cet ultime changement du DD tant attendu, je crois qu'on sera arrivé au ratio (prix, taille, performance), et qu'ensuite ça ne bougera plus beaucoup... comme les avions de lignes...

Au plaisir, cordialement, Joe.
0
Bonjour à tous et merci pour ces morceaux de code, je vais tester un peu tout ça.

Même si je n'y connait pas grand chose, je suis d'accord avec banana32. On a toujours intérêt je pense à diminuer la consommation d'un programme en ressource. Il n'est pas rare de voir aujourd'hui des programmes n'ayant à première vue pas besoin de bcp ressource et qui, par une mauvaise programmation, en demande énormément. Souvent c'est l'accumulation qui en fait un programme fort lourd.
Je possède moi-même un portable avec 3Go de RAM seulement. Il a déjà 5 ans mais il possédait dans les meilleurs performances à l'époque. Comme quoi !

En tout cas merci à tous!
Je vous tiens au courant.

Cordialement

Edwin
0
Utilisateur anonyme
25 mai 2013 à 13:47
Re:

edwinzap,
Oui je pense que c'est une habitude à prendre, une philosophie du "ne pas gaspiller" si l'on peux éviter.
Sauf (sur une assez petite application), pour s'amuser comme dit Joe, pourquoi pas...

EhJoe,
Oh, bientôt tout le monde sera en 64 bits,


Oui, un jour surement, quand on aura remplacé tout ce qui tourne uniquement en 32...
Moi même j'ai installé deux partitions une en 32 et l'autre en 64.
Je disais ça parce que l'autre jour j'ai vu un voisin courir acheter 6 Go de RAM, malgé mon avis contraire, car son PC "ramait"
Une fois chose faite, je lui ai demandé alors qu'a-t-il reconnu?
Il me dit: 6 Go dans le bios c'est une bombe!!! moi: et alors dans ton Windows 7 32 bits ???
Ahh... 2.90... du coup il a gagné 900Mo par rapport à avant et ça "rame" toujours...

Vers 1986 j'ai connu des entreprises qui avaient 11 ans de retard, tournant encore en 16 bits sous Windows 3.11


Tu as du te tromper de date car La version 3 du système d'exploitation Windows est apparu le 22 mai 1990.
La version 3 a été la première à connaître un large succès, permettant à son concepteur Microsoft de rivaliser avec l'Apple Macintosh.

Mais en parlant de ça, sais-tu que la poste, utilise toujours le même logiciel depuis 1996 (ou 98, je ne sais plus)?
Bon j'imagine que les moyens de stockage des bases de données sont régulièrement maintenus avec du nouvelles technologies,
mais l'interface graphique au guichet ca ressemble toujours à du MSDos, rien d’étonnant tu me diras, quand on voit la qualité d'une grande partie du personnel.
Personnel, qui en plus est régulièrement formé sur ce "machin".... Du genre, pour faire un mandat cash: taper le nom de l'expéditeur puis 7 fois sur Tab, et 3 fois sur Entrée...

Tu as raison aussi pour les disques durs:
La technologie SSD, qui est un acronyme de l'Anglais Solid State Drive.
La comparaison entre disques classiques et SSD n'est pas difficile : le SSD est exactement le contraire du disque dur :
Il est rapide (temps d'accès inférieur à 1ms contre 12ms en moyenne pour un disque classique), consomme peu d'énergie, est totalement silencieux et plus fiable, car il n'a aucune partie mécanique (et l'électronique s'use beaucoup moins que la mécanique).
A LIRE CET ARTICLE


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
25 mai 2013 à 21:02
suite, la bonne version stable de Windows 3, c'est la 3.11 de 1993 (il me semble).

Tellement ratée qu'en 95 MS sortait la 95...

Cordialement, Joe.
0
Bonjour à tous et merci
J'ai finalement réussi grâce au code que vous m'avez fournit.
J'ai juste dû remplacer les "." par des "," et commencer à partir de la 2ème ligne car la première ligne donne des autres infos.
Voici mon code:
Imports System.IO
Public Class Form1
    Dim espace As String
    Dim Choixbouton As Integer

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        OpenFileDialog1.Filter = "Fichier DAT (*.dat)|*.dat|Fichiers texte (*.txt) |*.txt| Tous les fichiers(*.*)|*.*"
    End Sub

    Private Function GetListPoint() As List(Of PointF)
        Dim list1 As New List(Of String)
        Dim listp As New List(Of PointF)
        Dim val() As String
        Dim pt As PointF
        Try
            list1 = File.ReadAllLines(OpenFileDialog1.FileName).ToList

            Dim NbListe1 = list1.Count
            For I = 1 To NbListe1 - 2
                val = list1(I).Split(CChar(vbTab))
                val(0) = Replace(val(0), ".", ",")
                val(1) = Replace(val(1), ".", ",")
                Select Case Choixbouton
                    Case Is = 1
                        ListBox1.Items.Add(val(0) & "             " & val(1))
                    Case Is = 2
                        ListBox2.Items.Add(val(0) & "             " & val(1))
                    Case Else
                        MsgBox("erreur")
                End Select
                pt.X = Convert.ToSingle(val(0))
                pt.Y = Convert.ToSingle(val(1))
                listp.Add(pt)
            Next
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
        Return listp
    End Function

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Choixbouton = 1
            ListBox1.Items.Clear()
            GetListPoint()
        End If
    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Choixbouton = 2
            ListBox2.Items.Clear()
            GetListPoint()
        End If
    End Sub


Par contre j'utilise pour l'instant des espaces comme ceci " " pour l'espace qui sépare les x des y dans la listbox car je n'ai pas réussi avec le multicolonne d'une liste box.
Ce système me convient mais je pense que ce n'est pas très professionnel, comme le fait d'utiliser un variable pour connaitre le bouton sur lequel on a cliqué.

Si quelqu'un a une idée concernant le multicolonne d'une listebox, je suis preneur.

Cordialement
Edwin
0
Utilisateur anonyme
26 mai 2013 à 13:57
Utilise plutôt une listview car les listbox sont pauvres en fonctionnalités.
Option Strict On
Public Class Form1
    Dim MaListView As New ListView With {.Parent = Me, _
                                         .View = Windows.Forms.View.Details, _
                                         .Bounds = Me.ClientRectangle}

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MaListView.Columns.AddRange({New ColumnHeader() With {.Width 100, .Text "Point X"}, _
                                     New ColumnHeader() With {.Width 100, .Text "Point Y"}})
        Dim ofd As New OpenFileDialog() With {.Filter = "Fichiers Points|*.txt;*.dat", _
                                               .InitialDirectory = Application.StartupPath}
        If ofd.ShowDialog = DialogResult.OK Then
            MaListView.Items.Clear()
            Using reader As New IO.StreamReader(ofd.FileName)
                Do While Not reader.EndOfStream
                    Dim ligne() As String = reader.ReadLine.Split(" "c)
                    Dim item As New ListViewItem(ligne(0))
                    item.SubItems.Add(ligne(1))
                    MaListView.Items.Add(item)
                Loop
            End Using
        End If
    End Sub
End Class


En ce qui concerne les boutons, ajoute les événements click de tes boutons à la clause Handles et récupère leur référence par l'objet sender qu'il faudra caster en type Button.
Private Sub MesBoutons(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click, Button2.Click
    MessageBox.Show(DirectCast(sender, Button).Text)
End Sub
0
Merci j'ai changer ça.

Encore une chose, comment sortir d'une fonction si on appui sur un bouton "annuler".
Voici mon code plus concret:
                        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
                            MessageBox.show("Bonjour")
                        Else
                            Exit Function
                        End If

Ce code fonctionne mais n'est pas correcte.
Avertissement 1 La fonction 'GetListPoint' ne retourne pas une valeur pour tous les chemins de code. Une exception de référence null peut se produire au moment de l'exécution lorsque le résultat est utilisé. h:\mes documents\visual studio 2010\Projects\Créateur de Gcode1\Créateur de Gcode1\Form1.vb 30 29 Créateur de Gcode1


Merci
0
Utilisateur anonyme
27 mai 2013 à 20:41
Une fonction retourne un résultat. Voir l'instruction Return sur msdn.
0
Donc si j'ai bien compris il suffit de mettre "Return listp"

J'ai finalement séparé les deux boutons en faisant deux fonctions différentes, plus simple que de mettre des "Select Case" partout si c'est l'un ou l'autre bouton qui est appuyé.
Encore merci pour la listview, ça fonctionne bcp mieux. Je ne sais juste pas comment il faut faire pour ajuster la largeur des en-tête à la largeur des colonnes.

Encore merci pour tout et de passer ainsi du temps pour aider les autres
0
Utilisateur anonyme
27 mai 2013 à 22:29
Ce n'est pas une erreur mais un message d'avertissement sur ta fonction. Il indique que quelque part, l'exécution du code peut aboutir sur une sortie de ta fonction qui ne retourne pas de valeur.

On peut consulter l'aide en ligne sur la classe listview comme toutes les autres classes sur msdn.

A bientôt
0
Bonjour

J'ai encore une petite question. Existe t-il une fonction qui retournerai la valeur minimum d'une liste de points: le min des X ou le min des Y (ou les deux)?
Je pensais faire avec une boucle pour trouver la valeur minimum, mais si une fonction existe déjà, ce serait un peu bête.

D'avance Merci

Edwin
0
Utilisateur anonyme
6 juin 2013 à 20:12
Il faut trier ta liste de PointF par la méthode Sort :
Option Strict On
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim lp As New List(Of PointF) From {New PointF(4.7, 3.6), New PointF(4.6, 4.5), New PointF(4.8, 2.1)}
        lp.Sort(AddressOf Tri)
        '...
    End Sub

    Private Function Tri(ByVal a As PointF, ByVal b As PointF) As Integer
        If a.X < b.X And a.Y < b.Y Then
            Return -1
        'ici on peut déterminer d'autres valeurs de retour avec ElseIf
        Else
            return 1
        End If
    End Function
End Class
0
Rejoignez-nous