IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Ventiler mon fichier .csv en plusieurs fichiers .csv [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Ventiler mon fichier .csv en plusieurs fichiers .csv
    Bonjour,

    Je possède un fichier CSV d'une colonne qui contient plus de 5000 lignes et je voudrais créer des nouveaux fichiers CSV avec 249 lignes max à chaque fois dans chaque fichiers. Je n'arrive pas à trouver de solutions à part le faire à la main.. autant dire que c'est un travail pire que laborieux.

    Merci d'avance à ceux qui m'aideront !

    Bonne journée
    XeNoN

  2. #2
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Teste ce qui suit après avoir adapté le chemin et fichier. A mettre dans un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    Sub DecouperFichier()
     
        Dim Tbl()
        Dim Chemin As String
        Dim Fichier As String
        Dim I As Integer
        Dim J As Integer
        Dim K As Integer
     
        'adapter le chemin...
        Chemin = "F:\"
        Fichier = "Texte"
     
        'ouvre pour lecture
        Open Chemin & Fichier & ".txt" For Input As #1
     
        'stocke dans un tableau
        Do While Not EOF(1)
     
            I = I + 1
            ReDim Preserve Tbl(1 To I)
            Input #1, Tbl(I)
     
        Loop
     
        'puis le referme
        Close #1
     
        'défini le nombre de fichiers nécessaires
        If UBound(Tbl) / 248 <> Int(UBound(Tbl) / 248) Then
     
            K = Int(UBound(Tbl) / 248) + 1
     
        Else
     
            K = Int(UBound(Tbl) / 248)
     
        End If
     
        I = 1
     
        'boucle et réparti les valeurs
        For J = 1 To K
     
            Open Chemin & Fichier & "_" & J & ".txt" For Output As #1
     
            'gère l'erreur de l'indice hors tableau
            'sur le dernier fichier
            On Error Resume Next
     
            For I = I To I + 248
     
                Print #1, Tbl(I)
     
            Next I
     
            Close #1
     
        Next J
     
    End Sub
    Hervé.

    Oups,

    Petite erreur sur l'extension .csv et non txt, désolé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    Sub DecouperFichier()
     
        Dim Tbl()
        Dim Chemin As String
        Dim Fichier As String
        Dim I As Integer
        Dim J As Integer
        Dim K As Integer
     
        'adapter le chemin...
        Chemin = "F:\"
        Fichier = "Texte"
     
        'ouvre pour lecture
        Open Chemin & Fichier & ".csv" For Input As #1
     
        'stocke dans un tableau
        Do While Not EOF(1)
     
            I = I + 1
            ReDim Preserve Tbl(1 To I)
            Input #1, Tbl(I)
     
        Loop
     
        'puis le referme
        Close #1
     
        'défini le nombre de fichiers nécessaires
        If UBound(Tbl) / 248 <> Int(UBound(Tbl) / 248) Then
     
            K = Int(UBound(Tbl) / 248) + 1
     
        Else
     
            K = Int(UBound(Tbl) / 248)
     
        End If
     
        I = 1
     
        'boucle et réparti les valeurs
        For J = 1 To K
     
            Open Chemin & Fichier & "_" & J & ".csv" For Output As #1
     
            'gère l'erreur de l'indice hors tableau
            'sur le dernier fichier
            On Error Resume Next
     
            For I = I To I + 248
     
                Print #1, Tbl(I)
     
            Next I
     
            Close #1
     
        Next J
     
    End Sub
    Hervé.

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup Theze pour ton aide et ta super réactivité ! Ca fait plaisir

    J'ai besoin de ce code pour découper plusieurs gros fichiers d'adresse mails.
    Je viens de tester ce code, il marche plutôt bien cependant dans certains fichiers découpés j'ai des lignes avec une partie de l'adresse mail. En l’occurrence seulement lorsque l'adresse mail est composée de chiffres.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    ce.0770578k@xyz.fr
    7223581
    ep@sdds.fr
    br@00.net
    70107
    ct@monde.org
    771464
    771492
    ...

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour,

    voici une variante p'être un poil plus rapide conservant le séparateur de ligne du fichier source,
    n'étant pas forcément celui par défaut de la plate-forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Sub CoupeFichier(ByVal SRC$, MAX%, Optional SEP$ = vbNewLine)
        C& = InStrRev(SRC, "."):  If Dir(SRC) = "" Or C < 2 Or MAX < 1 Then Beep: Exit Sub
        F% = FreeFile
        Open SRC For Input As #F
        TS = Split(Input(LOF(F), #F), SEP)
        Close #F
        MAX = MAX - 1
     
        If UBound(TS) > MAX Then
            EXT$ = Mid$(SRC, C)
             SRC = Left$(SRC, C - 1) & IIf(Mid(SRC, C - 1, 1) = " ", "", " ")
               C = -1
     
            Do
                D& = C + 1
                 C = Application.Min(D + MAX, UBound(TS))
                N& = N& + 1
                ReDim AR(C - D)
                For L& = 0 To C - D:  AR(L) = TS(D + L):  Next
                Open SRC & Format$(N, "00") & EXT For Output As #F
                Print #F, Join(AR, SEP)
                Close #F
            Loop Until C = UBound(TS)
     
            Erase AR
        End If
     
        Erase TS
    End Sub
     
     
    Sub Demo()
        CoupeFichier "D:\Tests\Test .csv", 249
    End Sub
    Les paramètres de la procédure sont dans l'ordre le fichier source, le nombre maximum de lignes
    et en option le séparateur de ligne, par défaut celui de la plate-forme …

    Je vais bientôt être Off-Line jusqu'en milieu d'après-midi …

    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Merci Marc-L pour ton update elle fonctionne très bien, il n'y a plus aucun bugs.

    Theze & Marc-L vous m'avez bien aidé sur ces découpes, je vous remercie une nouvelle fois et vous souhaite une bonne journée !

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    En fait il n'y en a jamais de bug vu que c'est mon Yop code !
    Je ne suis pas parti du code d'Hervé mais t'ai proposé une autre approche, à ma sauce quoi …

    Et ne pas oublier de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    … sinon la prochaine fois tu restes dans ton jus !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #7
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2018
    Messages : 1
    Points : 2
    Points
    2
    Par défaut Question?
    Bonsoir,
    Je me permets de vous envoyer ce petit message car j'ai testé cette macro avec succès sauf que dans mon cas j'ai des fichiers scindés faux.
    Je m'explique, la premiere colonne de mon csv à splitter comporte des "0" et la macro n'aime pas du tout.
    J'ai un résultat de sortie incoherent et faux.
    Quelle serait selon-vous la manip à effectuer pour que cette dernière fonctionne avec une première colonne remplie de 0 ?
    merci par avance
    Lionel





    Citation Envoyé par Theze Voir le message
    Bonjour,

    Teste ce qui suit après avoir adapté le chemin et fichier. A mettre dans un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    Sub DecouperFichier()
     
        Dim Tbl()
        Dim Chemin As String
        Dim Fichier As String
        Dim I As Integer
        Dim J As Integer
        Dim K As Integer
     
        'adapter le chemin...
        Chemin = "F:\"
        Fichier = "Texte"
     
        'ouvre pour lecture
        Open Chemin & Fichier & ".txt" For Input As #1
     
        'stocke dans un tableau
        Do While Not EOF(1)
     
            I = I + 1
            ReDim Preserve Tbl(1 To I)
            Input #1, Tbl(I)
     
        Loop
     
        'puis le referme
        Close #1
     
        'défini le nombre de fichiers nécessaires
        If UBound(Tbl) / 248 <> Int(UBound(Tbl) / 248) Then
     
            K = Int(UBound(Tbl) / 248) + 1
     
        Else
     
            K = Int(UBound(Tbl) / 248)
     
        End If
     
        I = 1
     
        'boucle et réparti les valeurs
        For J = 1 To K
     
            Open Chemin & Fichier & "_" & J & ".txt" For Output As #1
     
            'gère l'erreur de l'indice hors tableau
            'sur le dernier fichier
            On Error Resume Next
     
            For I = I To I + 248
     
                Print #1, Tbl(I)
     
            Next I
     
            Close #1
     
        Next J
     
    End Sub
    Hervé.

    Oups,

    Petite erreur sur l'extension .csv et non txt, désolé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    Sub DecouperFichier()
     
        Dim Tbl()
        Dim Chemin As String
        Dim Fichier As String
        Dim I As Integer
        Dim J As Integer
        Dim K As Integer
     
        'adapter le chemin...
        Chemin = "F:\"
        Fichier = "Texte"
     
        'ouvre pour lecture
        Open Chemin & Fichier & ".csv" For Input As #1
     
        'stocke dans un tableau
        Do While Not EOF(1)
     
            I = I + 1
            ReDim Preserve Tbl(1 To I)
            Input #1, Tbl(I)
     
        Loop
     
        'puis le referme
        Close #1
     
        'défini le nombre de fichiers nécessaires
        If UBound(Tbl) / 248 <> Int(UBound(Tbl) / 248) Then
     
            K = Int(UBound(Tbl) / 248) + 1
     
        Else
     
            K = Int(UBound(Tbl) / 248)
     
        End If
     
        I = 1
     
        'boucle et réparti les valeurs
        For J = 1 To K
     
            Open Chemin & Fichier & "_" & J & ".csv" For Output As #1
     
            'gère l'erreur de l'indice hors tableau
            'sur le dernier fichier
            On Error Resume Next
     
            For I = I To I + 248
     
                Print #1, Tbl(I)
     
            Next I
     
            Close #1
     
        Next J
     
    End Sub
    Hervé.

  8. #8
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, tu pourrais tenter Découpage d'un fichier csv (1) en l'adaptant à ton cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir CSV en plusieurs fichiers HTML
    Par lmplmp dans le forum Débuter
    Réponses: 6
    Dernier message: 07/06/2012, 16h56
  2. [MySQL] Export CSV de plusieurs fichiers
    Par yamatoshi dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 08/03/2012, 16h50
  3. Réponses: 10
    Dernier message: 27/02/2009, 17h19
  4. Couper un fichier html en plusieurs fichiers
    Par Petitcodeur dans le forum Langage
    Réponses: 9
    Dernier message: 16/10/2006, 15h27
  5. Générer plusieurs fichiers à partir d'un fichier excel
    Par yas2006 dans le forum Documents
    Réponses: 3
    Dernier message: 02/06/2006, 17h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo