Question 189

Comment convertir un fichier texte du format Windows (ou format "Dos") au format Unix et inversement ?

Les fichiers texte sont des fichiers contenant des informations sous forme de caractères, par opposition aux fichiers binaires, dans lesquels l'information est stockée sous forme binaire, comme une suite d'octets. Dans un fichier texte, les informations sont stockées sous forme de suite de lignes ; chaque ligne est séparée d'une autre par un ou plusieurs caractères spéciaux, constituant ce qu'on appelle une séquence de passage à la ligne.

Malheureusement, les séquences de passage à la ligne ne sont pas représentées de la même façon par les différents systèmes d'exploitation :

  • Sous Windows, une fin de ligne est représentée par 2 caractères : le caractère "Carriage Return" (code Ascii 13) suivi du caractère "Line Feed" (code Ascii 10). Cette séquence est souvent appelée "CRLF". Elle est représentée en VB par la constante vbCrLf.
  • Sous Unix (ou Linux), une fin de ligne est représentée simplement par le caractère "Line Feed". Ce caractère est représenté en VB par la constante vbLf.

Cet article propose une fonction qui permet de convertir un fichier "Unix" en un fichier "Dos", ou inversement. Le principe est simple : on lit tout d'abord l'intégralité du fichier dans un buffer, puis on le sépare en lignes en utilisant Split. Il ne reste plus qu'à refabriquer un buffer avec le séparateur de fin de ligne adéquat.

La fonction utile est "ConvertFileFormat". Elle utilise une fonction utilitaire (ReadFileToBuffer) qui est celle donnée en exemple dans l'article Comment lire rapidement un fichier texte ?. Le code qui suit doit être inséré dans un module (.bas).

Option Explicit

Public Enum FILE_FORMAT_CONVERSION
    Unix_To_Dos = 1
    Dos_To_Unix = 2
End Enum

' Cette fonction convertit un fichier du format DOS vers Unix, ou Unix to Dos.
' Elle utilise la fonction ReadFileToBuffer pour lire le fichier source.
' En cas de succès, la fonction retourne True. En cas d'échec, elle renvoie False
' et renseigne le code et la description de l'erreur
'
Public Function ConvertFileFormat(ByVal src As String, _
                                  ByVal dest As String, _
                                  ByVal convertType As FILE_FORMAT_CONVERSION, _
                                  ByRef errCode As Integer, _
                                  ByRef errString As String) As Boolean
    Dim fileContent As String
    Dim t() As String
    Dim f As Integer

    On Error GoTo ConvertFileFormat_ERR

    fileContent = ReadFileToBuffer(src, errCode, errString)
    If errCode = 0 Then
    ' Découpage en lignes et regroupage
        Select Case convertType
            Case Unix_To_Dos
                t() = Split(fileContent, vbLf)
                fileContent = Join(t(), vbCrLf)
            Case Dos_To_Unix
                t() = Split(fileContent, vbCrLf)
                fileContent = Join(t(), vbLf)
        End Select
        
        ' remet à zéro le fichier destination
        f = FreeFile
            Open dest For Output As #f
        Close #f
        
        f = FreeFile
        Open dest For Binary As #f
            Put #f, , fileContent
        Close #f
        ConvertFileFormat = True
    Else
        ConvertFileFormat = False
    End If

ConvertFileFormat_END:
    Exit Function

ConvertFileFormat_ERR:
    errCode = Err.Number
    errString = Err.Description
    ConvertFileFormat = False
    Resume ConvertFileFormat_END
End Function

' Cette fonction lit le contenu du fichier szFileName et retourne
' ce contenu. En cas d'erreur, elle retourne une chaîne vide et
' renseigne le code d'erreur et la description de l'erreur
'
Private Function ReadFileToBuffer(ByVal szFileName As String, _
                                ByRef errCode As Integer, _
                                ByRef errString As String) As String
    Dim f As Integer
    Dim Buffer As String

    ' trappe les erreurs
    On Error GoTo ReadFileToBuffer_ERR

    ' Ouverture du fichier en 'Binary'
    f = FreeFile
    Open szFileName For Binary As #f
        ' préallocation d'un buffer à la taille du fichier
        Buffer = Space$(LOF(f))
        ' lecture complète du fichier
        Get #f, , Buffer
    Close #f
    ReadFileToBuffer = Buffer
ReadFileToBuffer_END:
    Exit Function
    
ReadFileToBuffer_ERR:
    ' Gestion d'erreur
    ReadFileToBuffer = ""
    errCode = Err.Number
    errString = Err.Description
    Resume ReadFileToBuffer_END
End Function

L'utilisation est toute simple :


    Dim ret As Boolean
    Dim errCode As Integer
    Dim errString As String

    ' Conversion de DOS en UNIX
    ret = ConvertFileFormat("c:\test_dos.txt", "c:\test_unix.txt", Dos_To_Unix, errCode, errString)
    If ret Then
        MsgBox "conversion réussie", vbInformation, ""
    Else
        MsgBox "Echec lors de la conversion." & vbCrLf & "Err Code = " & errCode & " Description : " & errString, vbExclamation, ""
    End If
    
    ' Conversion de UNIX en DOS
    ret = ConvertFileFormat("c:\test_unix.txt", "c:\test_dos2.txt", Unix_To_Dos, errCode, errString)

Pour aller plus loin

Voir aussi :

Date de publication : 06 mars 2008
Dernière modification : 06 mars 2008
Rubriques : Divers, Fichiers & dossiers, Texte & strings
Mots-clés : fichier, fichier texte, conversion, convertir, format, séparateur, fin de ligne, Unix, Linux, Dos, Windows, carriage return, line feed, vbCrLf, vbLf, retour à la ligne, saut de ligne, sauts de ligne, séquence newLine, Join, Split, vbLf, vbCrLf, chr(13), chr(10), chr$(13), chr$(10)