Récupérer nombre de lignes d'un csv sans l'ouvrir

nikkss

XLDnaute Nouveau
Bonjour le forum,

Je dois récupérer le nombre de ligne total de plusieurs .csv contenus dans un répertoire. Je sais le faire en ouvrant chaque fichier. Cependant j'ai parfois des fichiers très lourds, ce qui prend un temps monstre à ouvrir, voir impossible si celui-ci fait plus d'1 millions de lignes.

J'aimerai donc réaliser la même manip mais sans ouvrir les fichiers .csv
Quelqu'un a une idée?

Merci pour votre aide.
 

Dranreb

XLDnaute Barbatruc
Re : Récupérer nombre de lignes d'un csv sans l'ouvrir

Bonjour.
Sans les ouvrir du tout, la seule chose que vous pouvez connaître c'est leurs tailles en octets au moyen de la fonction FileLen.
Maintenant l'instruction Open de VBA est quasi instantanée, Close aussi, et des Line Input effectués et comptés While Not Eof(1) ne devraient pas être trop longs en général, en tout cas moins long qu'une ouverture en tant que classeur texte dans Excel.
 

MJ13

XLDnaute Barbatruc
Re : Récupérer nombre de lignes d'un csv sans l'ouvrir

Bonjour nikkss, Bernard

J'ai retrouvé un code comme proposé par Bernard, à l'adapter au nom du csv.

Avec 1 fichier de 860 000 lignes, il le traite en 1,35 secondes.

Code VBA:
Sub Extrait_txt_MetaContent()
t1 = Timer
Close
NomFAO = "C:\temp\Fichier.txt"
Open NomFAO For Input As #1
j = 1
While Not (EOF(1))
Input #1, a$
i = i + 1
Wend
Close
MsgBox i & " lignes en " & Timer - t1 & "secondes"
End Sub
 

MichD

XLDnaute Impliqué
Re : Récupérer nombre de lignes d'un csv sans l'ouvrir

Bonjour,

Tu peux le faire avec ADO
À ton projet VBA, tu dois ajouter la référence :"Microsoft Activex Data Objects 2.8 Library"
Barre des menus / outils / références / et tu coches la référence mentionnée.


Exemple de code :

L'icône dans le texte : à la place de l'icône, c'est un point-virgule délimité par des parenthèses

VB:
Sub Exemple()
    Dim Cn As ADODB.Connection
    Dim FichierCSV As String, Dossier As String
    Dim texte_SQL As String
    Dim Rst As ADODB.Recordset
  
    'Répertoire du fichier
    Dossier = "C:\Users\profile\Downloads\" 'penser à terminer par un \
    'Nom du fichier .csv
    FichierCSV = "test.CSV" 'penser à l'extension .csv
 
    Set Cn = New ADODB.Connection
    Cn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Dossier & _
         ";Extended Properties=""text;HDR=Yes;FMT=Delimited(;)""" & _
         ";Persist Security Info=False"
    Cn.ConnectionTimeout = 40
    Cn.Open
    '-----------------
    texte_SQL = "SELECT * FROM " & FichierCSV
 
    Set Rst = New ADODB.Recordset
    Rst.Open texte_SQL, Cn, adOpenStatic, adLockReadOnly
    MsgBox Rst.RecordCount & " nombre de lignes."
 
    Rst.Close
    Set Rst = Nothing
    Cn.Close
    Set Cn = Nothing
End Sub
'---------------------------------------------------------
 
Dernière édition:

PMO2

XLDnaute Accro
Re : Récupérer nombre de lignes d'un csv sans l'ouvrir

Bonjour,

Une autre approche en utilisant un Stream ADO
Code:
Sub aa()
MsgBox GetNbLignes("C:\0.csv") 'à adapter chemin et nom du fichier csv
End Sub

Function GetNbLignes(PathCSV As String) As Long
Dim myStream
Dim A$
'---
Set myStream = CreateObject("ADODB.Stream")
With myStream
  .Charset = "utf-8"
  .Open
  .LoadFromFile (PathCSV)
  A$ = .ReadText()
End With
'---
GetNbLignes = Len(A$) / InStr(1, A$, vbLf)
End Function
 

Discussions similaires

Statistiques des forums

Discussions
312 247
Messages
2 086 585
Membres
103 247
dernier inscrit
bottxok