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 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.
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
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.
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 !
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.
'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
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.
9 sept. 2015 à 21:08
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.