CSV en UTF-8 (Sans BOM)

Bonjour, je suis en train de créer une macro pour enregistrer un fichier CSV en UTF8.

J'ai trouvé un premier code, mais l'enregistrement se fait en UTF-8 avec BOM et la deuxième version que j'ai trouvé me redonne le fichier dans le même format que celui de départ. (Vérifié avec notepad++)

Voici le code

Function Choix_Fichier(titre As String) As String

    With Application.FileDialog(msoFileDialogFilePicker)
        'Définit un titre pour la boîte de dialogue
        .Title = titre
        'Affiche la boîte de dialogue
        .Show

        'Affiche le nom du dossier sélectionné
        If .SelectedItems.Count > 0 Then
            Choix_Fichier = .SelectedItems(1)
        End If

    End With
End Function

Sub convertUTF8()
Const adSaveCreateOverWrite = 2
Const adTypeBinary = 1
Const adTypeText = 2

Dim objStreamUTF8: Set objStreamUTF8 = CreateObject("ADODB.Stream")
Dim objStreamUTF8NoBOM: Set objStreamUTF8NoBOM = CreateObject("ADODB.Stream")
Dim tFileToOpen As String, tFileToSave As String

tFileToOpen = Choix_Fichier("Ouvrir")
tFileToSave = "testutf8.csv"

With objStreamUTF8
  .Charset = "UTF-8"
  .Type = adTypeText
  .Open
  .LoadFromFile tFileToOpen
  .Position = 0
  .SaveToFile "testutf8.csv", adSaveCreateOverWrite
  .Type = adTypeBinary
  .Position = 3
End With

With objStreamUTF8NoBOM
  .Type = adTypeBinary
  .Open
  objStreamUTF8.CopyTo objStreamUTF8NoBOM
  .SaveToFile "testutf8-2.csv", adSaveCreateOverWrite
End With

objStreamUTF8.Close
objStreamUTF8NoBOM.Close
End Sub

J'ai trouvé des codes similaire sur différents site mais aucun ne semble fonctionner.

La je tourne en rond... Quelqu'un aurait-il une idée ?

Par avance, merci

A toutes fins utiles ...

Function UTF8_URL_Encode(ByVal sStr As String)
    Dim i As Long
    Dim a As Long
    Dim res As String
    Dim code As String

    res = ""
    For i = 1 To Len(sStr)
        a = AscW(Mid(sStr, i, 1))
        If a < 128 Then
            code = Mid(sStr, i, 1)
        ElseIf ((a > 127) And (a < 2048)) Then
            code = URLEncodeByte(((a \ 64) Or 192))
            code = code & URLEncodeByte(((a And 63) Or 128))
        Else
            code = URLEncodeByte(((a \ 144) Or 234))
            code = code & URLEncodeByte((((a \ 64) And 63) Or 128))
            code = code & URLEncodeByte(((a And 63) Or 128))
        End If
        res = res & code
    Next i
    UTF8_URL_Encode = res
End Function

Private Function URLEncodeByte(val As Integer) As String
    Dim res As String
    res = "%" & Right("0" & Hex(val), 2)
    URLEncodeByte = res
End Function

Bonjour,

Merci de ta réponse rapide, mais je vois mal comment utiliser ton code pour résoudre mon problème !

En effet, j'étais à côté de la plaque.

Voici un document que je viens d'enregistrer, dis moi si tu vois un BOM ?

J'ai utilisé Notepad++ pour enregistrer aprèsz un copier/coller d'une page perso internet.

300caract-utf-8.zip (14.96 Ko)

L'encodage du fichier me semble correct. Il est bien reconnu UTF-8(sans BOM) par notepad++

Quel est le type de fichier original ?

tFileToOpen = Choix_Fichier("Ouvrir")

J'avais lu ta réponse en diagonale désolé. Oui je connais notepad++ et je m'en sers pour le moment.

J'ai besoin de devellopper un macro qui fait ca pour des raisons d'efficacité. Au boulot nous avons pas mal de fichier à transformer en UTF-8 car on nous a mis en place une nouveau systeme qui ne nous prends désormais que l'UTF-8 alors qu'avant on travaillait en ANSI.

Et je sais que c'est possible de le faire puisqu''à une époque une société externe nous avait dévelloppé une macro (qui n'est pas fonctionnelle pour d'autre raison). Malheureusement cette macro étant protégée je ne peux pas adapter le code.

Ou alors a moins que tu connaisse un moyen de piloter automatiquement notepad++ depuis excel... pour faire la conversion ?

Le type de fichier original est un CSV généré par excel donc de l'ANSI

astragor a écrit :

a moins que tu connaisse un moyen de piloter automatiquement notepad++ depuis excel... pour faire la conversion ?

hum ... c'est possible !
astragor a écrit :

Le type de fichier original est un CSV généré par excel donc de l'ANSI

peux-tu m'en donner un bout ? (en MP si nécessaire)

Exemple d'un fichier que je viens de créer

157utf-8-exemple.csv (868.00 Octets)

Voila je te joins un bout de mon CSV de départ... (J'ai bien sur retiré toute info sensible).

145test.csv (2.48 Ko)

Bon finalement la piste de faire faire le travail pare notepad++ m'a titillé et j'ai trouvé une solution en passant par Applications.Sendkeys. J'aurais préféré qu'Excel le fasse sans passer par une appli exterieure mais visiblement d'une manière ou d'une autre excel ne sait pas gérer l'UTF-8.

C'est effectivement vers cela que je voulais aller, mais attention, si ton document original en comporte aucun caractère exotique,alors il risque de l'enregistrer au même format sdans changement; je pensais donc le leurrer en ajoutant un caractère en fin de fichier quitte à l'enlever ensuite ! On peut aussi enregistrer en txt et changer ensuite en csv ... bref ce sont des essais préliminaires peut-être à faire.

Dans tous les cas, dis moi si tu as bouclé le sujet !

ps : de mon côté je n'arrive jamais à voir le BOM

j'ai presque terminé la macro, faut ensuite que je la teste et je publierai ensuite ici le code, on sait jamais ça peut servir.

Bien pour le BOM c'est simple, quand tu ré ouvre ton fichier converti sur excel, si les caractères apparaissent normalement c'est que le fichier est en UTF8-BOM, s'il y a des symboles bizarres c'est qu'il est en UTF8 sans BOM

Sinon je le vois en ouvrant le doc dans notepad++ est c'est comme le port-salut, c'est marqué dessus, en bas à droite.

Oki ca marche...

Donc comme promis voici le code (je n'ai pas remis le code de la fonction choix_fichier qui n'as pas changé)

Sub convertUTF8()
    Dim FileToOpen As String
    FileToOpen = Choix_Fichier("Ouvrir")
    Shell "C:\Program Files (x86)\Notepad++\notepad++.exe " & FileToOpen
    Application.SendKeys ("%n{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}~^s^w%{F4}")
End Sub

Superbe, merci pour ce retour. Je n'aurai pas fait mieux !

Il existe un autre logiciel qui permet de dialoguer efficacement https://www.autoitscript.com/site/autoit/

Pas très complexe et très efficace, je l'ai utilisé en plus d'excel pour faire le pont entre des données d'excel et un logiciel encapsulé (SAP).

Exemple de programme :

capture d ecran 81

Merci c'est intéressant. Je me pencherai dessus car ça peut toujours être utile d'automatiser les actions comme ça. Surtout dans le milieu dans lequel je bosse.

Après je travaille avec une équipe de 4 personnes dont certaines sont assez retissentes à toute nouveauté en informatique. Donc plus c'est simple mieux c'est...

En tout cas merci à toi pour tes interventions sur ce sujet.

Rechercher des sujets similaires à "csv utf bom"