Lire et indexer par colonne un fichier txt/csv par XYZ

Bonjour à tous!

Mon problème concerne la lecture d'un fichier texte, son stockage dans VBA et le traitement par colonne.

J'ai un fichier de coordonnées XYZ, exemple :

100,312,6.22

97,315,0.57

95,421,3.29

94,414,2.33

Je l'ouvre avec le code suivant :

Dim myFile As String
Dim text As String
Dim textline As String
Dim posX As Integer
Dim posY As Integer
Dim posZ As Integer
Dim lidar As Integer

'chemin du fichier txt
myFile = "C:\Users\pablo.gonzalez\Desktop\test_Lidar.txt"

'ouvrir fichier txt
lidar = FreeFile
Open myFile For Input As lidar

J'aimerai pouvoir indexer tous ces points par leurs coordonnées. Par exemple la commande pts(1).X me donnerai 100, ou encore pt(4).Z donnerai 2.33 .

Comment puis-je y arriver?

Merci d'avance pour toute aide!

Pablo

J'ai trouvé une façon, mais j'ai l'impression qu'elle me limite pour la suite.

Type Point
    X As Double
    Y As Double
    Z As Double
End Type

Public mPts() As Point
Public mPtsComp() As Point

Public Function SplitStringToXYZPoint_CommaDelimited(S As String) As Point
    Dim P As Point
    Dim Splitted As Variant
    Splitted = Split(S, ",")
    P.X = Splitted(0)
    P.Y = Splitted(1)
    P.Z = Splitted(2)
    SplitStringToXYZPoint_CommaDelimited = P
End Function

Sub traitement_lidar()

Dim myFile As String
Dim lidar As Integer
Dim sBuf As String
Dim maxX As Integer

'chemin du fichier txt
myFile = "C:\Users\pablo.gonzalez\Desktop\test_Lidar.txt"

'ouvrir fichier txt
lidar = FreeFile
Open myFile For Input As lidar

'matrice points XYZ
Dim i As Long
    i = 0
    Do While Not EOF(lidar)
        Line Input #lidar, sBuf
        ReDim Preserve mPts(0 To i)
        mPts(i) = SplitStringToXYZPoint_CommaDelimited(sBuf)
        i = i + 1
    Loop

Quand je demande la valeur mPts(i).X j'obtient la bonne valeur selon la ligne i.

Cependant je me trouve face à un nouveau problème. Lorsque j'essaye de demander la valeur max des coordonnées X, VBA bug :

maxX = 1
Dim h As Integer
h = 0
For h = 0 To i
If mPts(h).X > maxX Then
maxX = mPts(h).X
End If
Next h

Comment puis-je traiter les informations par colonne?

Merci d'avance pour toute information

Pablo

51test-lidar.zip (51.36 Ko)

Bonjour,

Ci-joint une proposition à tester.

Pas de modification majeure par rapport au code déjà existant.

Seule remarque :

> pour la coordonnée "Z", transformation du séparateur de décimal ("." dans le fichier texte, "," pour VBA), dépend aussi de chaque configuration d'Excel.

Sinon, le résultat est a priori OK. Avec gestion d'un tableau et d'un type, c'est assez lisible et maintenable.

Bonne journée

Bouben

84test-lidar.xlsm (21.51 Ko)

Merci beaucoup Bouben!

Ça marche très bien.

Bonne journée!

Pablo

Rechercher des sujets similaires à "lire indexer colonne fichier txt csv xyz"