IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Lire un fichier texte dont l'encoding n'est pas connu [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Lire un fichier texte dont l'encoding n'est pas connu
    Bonjour à tous.
    J'ai une macro EXCEL qui doit ouvrir un fichier CSV dont l'encoding n'est pas connu :
    - il peut être soit en UTF8 (avec le marqueur BOM qui va bien au début), ou bien être en ascii standard (sans ce fameux marqueur).
    - de plus, les sauts de lignes peuvent être différents : soit \n, soit \r\n.

    Je dois lire le fichier ligne à ligne, sans perdre les caractères accentués qui le compose.

    Bref, il me faudrait une fonctionnalité de lecture de fichier "universelle".

    Pour l'instant, je detecte le type du fichier en lisant les 3 premiers octets, et en fonction de cela j'utilise soit ADODB.Stream soit FileSystemObject, mais je souhaite avoir une méthode un peu plus élégante.

    Avez-vous une idée ?

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Propose nous le code déjà réalisé et si possible un exemple des différentes structures que tu souhaites lire.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Bonjour.

    La structure du fichier n'est pas connu (c'est un fichier texte CSV, séparateur ";" , mais peu importe en fait).

    Voici le code en question (a placer dans un nouveau module - il faut activer la référence "Microsoft scripting Runtime" )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    Public Type MyFileObject
        objStream As Object
        encoding As Integer
        encodingAsStr As String
     
    End Type
     
    Public Const myFileEncodingASCII = 1
    Public Const myFileEncodingUTF8 = 2
     
    Public Function MyFileOpen(ByVal filename As String) As MyFileObject
        ' detect if file is ascii or utf
        Dim bom(3) As Byte
        Dim intFileNum As Byte
        intFileNum = FreeFile
        Open filename For Binary Access Read As intFileNum
        Dim i As Integer
        i = 1
        ' read 3st byte containing the BOM
        Do While Not EOF(intFileNum)
            Get intFileNum, , bom(i)
            i = i + 1
            If i > 3 Then Exit Do
        Loop
        Close intFileNum
     
        Dim t As MyFileObject
     
        ' detect BOM of the file
        If bom(1) = &HEF And bom(2) = &HBB And bom(3) = &HBF Then
            t.encoding = myFileEncodingUTF8
            t.encodingAsStr = "utf-8"
     
        Else
            t.encoding = myFileEncodingASCII
            t.encodingAsStr = "ascii"
        End If
     
        Dim objStream As Object
        If (t.encoding = myFileEncodingASCII) Then
            Dim fso As Scripting.FileSystemObject
            Set fso = New Scripting.FileSystemObject
            Set objStream = fso.OpenTextFile(filename, ForReading, False, TristateFalse)
            Set t.objStream = objStream
        Else
     
            Set objStream = CreateObject("ADODB.Stream")
            objStream.Open
            objStream.Charset = "UTF-8"
            objStream.Type = adTypeText
            objStream.LineSeparator = adLF '' 10 # Linefeed
            objStream.LoadFromFile (filename)
            Set t.objStream = objStream
        End If
     
        MyFileOpen = t
    End Function
     
    Public Function MyFileIsEOF(fileobj As MyFileObject) As Boolean
     
        If (fileobj.encoding = myFileEncodingASCII) Then
            MyFileIsEOF = fileobj.objStream.AtEndOfStream
        Else
            MyFileIsEOF = fileobj.objStream.EOS
     
        End If
     
    End Function
     
    Public Function MyFileReadLine(fileobj As MyFileObject) As String
     
        If (fileobj.encoding = myFileEncodingASCII) Then
            MyFileReadLine = fileobj.objStream.ReadLine
        Else
            MyFileReadLine = fileobj.objStream.ReadText(adReadLine)
        End If
    End Function
     
    Public Function MyFileClose(fileobj As MyFileObject)
        If (fileobj.encoding = myFileEncodingASCII) Then
            MyFileReadLine = fileobj.objStream.Close
        Else
            MyFileReadLine = fileobj.objStream.Close
        End If
     
    End Function
    Un exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    Dim objStream As MyFileObject
    objStream = MyFileOpen("c:\temp\fichier.csv")
    Do Until MyFileIsEOF(objStream)
    line = MyFileReadLine(objStream)
    ' do some stuff..
    Loop
    MyFileClose(objStream)
    Je souhaiterais simplifier ce code, pour utiliser un seul objet capable de s'adapter au format du fichier lu.

  4. #4
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Et en mettant juste iso-8859-1 dans le CharSet quand tu es en ASCII, mais en gardant un Stream ADODB, ce serait plus simple non ?
    « Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    En effet, je n'y avais même pas pensé... Je dois maintenant régler le problème des retours chariots (qui peuvent etre soit CR soit CRLF), mais je suis sur la bonne voie ! Merci pour cet éclair de lucidité !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/03/2013, 12h19
  2. Réponses: 12
    Dernier message: 08/11/2010, 19h23
  3. Réponses: 7
    Dernier message: 17/08/2010, 21h36
  4. Réponses: 3
    Dernier message: 10/09/2009, 16h24
  5. Réponses: 2
    Dernier message: 26/05/2004, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo