convertir fichier .csv en .txt

jlppap

XLDnaute Junior
Bonjour,
XP - Off.2003 : Actuellement je récupère un fichier '.csv' donc avec des ';' comme séparateur.
La longueur de ces champs est variable.

Je dois récupérer ce fichier pour intéger les données dans une table sur un ERP, mais il faut que les données soient de longueur fixe.
Serait-il possible, avec une macro Excel de lire ce fichier .csv pour le transformer en fichier .txt avec des longueurs de champs fixes, et comment faire?
Cela fait déjà un bon moment que j'essaie mais sans grand résultat... pas doué !

j'ai mis en pièce jointe un exemple.

MERCI beaucoup pour votre aide.
 

Pièces jointes

  • TEST_fichier_CSV_en_TXT.zip
    1.2 KB · Affichages: 404
  • TEST_fichier_CSV_en_TXT.zip
    1.2 KB · Affichages: 398
  • TEST_fichier_CSV_en_TXT.zip
    1.2 KB · Affichages: 399
Dernière édition:

mercant76

XLDnaute Impliqué
Re : convertir fichier .csv en .txt

bonjour,

du mal à comprendre : tu parles de ligne 10 et 20, mais tu donnes un exemple avec 5 lignes ?

dans le fichier txt tu indiques des largeurs de colonnes ?

quand il n'y a pas assez de caractères, on ajoute des blancs ? avant ou après ?

envoies un fichier csv avec une dizaine de lignes et un exemple de ce que tu veux obtenir, c'est plus simple pour y travailler.

@+
 

JNP

XLDnaute Barbatruc
Re : convertir fichier .csv en .txt

Bonjour le fil :),
Vu que je ne vois pas l'intérêt de colonnes à taille fixe sans ajouter les blancs, une proposition
Code:
[COLOR=blue]Sub[/COLOR] Test()
[COLOR=blue]Dim[/COLOR] MaLigne [COLOR=blue]As String[/COLOR], I [COLOR=blue]As Long[/COLOR], J [COLOR=blue]As Integer[/COLOR], Tableau
Tableau = Split("2;6;3;8;3;8;3;3;8;8;10;12;6;6", ";")
[COLOR=blue]Open[/COLOR] "FICHTEST.txt" [COLOR=blue]For Output As[/COLOR] #1    [COLOR=green]' Ouvre le fichier en écriture.[/COLOR]
[COLOR=blue]For[/COLOR] I = 1 [COLOR=blue]To[/COLOR] Range("A65000").End(xlUp).Row
[COLOR=blue]For[/COLOR] J = 0 [COLOR=blue]To UBound[/COLOR](Tableau)
MaLigne = MaLigne & Left(Cells(I, J + 1).Text & "            ", Tableau(J))
[COLOR=blue]Next[/COLOR] J
[COLOR=blue]Print[/COLOR] #1, MaLigne
MaLigne = ""
[COLOR=blue]Next[/COLOR] I
[COLOR=blue]Close[/COLOR] #1    [COLOR=green]' Ferme le fichier.[/COLOR]
[COLOR=blue]End Sub[/COLOR]
La chaine "2;6;3;8;3;8;3;3;8;8;10;12;6;6" donne le nombre de caractères par colonne, à adapter. "____________" comprends 12 espaces, en mettre autant que la plus grande valeur de la première chaine.
Bon courage :cool:
Ajout : Salut MRomain
 
Dernière édition:

mromain

XLDnaute Barbatruc
Re : convertir fichier .csv en .txt

Bonjour jlppap, mercant76,

