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

  • Initiateur de la discussion Initiateur de la discussion nikkss
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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.
 
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.
 
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
 
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:
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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour