XL 2019 Renommer en masse les titres de colonne des .CSV

Amilo

XLDnaute Accro
Bonjour le forum,

J'ai un dossier "CSV Test" contenant 2 sous-dossiers "2021" et "2022".
Dans chaque sous-dossier se trouvent des dossiers mensuels "01", "02", "03"...dans lequel j'ai un fichier au format .csv

J'aimerais svp remplacer dans tous les fichiers sources, les 5 titres des colonnes :

Par exemple : Mois,Lieu,Article,Quantités,Montant,Code par Date,Ville,Marchandise,Quantités,Vente,Référence

En vous remerciant par avance

Cordialement
 

Pièces jointes

  • CSV Test.zip
    3.4 KB · Affichages: 7

patricktoulon

XLDnaute Barbatruc
tiens la lecture est en utf-8 cette fois ci
0.007 secondes pour modifier tout ton dossier
VB:
Option Explicit

Const oldChaine As String = "Mois,Lieu,Article,Quantités,Montant,Code"


Const NewChaine As String = "Date,Ville,Marchandise,Quantités,Vente,Référence"

Sub choix_dossier()
    Dim Dossier
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = -1 Then Dossier = .SelectedItems(1)
        If Dossier = "" Then Exit Sub
    End With
    replaceAllCsvHeader Dossier
MsgBox " Remplacement du Header dans les CSVs terminé"
End Sub

Function replaceAllCsvHeader(Dossier)
    Dim FsO As Object, fich, x&, subdossier, contenu As String
 
    Set FsO = CreateObject("Scripting.FileSystemObject")
    Set Dossier = FsO.GetFolder(Dossier)
     For Each fich In Dossier.Files
      
        'lecture
        With CreateObject("ADODB.Stream")
            .Charset = "utf-8": .Open: .LoadFromFile (fich): contenu = .ReadText()
        End With
          'ecriture
        x = FreeFile: Open fich For Output As #x: Print #x, Replace(contenu, oldChaine, NewChaine): Close #x
    Next
     For Each subdossier In Dossier.subfolders
        replaceAllCsvHeader subdossier.Path
    Next subdossier
    Set FsO = Nothing

End Function
@sylvanu tu veux bien tester ?
 

Amilo

XLDnaute Accro
merci @patricktoulon ,

dans tout les cas ils vont te poser probleme
peut etre vaudrais il mieux les remastériser avant de les mofifier

mais je suis pas étonné
avec quoi ils on été générés ces csv ?

Pour répondre à votre questions et à votre remarque :

Les .csv sont des fichiers que j'avais téléchargés sur le net dans un exercice sur power query,
Comme il s'agit d'un simple exercice et concernant un éventuel problème, je ne vais pas plus loin que des manipulations dans power query.

Edit : oups je viens de voir votre précédent message, je vais tester également, merci

Cordialement
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
@patricktoulon
Je pense pourtant avoir fait la bonne manip.
Mais après test,
1- L' entête n'est pas modifiée avec la nouvelle chaine ( qui doit commencer par Date,Ville... )
2- le "é" de quantités est remplacé par "?"
1668334414580.png
 

patricktoulon

XLDnaute Barbatruc
re
avec le nouveau code ?tu n'apas le replace ??????:oops:
et oui alors le bom a bien été supprimé mais subsiste quelques caractères invisibles dans notepad
vraiment bizarre ces fichiers moitié utf-8 moitié ansi 😂

peut être réécriture en utf-8 pour rester dans le ton des fichiers

après si 3 pc différents interprètent le fichier différemment c'est un vrai problème
 

patricktoulon

XLDnaute Barbatruc
ok ben on reste en utf-8 alors

VB:
Option Explicit

Const oldChaine As String = "Mois,Lieu,Article,Quantités,Montant,Code"


Const NewChaine As String = "Date,Ville,Marchandise,Quantités,Vente,Référence"

