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
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 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 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
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
On Error GoTo ReadFileToBuffer_ERR
f = FreeFile Open szFileName For Binary As #f Buffer = Space$(LOF(f)) Get #f, , Buffer Close #f ReadFileToBuffer = Buffer ReadFileToBuffer_END: Exit Function ReadFileToBuffer_ERR: 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
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 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) |