Lire un fichier .ov2 [Résolu]

Gutt_V - 9 sept. 2015 à 17:53 - Dernière réponse : Whismeril 11413 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention
- 13 sept. 2015 à 21:25
Bonjour,
Utilisateur très amateur et autodidacte de visual studio 2013, je cherche à lire (et à terme écrire aussi) des fichiers .ov2
Ces fichiers sont des listes de coordonnées GPS avec un libellé.
Je connais la structure de ces fichiers :
1 byte T: type (always 2)
4 bytes L: length of this record in bytes (including the T and L fields)
4 bytes X: longitude coordinate of the POI
4 bytes Y: latitude coordinate of the POI
L?13 bytes Name: zero?terminated ASCII string specifying the name
of the POI


N'ayant jamais utilisé ce genre de fichier, j'ai recherché de l'aide sur les forums mais rien de concluant.
Quelqu'un peut-il m'aiguiller avant de m'arracher mes derniers cheveux ?

Merci
Afficher la suite 

11 réponses

Répondre au sujet
Whismeril 11413 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 9 sept. 2015 à 20:32
0
Utile
1
Bonsoir ce que tu décris est un fichier binaire.
Voir cet article.
https://msdn.microsoft.com/fr-fr/library/9tk3bdxw.aspx

si tu veux avoir un aperçu de ton fichier pour travailler à ton programme, je te conseille xvi32.
Gutt_V 5 Messages postés mercredi 9 septembre 2015Date d'inscription 17 septembre 2015 Dernière intervention - 9 sept. 2015 à 21:08
Merci de cette réponse rapide.
J'avais consulté la page de Microsoft, mais cela ne me renseigne pas sur la manière de récupérer les différents enregistrements contenus dans les différentes lignes du fichier.
En gros, j'aimerais récupérer chaque donnée et la stocker dans un tableau, mais je n'arrive pas récupérer ces données.
Commenter la réponse de Whismeril
Whismeril 11413 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 9 sept. 2015 à 21:56
0
Utile
2
Déjà ça va dépendre si tu passes par file.readallbyte ou par le stream, donc en gros de la taille de tes fichiers.

Avec la première méthode tu vas avoir en ram le contenu complet de ton fichier et ensuite la même quantité de données retranscrites. Donc pour un fichier de 500mo tu as besoin de 1 go de ram.

Dans le second cas tu vas piquer morceau par morceau le contenu du fichier, et donc en gros diviser par deux la ram nécessaire.

Ensuite tout stocker en vrac dans un tableau n'est pas judicieux, d'une par il va te falloir parcourir une fois le fichier pour connaître la taille a appliquer à ton tableau avant de le remplir et d'autre part si tu veux ajouter ou supprimer des éléments c'est galère. Les List sont beaucoup plus simples et souples à utiliser.

Ce que je ferais, c'est écrire une classe Poi avec comme propriétés au moins les coordonnées et le nom.
Je mettrais en paramètre du contructeur un tableau de byte qui correspond à une entrée, celui-ci se chargeant de convertir en données utilisables, voir ici pour un double https://msdn.microsoft.com/fr-fr/library/system.bitconverter.todouble(v=vs.110).aspx

Quand à la façon de fournir le bon tableau de byte au constructeur et bien, il faut que tu choisisses la méthode de lecture
Gutt_V 5 Messages postés mercredi 9 septembre 2015Date d'inscription 17 septembre 2015 Dernière intervention - 9 sept. 2015 à 23:13
Wouaw... Je sens qu'il va me falloir franchir un nouveau cap en programmation !
Mais, maintenant j'ai une piste avec ton post et BitConverter.
Je vais la suivre et voir où ça me mène.
Je reviendrais plus tard si je coince.

