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

  • Initiateur de la discussion Initiateur de la discussion ivan27
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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...
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
 
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
 
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.
 
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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour