Microsoft 365 Convertir fichier csv en fichiers séquentiel avec colonnes à largeur fixe

ivan27

XLDnaute Occasionnel
Bonjour à tous,
Je souhaite convertir un fichier csv en un fichier séquentiel avec des colonnes à largeur fixe, et des pipes "|" comme séparateur. Je souhaite obtenir un alignement à gauche ou droite en fonction des colonnes.
Exemple en entrée :
*945 2365 12352238960001569521;231124150800;751;572057;"TESTCLT";"0101";*945 2365 12352238960001569521

En sortie je veux obtenir ceci :
*945 2365 12352238960001569521 |231124150800| 751| 572057|TESTCLT |0101|*945 2365 12352238960001569521 |

En pièce jointe, un classeur test avec un code qui fait le job partiellement.
Un fichier de départ et un fichier avec la sortie attendue
Merci d'avance pour votre aide.
Ivan
 

Pièces jointes

  • test.xlsm
    18.3 KB · Affichages: 3
  • sortieAttendue.txt
    466 bytes · Affichages: 3
  • FichierDépart.txt
    321 bytes · Affichages: 6
Solution
Salut,
une solution :
VB:
Sub ConvertirCSVenSeq()
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim Fso As Object, Csv As Object, Txt As Object, Champ As Variant
' Alignement et longueur de chaque colonne en sortie -------------------------
Dim Alg: Alg = Array("Left", "Left", "Left", "Right", "Left", "Left", "Left")
Dim Lng: Lng = Array(35, 12, 4, 9, 9, 4, 35)

    Chemin = ThisWorkbook.Path & "\"
    Set Fso = CreateObject("Scripting.FileSystemObject")
        Set Csv = Fso.OpenTextFile(Chemin & "FichierDépart.txt", ForReading)
        Set Txt = Fso.OpenTextFile(Chemin & "FichierArrivée2.txt", ForWriting, True)
            Do Until Csv.AtEndOfStream
                Champ = Split(Csv.Readline, ";")
                For i = 0 To...

fanch55

XLDnaute Barbatruc
Salut,
une solution :
VB:
Sub ConvertirCSVenSeq()
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim Fso As Object, Csv As Object, Txt As Object, Champ As Variant
' Alignement et longueur de chaque colonne en sortie -------------------------
Dim Alg: Alg = Array("Left", "Left", "Left", "Right", "Left", "Left", "Left")
Dim Lng: Lng = Array(35, 12, 4, 9, 9, 4, 35)

    Chemin = ThisWorkbook.Path & "\"
    Set Fso = CreateObject("Scripting.FileSystemObject")
        Set Csv = Fso.OpenTextFile(Chemin & "FichierDépart.txt", ForReading)
        Set Txt = Fso.OpenTextFile(Chemin & "FichierArrivée2.txt", ForWriting, True)
            Do Until Csv.AtEndOfStream
                Champ = Split(Csv.Readline, ";")
                For i = 0 To Ubound(Champ)
                    Champ(i) = Replace(Champ(i), """", "")
                    If Alg(i) = "Left" Then
                        Champ(i) = Left(Champ(i) & Space(Lng(i)), Lng(i))
                    Else
                        Champ(i) = Right(Space(Lng(i)) & Champ(i), Lng(i))
                    End If
                Next
                Txt.writeline Join(Champ, "|")
            Loop
        Csv.Close
        Txt.Close
    Set Fso = Nothing
End Sub
 

ivan27

XLDnaute Occasionnel
Rebonjour à tous, Fanch55,
Merci beaucoup, court et efficace.
Peux-tu ajouter le pipe de fin en position 115 s'il te plaît ? Le "vieux programme" qui va lire le fichier à besoin de cette marque de fin.
Je te réitère mes remerciements.
Ivan
 

dysorthographie

XLDnaute Accro
Je souhaite convertir un fichier csv en un fichier séquentiel avec des colonnes à largeur fixe, et des pipes "|" comme séparateur. Je souhaite obtenir un alignement à gauche ou droite en fonction des colonnes.
Bonjour,
Un CSV part définition est un fichier sequenciel.

Si le colonnes sont séparées par des pipes ce n'est pas des colonnes a largeur fixe.

L'alignement au gauche ou droite dépend si le contenu est du texte "1234" ou du nombre 1234.
 

ivan27

XLDnaute Occasionnel
Re bonjour à tous,
dysofthogrphie, effectivement mais le fait est que le logiciel qui doit lire le fichier est un vieux programme qui compte les pipes et les espaces donc je n'ai pas d'autre choix que de respecter scrupuleusement le format attendu.
fanch55, j'ai réussi à ajouter le pipe manquant. Encore merci.

VB:
Sub ConvertirCSVenSeq()
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Dim Fso As Object, Csv As Object, Txt As Object, Champ As Variant
    ' Alignement et longueur de chaque colonne en sortie -------------------------
    Dim Alg: Alg = Array("Left", "Left", "Right", "Right", "Left", "Left", "Left")
    Dim Lng: Lng = Array(35, 12, 4, 9, 9, 4, 35)

    Chemin = ThisWorkbook.Path & "\"
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set Csv = Fso.OpenTextFile(Chemin & "FichierDépart.txt", ForReading)
    Set Txt = Fso.OpenTextFile(Chemin & "FichierArrivée2.txt", ForWriting, True)

    Do Until Csv.AtEndOfStream
        Champ = Split(Csv.ReadLine, ";")
        For i = 0 To UBound(Champ)
            Champ(i) = Replace(Champ(i), """", "")
            If Alg(i) = "Left" Then
                Champ(i) = Left(Champ(i) & Space(Lng(i)), Lng(i))
            Else
                Champ(i) = Right(Space(Lng(i)) & Champ(i), Lng(i))
            End If
        Next
        Champ(UBound(Champ)) = Champ(UBound(Champ)) & "|"
        Txt.WriteLine Join(Champ, "|")
    Loop

    Csv.Close
    Txt.Close
    Set Fso = Nothing
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 183
dernier inscrit
karelhu35