Sub choix_dossier()
    Dim Dossier
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = -1 Then Dossier = .SelectedItems(1)
        If Dossier = "" Then Exit Sub
    End With
    replaceAllCsvHeader Dossier
    MsgBox " Remplacement du Header dans les CSVs terminé"
End Sub

Function replaceAllCsvHeader(Dossier)
    Dim FsO As Object, fich, x&, subdossier, contenu As String

    Set FsO = CreateObject("Scripting.FileSystemObject")
    Set Dossier = FsO.GetFolder(Dossier)
    For Each fich In Dossier.Files

        'lecture
        With CreateObject("ADODB.Stream")
            .Charset = "utf-8": .Open: .LoadFromFile (fich): contenu = .ReadText()
        End With
        
        'ecriture
        With CreateObject("ADODB.Stream")
            .Type = 2: .Charset = "utf-8": .Open: .WriteText Replace(contenu, oldChaine, NewChaine)
            .SaveToFile fich, 2
        End With
    
    Next
    For Each subdossier In Dossier.subfolders
        replaceAllCsvHeader subdossier.Path
    Next subdossier
    Set FsO = Nothing

End Function
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
La conversion se fait correctement, sans les guillemets.
Par contre j'ai un souci.
Si je lance sur ce dossier j'ai cette erreur:
1668336273713.png

1668336305061.png

( les fichiers sont sous CSV Test\2021\01 )

Par contre si je lance un niveau en dessous alors c'est ok.
1668336341693.png

J'ai l'impression qu'il n'analyse qu'à un niveau en dessous.
 

patricktoulon

XLDnaute Barbatruc
regarde dans la console si tout les noms de fichiers ressorte
VB:
Option Explicit

Const oldChaine As String = "Mois,Lieu,Article,Quantités,Montant,Code"


Const NewChaine As String = "Date,Ville,Marchandise,Quantités,Vente,Référence"

Sub choix_dossier()
    Dim Dossier
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = -1 Then Dossier = .SelectedItems(1)
        If Dossier = "" Then Exit Sub
    End With
    replaceAllCsvHeader Dossier
    MsgBox " Remplacement du Header dans les CSVs terminé"
End Sub

Function replaceAllCsvHeader(Dossier)
    Dim FsO As Object, fich, x&, subdossier, contenu As String

    Set FsO = CreateObject("Scripting.FileSystemObject")
    Set Dossier = FsO.GetFolder(Dossier)
    For Each fich In Dossier.Files

       debug.print fich
    
    Next
    For Each subdossier In Dossier.subfolders
        replaceAllCsvHeader subdossier.Path
    Next subdossier
    Set FsO = Nothing

End Function
 

Amilo

XLDnaute Accro
@patricktoulon ,

Cela fonctionne également lorsque je sélectionne tout le répertoire "2021", cela opère bien les modifications dans tous les fichiers mensuels (testé avec votre code du message #21)
Lorsque je sélectionne le dossier maître "CSV Test", je reçois le message d'erreur évoqué par sylvanu dans son message #22,

Edit : finalement, en plaçant le fichier .xlsm en dehors du dossier "CSV Test", cela a très bien fonctionné pour l'ensemble des sous-dossiers.
Probablement que cette information m'avait échappé au départ.

Merci à vous, sylvanu et patricktoulon,
Vos 2 solutions répondent à ma demande, une avec les guillemets et une autre sans les guillemets

Bon dimanche à tous

Cordialement
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
a ben c'est sur si vous choisissez le zip pour folder on va avoir un problème de récursivité
et pour cause (et c'est normal) on se retrouve dès le 2d avec un "fich" avec deux fois le debut de l'adresse du fichier
si vous voulez garrder le dossier dans le zip dans les ressources j'ai placé une fonction dir récursive dans les fichiers zip
 

Discussions similaires

Statistiques des forums

Discussions
312 177
Messages
2 085 973
Membres
103 073
dernier inscrit
MSCHOE16