Double quote dans un fichier binaire avec Put

Bonjour,

avec VBA, je souhaite écrire dans un fichier une sorte de fichier binaire.

Exemple :

Open filename For Binary As #file_descriptor

L'écriture de la plupart des caractères fonctionne, aucun problème. Jusqu'à ce que je souhaite écrire la valeur d'une cellule.

Exemple:

Put #file_descriptor, LOF(1) + 1, ActiveCell.text

En fait, le contenu de la cellule s'écrit bien. Mais si on analyse byte par byte le fichier, on se rend compte qu'avant le contenu de la cellule, il y a des caractères spéciaux :

Sous Notepad++:

Texte "as" sera écrit dans le fichier ainsi:

BS NUL STX NUL as

Texte "plop" sera écrit dans le fichier ainsi:

BS NUL EOT NUL plop

Et je pense savoir pourquoi. La méthode text renvoie l'objet string qui contient dans un int à 4 octets la taille de la string.

Ma question est de savoir comment je peux écrire dans mon fichier le contenu de la cellule sans écrire ses caractères spéciaux.

Si quelqu'un a une idée, je suis preneur.

Merci d'avance.

Bonjour,

une manière de faire

Sub aargh()
    Open "test.dat" For Binary As #1
    texte = "plop"
    For i = 1 To Len(texte)
        Put #1, LOF(1) + 1, Asc(Mid(texte, i, 1))
    Next i
    Close 1
End Sub

Bonjour,

merci beaucoup pour cette réponse, qui en soit est fonctionnelle (si certains la veulent, je la valide).

Mais il y a un "petit" hic

Il y a environ 340000 cellules à copier reparties sur 13 feuilles dans mon fichier avec une moyenne de 9,6 caractères par cellule (arrondissons ça à 10 pour simplifier les calculs).

Donc, si VBA (qui passe par le kernel), doit faire 3,6 millions d'appels à Write en écrivant qu'un seul et unique caractère à chaque appel appel, le fichier mettra plusieurs heures à se générer (ok j'ai pas testé en vrai, mais honnêtement je crains le pire ).

Si je peux diviser le temps de création du fichier par 9,6 , ça m'arrangerait. Surtout que ce fichier sera probablement générer automatiquement plusieurs fois par jour.

Il n'existe pas une méthode pour récupérer le texte sans l'objet string ? Comme en C/C++ avec la méthode

.c_str()

?

Merci !

Bonjour,

quelle est la raison pour laquelle tu veux un fichier binary ? Comment vas-tu le lire sans connaître le début ni la fin de chaque donnée ?

Excellente question.

En fait, j'en connais la structure et comment il est organisé (un peu comme un ELF mais ça n'en est pas un). En tant que développeur, j'ai défini la manière dont les données sont stockées. Pour simplifier, ça donne ça :

Ligne X + 1, que des mots en 2 lettres

Ligne X + 2, que les mots en 3 lettres

Ligne X + 3, que les mots en 4 lettres

Etc.

Et parfois, j'ai besoin de séparer certains mots d'un double quote ou par un autre caractère (tous les autres je les ai grâce au vbXXX ou autre truc et astuces que j'ai trouvé).

Ensuite, pour l'histoire, ce fichier sera uploadé de manière automatique sur un Raspberry Pi qui gèrera son exécution et les tests sur des puces de type PIC.

Du coup j'ai quand même appliquer votre technique. Il a seulement mis un peu moins de 20 minutes pour 6Mo de données, ce qui reste finalement très correct.

Reste un problème avec votre technique :

A chaque put, il ajoute un NUL à la fin.

Donc à la première écriture du caractère du mot, je fais un:

Put #file_descriptor, LOF(1) + 1, ASC(97)

Et puis dans la boucle je fais un :

Put #file_descriptor, LOF(1), ASC(98)

Une fois la boucle fini, le texte suivi reecrase d'un caractère la précédente écriture:

Put #file_descriptor, LOF(1), "AutresDonnesAEcrire"

On ne va pas se cacher que ça fait un peu le dev qui a codé ça "avec ses pieds" mais ça a le mérite de fonctionner et d'être relativement correct niveau temps d'exécution.

Mais je suis sûr que l'on doit pouvoir éviter de faire ça, 1 par 1.

bonsoir,

une autre manière de faire est d'utiliser des strings de longueur fixe.

Sub aargh()
    Dim E6 As String * 6
    Open "test.dat" For Binary As #1
    texte = "motmot"
    E6 = texte
    Put #1, LOF(1) + 1, E6
    Close 1
End Sub

Mais je n'ai pas compris la nécessité du binaire, ni comment tu vas pouvoir déterminer à quelle ligne tu es lorsque tu lis le fichier, ni comment tu vas déterminer la longueur de tes données si tu ne connais pas la ligne

Bonjour,

moi non plus je ne comprend ps l'utilité du As Binary pour un fichier texte.

Ex avec 2 lignes de 2 groupes de 10 mots (essaie de rester en-dessous de 32000 caractères de mémoire) par ligne, séparés par un " :

Sub test()
    Dim ch As String, numfich As Integer, i As Long
    numfich = FreeFile
    Open "D:\tmp\test.txt" For Output As #numfich

    For i = 1 To 10
        ch = ch & Cells(1, i).Value
    Next i
    ' ligne 1
    Print #numfich, ch & """"; ' part1
    Print #numfich, ch; vbCr; 'part2
    ' ligne 2
    Print #numfich, ch & """";
    Print #numfich, ch; vbCr;
    Close #numfich
End Sub

J'ai mis vbCR en fin de ligne mais tu peux mettre le code que tu veux avec chr().

N'oublie pas le ; final si tu ne veux pas qu'il t'ajoute son CRLF

eric

De rien Kiputal...

Rechercher des sujets similaires à "double quote fichier binaire put"