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 :

Split de fichiers ".csv" [XL-2019]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Par défaut Split de fichiers ".csv"
    Bonjour a tous

    je soumets, mon problème

    j'ai un fichier général csv que je splitte, du a sa lourdeur de 183ko l'équivalent de 1320 lignes.

    je split se fichier avec le logiciel tiers qui s'appelle "csvsplitter", qui me le fait en 3 autres fichiers de 62ko 'équivalent de 440 lignes jusque là, sans problème

    l'encodage est UTF-8


    ma question, est de savoir; comment je peux intégrer Le caractère EOF(1) qui est un caractère spécial qui marque la fin d'un fichier csv??

    et c'est indispensable, dans les fichiers csv

    parce que , quand j'ai splité , mes fichiers, cela me pose problème, quand je fais l'import dans mon Excel ??



    merci , pour vos conseils

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    976
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 976
    Par défaut
    Bonjour, le caractère EOF n'est généralement pas nécessaire dans les fichiers CSV, car la fin d'un fichier est déterminée par la fin du flux de données lui-même. J'ai bien vérifié quelques fichiers .csv dont je dispose et ils se terminent par CR+LF et Excel les importe sans problème.

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 181
    Par défaut
    Hello, tu peux essayer ce code qui découpe un fichier csv avec un nombre de lignes en paramètre et le fichier est demandé :
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    Sub SplitTextFile(nblignes As Integer)
    'Splits a text or csv file into smaller files
    'with a user defined number (max) of lines or
    'rows. The new files get the original file
    'name + a number (1, 2, 3 etc.).
     
    Dim sFile As String  'Name of the original file
    Dim sText As String  'The file text
    Dim lStep As Long    'Max number of lines in the new files
    Dim vX, vY           'Variant arrays. vX = input, vY = output
    Dim iFile As Integer 'File number from Windows
    Dim lCount As Long   'Counter
    Dim lIncr As Long    'Number for file name
    Dim lMax As Long     'Upper limit for loop
    Dim lNb As Long      'Counter
    Dim lSoFar As Long   'How far did we get?
     
     
    On Error GoTo ErrorHandle
     
     
    'Select a file
    sFile = Application.GetOpenFilename()
     
     
    'If the user cancelled
    If sFile = "False" Then Exit Sub
     
     
    'Ask the user for max number of lines per file. E.g. 65536
    lStep = nblignes
     
     
    'Our arrays have zero as LBound, so we subtract 1
    lStep = lStep - 1
     
     
    'Read the file text to sText
    sText = _
    CreateObject("Scripting.FileSystemObject").OpenTextFile(sFile).ReadAll
     
     
    'Put the text into the array vX. CrLf chars (new
    'line) will add a new row to the array.
    vX = Split(sText, vbCrLf)
    'If Carriage return–linefeed doesn't work try only linefeed :
    'vX = Split(sText, vbLf)
     
     
    'Free memory
    sText = ""
     
     
    'Now we start a loop that will run until all
    'rows in the array have been read and saved
    'into new files. The variable lSoFar keeps
    'track of how far we are in vX.
    Do While lSoFar < UBound(vX)
       'If the number of rows minus lSoFar is
       'bigger than max number of rows, the
       'array vY is dimensioned to max number
       'of rows.
       If UBound(vX) - lSoFar >= lStep Then
          ReDim vY(lStep)
          'lMax is set = last rownumber to be
          'copied to vY.
          lMax = lStep + lSoFar
       Else
          'Else we dimension vY to the number of
          'rows left.
          ReDim vY(UBound(vX) - lSoFar)
          'Last row to copy is last row in vX
          lMax = UBound(vX)
       End If
     
       lNb = 0
       'Now we copy the rows from vX to vY
       For lCount = lSoFar To lMax
          vY(lNb) = vX(lCount)
          lNb = lNb + 1
       Next
     
       'lSoFar keeps track of how far we got in vX
       lSoFar = lCount
     
       'Get a free file number
       iFile = FreeFile
     
       'Increment the number for the new file name
       lIncr = lIncr + 1
     
       'Save vY as a text file (.txt). It could also be a csv-file,
       'but then you need to replace txt with csv.
       Open sFile & "-" & lIncr & ".csv" For Output As #iFile
          'The Join function makes a text
          'string from the array elements.
          Print #iFile, Join$(vY, vbCrLf)
       Close #iFile
    Loop
     
     
    Erase vX
    Erase vY
     
     
    Exit Sub
    ErrorHandle:
    MsgBox Err.Description & " Procedure SplitTextFile"
    End Sub
     
     
    Sub TestSplitCSV()
      SplitTextFile (440)
    End Sub
    Ami calmant, J.P

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Par défaut
    bonsoir à Franc, et Jurassic pork, de leurs participations


    merci , de cette remarque Franc, Haaaa.. bon..??, alors ma question est la suivante, et qui est cruciale ??

    peux tu me dire, au moment d'un traitement d'import; à l'ouverture du dis fichier nous avons

    la fameuse ligne de code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      " Do While Not EOF(1)"...ect ect       
     
    soit le plus souvent  c'est  
     
    Open fichier For Input As #1  
        Do While Not EOF(1)
            Line Input #1, texte .....  ect ect ..
    le canevas est le suivant, et je dis tant que la dernière ligne n'est pas atteinte (Do While Not EOF(1)) ...ect ect
    mais justement, je me dis , que je n'est pas le control de fin de fichier EOF(1) à la fin , qui fait que mon import plante ??selon vous

    est ce que je dois le comprendre, comme ça?? puisque je fais un visuel, du fichier splitté, certes je vois un dernier ";"

    mais le caractère spécial EOF(1) , est souvent matérialisé par un retour à la ligne ??
    ok à jurassic pork , je vais essayer son code VBA, et franc; voila m'ont interrogation ci-dessus .
    peut être, que je me disperse trop, et me recentrer sur l'essentiel
    merci

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 466
    Par défaut
    Salut,

    Petite précision:
    Dans cet extrait de code, EOF(1) est une fonction prenant en paramètre l'identifiant d'un descripteur de fichier, et testant si la fin de fichier a été atteinte.
    Rien a voit avec le caractère EOF que l'on trouves dan les tables ASCII.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Par défaut
    bonjour, et merci a deedolith de sa participation a se post

    effectivement, je confirme bien, ton affirmation quand tu dis " Dans cet extrait de code, EOF(1) est une fonction prenant en paramètre l'identifiant d'un descripteur de fichier, et testant si la fin de fichier a été atteinte.

    pour l'avant traitement de mon import , et avoir compris pour la 2iem remarques.

    c'est que j'ai retesté mon import avec mon gros fichier .csv , ok nickel cela passe; et mon but, comme celui-ci est trop important, de l'avoir splitter avec cvssplitter" en 3 fichiers , et avoir coché l'option "garder la ligne d'entête" et


    les intégrer pour les 3 nouveaux fichiers, comme a l'identique du fichier source . et en faisant, mon test , avec mon premier fichier splitté, moins lourd, c'est ou que mon avant traitement d'import plante ... voila ma situation , et

    avoir peut-être été dans une mauvaise direction, donc l'origine de mon post ...selon vous ?? merci


    ensuite, oui j'ai testé ta procédure jurrassic pork, faudrait que je creuse un peu plus, il me met " fichier incompatible" comme erreur; et pourtant c'est bien un fichier ".csv" à l'origine ....

  7. #7
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 249
    Par défaut
    Bonjour
    Vous écrivez
    "j'ai un fichier général csv que je splitte, du a sa lourdeur de 183ko l'équivalent de 1320 lignes."

    Je confirme ce qu'écrit Philippe : Power Query est l'outil adapté

    Pour info, je viens de traiter ce matin un fichier csv de 170 Mo, 3,3 millions de lignes en 30 secondes (fichier stocké sur un serveur - et j'ai un PC "normal" qui n'est plus de première jeunesse).
    Dans mon cas, pour analyser ce fichier j'ai choisi une restitution en TCD et non en tableau car évidemment il ne tient pas dans une feuille Excel.

    avec un stockage local, c'est encore plus rapide.

    Stéphane

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/08/2006, 09h14
  2. Enregistrement fichier excel dans une base mysql (pas csv)
    Par morph12345 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 27/03/2006, 10h01
  3. [Excel] séparateur pour les fichiers csv
    Par drinkmilk dans le forum Excel
    Réponses: 2
    Dernier message: 27/08/2005, 14h21

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