encore merci
Whismeril 11413 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > Gutt_V 5 Messages postés mercredi 9 septembre 2015Date d'inscription 17 septembre 2015 Dernière intervention - 10 sept. 2015 à 07:57
Bonjour tu trouveras tout ce qu'il te faut pour bien appréhender vb.net ici
http://plasserre.developpez.com/cours/vb-net/
Commenter la réponse de Whismeril
vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 10 sept. 2015 à 09:55
Gutt_V 5 Messages postés mercredi 9 septembre 2015Date d'inscription 17 septembre 2015 Dernière intervention - 10 sept. 2015 à 10:23
Génial ! MERCI.
C'est exactement ce que je voulais faire.
D'un coté, c'est pas marrant, ça tombe tout cuit... d'un autre côté, je comprends plein de trucs et je vais pouvoir progresser.
Un grand merci à tous !
Whismeril 11413 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > Gutt_V 5 Messages postés mercredi 9 septembre 2015Date d'inscription 17 septembre 2015 Dernière intervention - 10 sept. 2015 à 13:43
Et bien tu peux t'amuser à le refaire, ce code n'utilise pas grand chose de .Net.
Il a écrit un module de conversion alors que les classes existent déjà.
Ca mériterait un petit rafraîchissement.
vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > Whismeril 11413 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 13 sept. 2015 à 00:59
Bonjour ! Regarde là
http://codes-sources.commentcamarche.net/source/34322-net2-lecteur-de-fichier-tomtom-binary-ov2

Pour rendre cette source plus NET
1) supprimer les 2 modules
2) garder la feuille principale avec son design et y mettre ce code

Voici le petit rafraichissement bien mérité

Imports System.IO
Imports System.Runtime.InteropServices

Public Class frmPOI

Private Sub ButtonLoadFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonLoadFile.Click

Dim fDialog As New OpenFileDialog
Dim sFilename As String
Dim j As Integer = 1

fDialog.Filter = "Fichier TomTom Binary (*.ov2)|*.ov2"

'si ok sur boite de dialogue
If fDialog.ShowDialog = Windows.Forms.DialogResult.OK Then

sFilename = fDialog.FileName
Me.Text = "Editeur POI pour TomTom" & " - [" & sFilename & "]"

'variables
Dim Octets() As Byte = Nothing
Dim c As Integer = 0 'compteur
Dim sName As String
Dim cWatch As New Stopwatch
Dim sValue As Integer
Dim iLength As Integer

cWatch.Start() 'démarre le chrono

'lecture du fichier en hexa
Octets = My.Computer.FileSystem.ReadAllBytes(sFilename)

ListView1.Items.Clear()
ListView1.SuspendLayout()

'------------------------------
'traitement...."
'------------------------------
While (Not Octets.Length <= c + 1)

ListView1.Items.Add(j.ToString)
'récupération de la longeur du POI
iLength = Marshal.ReadInt32(Octets, c + 1)

'recuperation de la description
sName = ""
For i As Integer = (c + 13) To (c + iLength - 2)
sName += Convert.ToChar(Octets(i))
Next
ListView1.Items(j - 1).SubItems.Add(sName)

'récuperation de la longitude (4 octets; position du 6ième au 9ième octets dans chaque POI)
sValue = Marshal.ReadInt32(Octets, c + 5)
ListView1.Items(j - 1).SubItems.Add((Convert.ToDouble(sValue) / 100000).ToString)

'recuperation de la latitude (idem pour la latitude sur 4 octets; du 10ième au 13ième)
sValue = Marshal.ReadInt32(Octets, c + 9)
ListView1.Items(j - 1).SubItems.Add((Convert.ToDouble(sValue) / 100000).ToString)

'compteurs
c += iLength 'du pointeur dans le fichier
j += 1 'nombre de points
End While

'affichage des resultats
ListView1.ResumeLayout()
StatusStrip1.Items(0).Text = "Durée du chargement: " & cWatch.ElapsedMilliseconds.ToString & " millisecondes"
StatusStrip1.Items(1).Text = ListView1.Items.Count & " points trouvés"

End If

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'dimension des colonnes
ListView1.Columns(0).Width = 30
ListView1.Columns(1).Width = 390
ListView1.Columns(2).Width = 70
ListView1.Columns(3).Width = 70

End Sub

End Class
vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention > vb95 1510 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 13 sept. 2015 à 18:42
Pour ceux qui veulent la source complète avec zip c'est ici :http://codes-sources.commentcamarche.net/source/101163-lecteur-fichier-ov2-en-vb-net
Whismeril 11413 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 13 sept. 2015 à 21:25
Bonsoir, j'ai mis la mienne ici
http://codes-sources.commentcamarche.net/source/101162-lecteur-ov2

Je finaliserai un peu plus tard, mais j'ai opté pour un principe différent, lecture avec filestream et binaryreader, stockage dans une d'une classe métier et binding sur un datagridview.

C'est codé vite fait, j'y reviendrais un peu plus tard.
Commenter la réponse de vb95

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.