est-ce suffisanrt ?
l'appel du script python
./via.py source cible "chaine"
(en fait c'est une boucle sur une dizaine de fichiers source ,de fichiers cible et de chaîne)
pour que le script fonctionne , le fichier source doit être formaté correctement
exemple de fichier source (suite d'octets)
le premier enregistrement :
02 40 00 00 00 20 BC 07 00 F6 F3 45 00 22 41 34
32 20 42 6F 75 72 67 20 65 6E 20 42 72 65 73 73
65 20 3D 3E 20 4C 79 6F 6E 20 20 28 30 31 29 20
41 69 72 65 20 43 43 49 20 32 39 39 34 34 22 00
et ça recommence , la description est dans le script
dans l'exemple ci-dessus
02 type
40 00 00 00 longueur de l'enregistrement
20 BC 07 00 longitude
F6 F3 45 00 latitude
22 41 ..... 22 00 une chaine de texte terminée par 00
ici la longueur de l'enregistrement fait 40 00 00 00 octets (c'est à dire 64 octets)
[EDIT]
pour avoir un exemple réel de fichier
http://www.campingcar-infos.com/Francais/recherche.php
télécharger en choisissant "TomTom"
choisir dans l'archive l'un des fichiers .ov2 , le plus gros étant celui qui s'appelle ATOTALES.ov2
[/EDIT]
le script via.py
#!/usr/bin/env python3
import sys, re , time
fic_i=sys.argv[1] # argument 1 : fichier à traiter (ASN_CCI.ov2 par exemple)
fic_o=sys.argv[2] # argument 2 : fichier créer (ASN.dat par exemple)
aire=sys.argv[3] # argument 3 : (SN par exemple) (A C CF CS PCC PJ PN S SN TOTALES
# sera mis en tête de la nouvelle "chaîne"
# ==================================================
# le fichier ov2 est en format
# <type> <longueur> <longitude> <latitude> <description>
# 1 octet 4 octets 4 octets 4 octets n octets
# 1 + 4 + 4 + 4 + n = longueur
# remarque on considère que la description comprend le 00 de fin
# =======================================================================
def lire(f) :
typ=f.read(1)
if not typ: exit()
# lire 4 octets,convertir en entier ,ordre suivant le type du système
lon=int.from_bytes(f.read(4),sys.byteorder)
bl1=f.read(4)
bl2=f.read(4)
suite=f.read(lon-1-4-4-4)
return typ, lon, bl1, bl2, suite
#==================================================
def ecrire(f) :
f.write(typ)
# écrire 4 octets ordre suivant le type du système
f.write(lon.to_bytes(4,sys.byteorder))
f.write(bl1)
f.write(bl2)
f.write(suite)
#==================================================
def trace(s,tit=''):
print("%-5s= "%tit,end='')
for k in s: print("%02x"%(k),end='')
print()
#==================================================
with open(fic_i,'rb') as f, open(fic_o,'wb') as g :
while True:
time.sleep(0.01) # sinon j'obtiens des ereurs de trace
# BlockingIOError: [Errno 11] write could not complete without blocking
print()
typ, lon, bl1, bl2, suite = lire(f)
print(fic_i) # fichier en cours de triatement.
print(suite) # b'"LE BOURGET .... "\x00'
print(type(suite)) # <class 'bytes'>
print("le type")
trace(typ,'typ')
print("la longueur avant")
print("lon avant = %d"%lon)
print("la latitute et la longitude")
trace(bl1,'bl1')
trace(bl2,'bl2')
print("la suite de ces infos")
trace(suite,'suite avant')
print("les modifications")
# aire est le 3ème argument du script
ajout=bytes(aire+" ",'latin1') # type de codage obligatoire 'utf8,'latin1'..
suite=re.sub(b'^"',b'"'+ajout,suite) # remplace le 1er guillemet par guillemet + ajout
suite=re.sub(b'Aire CCI',b'#',suite) # remplace Aire CCI par # s'il y a
suite=re.sub(b'=>',b'=#',suite) # remplace => par =# s'il y a
suite=re.sub(b'<=',b'#=',suite) # remplace <= par #= s'il y a
lon=1+4+4+4+len(suite)
print("lon après = %d"%lon)
trace(suite,'suite après')
ecrire(g)