C'est vrai qu'il n'y a pas assez d'infos.
Cependant, je t'ai fait une base de travail sur ce que j'ai compris.
La macro :
- ouvre le fichier .csv,
- le lit ligne par ligne,
- vérifie si c'est une ligne 10 ou 20,
- fait le traitement en fonction (pour l'instant, je n'ai fait que les ligne 20 (j'ai pas compris comment devait être traitée la ligne 10).
- réécrit chaque ligne "traitée" dans le fichier .txt.
VB:
Public Sub CsvToTxt()
'déclaration des variables
Dim pathFichierCsv As String, pathFichierTxt As String, tabEl() As String, ligneTxt As String
Dim myFso As Object, fichierCsv As Object, fichierTxt As Object

    'définition des variables
    pathFichierCsv = "E:\XLS\test\TEST_fichier.csv"   'fichier .csv (à lire)
    pathFichierTxt = "E:\XLS\test\TEST_fichier2.txt"   'fichier .txt (à écrire)
    
    'ouvrir les deux fichiers
    Set myFso = CreateObject("Scripting.FileSystemObject")
    Set fichierCsv = myFso.OpenTextFile(pathFichierCsv, 1)      'ouvrir le fichier .csv en lecture seule
    Set fichierTxt = myFso.CreateTextFile(pathFichierTxt, True) 'créer le fichier .txt
    
    On Error Resume Next
    'on va maintenant boucler sur chaque ligne du fichier .csv
    While Not fichierCsv.AtEndOfStream
        
        'récupérer les éléments de la ligne .csv (séparés par ;) dans un tableau
        tabEl = Split(fichierCsv.ReadLine, ";")
        
        'initialiser la ligne .txt
        ligneTxt = ""
        
        'vérifier si c'est une ligne "10" ou "20" (premier élément du tableau)
        If tabEl(0) = "10" Then
            'traitement spécifique à une ligne "10"
            
            
        ElseIf tabEl(0) = "20" Then
            'traitement spécifique à une ligne "20"
            'ajouter à la ligne .txt chaque élément du tableau à une longueur spécifiée
            ligneTxt = ligneTxt & FormaterTxt(tabEl(0), 2)  'premier élément, de longueur 2
            ligneTxt = ligneTxt & FormaterTxt(tabEl(1), 6)  '...
            ligneTxt = ligneTxt & FormaterTxt(tabEl(2), 3)  '...
            ligneTxt = ligneTxt & FormaterTxt(tabEl(3), 8)  '...
            ligneTxt = ligneTxt & FormaterTxt(tabEl(4), 3)
            ligneTxt = ligneTxt & FormaterTxt(tabEl(5), 8)
            ligneTxt = ligneTxt & FormaterTxt(tabEl(6), 3)
            ligneTxt = ligneTxt & FormaterTxt(tabEl(7), 3)
            ligneTxt = ligneTxt & FormaterTxt(tabEl(8), 8)
            ligneTxt = ligneTxt & FormaterTxt(tabEl(9), 8)
            ligneTxt = ligneTxt & FormaterTxt(tabEl(10), 10)
            ligneTxt = ligneTxt & FormaterTxt(tabEl(11), 12)
            ligneTxt = ligneTxt & FormaterTxt(tabEl(12), 6)
            ligneTxt = ligneTxt & FormaterTxt(tabEl(13), 6)
        End If
        
        'ajouter la ligne .txt au fichier .txt
        fichierTxt.WriteLine ligneTxt
        
    Wend
    
    'fermer les fichiers
    fichierCsv.Close: fichierTxt.Close
    
    'détrire les objets
    Set myFso = Nothing: Set fichierCsv = Nothing: Set fichierTxt = Nothing
End Sub


'Cette fonction prend en paramètre un texte et une longeur.
'Elle retourne le texte à la longeur spécifiée (tronqué ou complété d'espaces)
Private Function FormaterTxt(texte As String, longueur As Long) As String

    'si le texte est aussi long que la longueur spécifiée
    If Len(texte) = longueur Then
        'renvoyer le texte tel quel
        FormaterTxt = texte: Exit Function
        
    'sinon, si le texte est plus long que la longueur spécifiée
    ElseIf Len(texte) > longueur Then
        'renvoyer le texte tronqué en partant de la gauche
        FormaterTxt = Left(texte, longueur): Exit Function
        
    'sinon, si le texte est moins long que la longueur spécifiée
    ElseIf Len(texte) < longueur Then
        'renvoer le texte complété d'espaces (à gauche)
        FormaterTxt = Strings.String(longueur - Len(texte), " ") & texte: Exit Function
    End If
    
End Function
edit: Salut JNP ;)
a+
 
Dernière édition:

jlppap

XLDnaute Junior
Re : convertir fichier .csv en .txt

Bonjour, et MERCI à vous.

J'ai modifié le fichier joint, il me semble cette fois un peu plus clair.
enfin, je l'espère.

Je vous tiens au courant pour la suite.
 

Pièces jointes

  • TEST_fichier_CSV_en_TXT.zip
    1.2 KB · Affichages: 237
  • TEST_fichier_CSV_en_TXT.zip
    1.2 KB · Affichages: 247
  • TEST_fichier_CSV_en_TXT.zip
    1.2 KB · Affichages: 252
Dernière édition:

JNP

XLDnaute Barbatruc
Re : convertir fichier .csv en .txt

Re :),
A tester
Code:
Sub Test()
Dim MaLigne As String, I As Long, J As Integer, Tableau1, Tableau2
Tableau1 = Split("2;6;6;10;10;30;3;3;6", ";")
Tableau2 = Split("2;6;3;8;12;10;3;3;6;10;10;12;6;6", ";")
'Tableau2 = Split("2;6;3;8;3;8;3;3;8;8;10;12;6;6", ";")
Open "FICHTEST.txt" For Output As #1    ' Ouvre le fichier en écriture.
For I = 1 To Range("A65000").End(xlUp).Row
If Cells(I, 1) = 10 Then
For J = 0 To UBound(Tableau1)
MaLigne = MaLigne & Left(Cells(I, J + 1).Text & String(30, " "), Tableau1(J))
Next J
Else
For J = 0 To UBound(Tableau2)
MaLigne = MaLigne & Left(Cells(I, J + 1).Text & String(12, " "), Tableau2(J))
Next J
End If
Print #1, MaLigne
MaLigne = ""
Next I
Close #1    ' Ferme le fichier.
End Sub
Bonne journée :)
 

Discussions similaires

Statistiques des forums

Discussions
312 492
Messages
2 088 936
Membres
103 987
dernier inscrit
Doctami