Récupérer texte d'un fichier txt et convertir les lignes en tableau Array

Le
Nicolas
Bonjour a tous,

je vous expose ma situation.

1º) Le code suivant récupère le texte complet d'un fichier t=
xt qui contient, dans mon exemple, plus de 18000 lignes.

Dim txtFilePath As String
txtFilePath = "C:ExemplesMonFichier.txt"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Fname = FSO.OpenTextFile(txtFilePath)
Texte = CStr(Fname.ReadAll)

2ª) Ensuite, le code copie le texte dans le presse papier afin de le c=
opier dans une feuille "vierge" et reporte chaque ligne du fichier txt dans=
une cellule différente, dans mon exemple, Range("A1:A18184")

Presse_Papier CStr(Texte)

ThisWorkbook.Activate
Sheets("TEMP").Select
Range("A1").Select

ActiveSheet.Paste

3º) Enfin, le code configure une Array avec la zone copiée et rec=
herche une valeur ("993") dans chacune des lignes tu tableau.

Dim tableau As Variant
tableau = Selection.Value

For i = 1 To UBound(tableau, 1)
If InStr(1, tableau(i, 1), "993") <> 0 Then Debug.Print tableau(i, 1)
Next i

Question:
Le code me procure l'information recherchée et de façon quasi ins=
tantanée.
Cependant je souhaiterais ne pas avoir à passer par le presse-papier e=
t l'utilisation de cellules pour convertir le texte en tableau array, et do=
nc sauter l'étape nº2.

J'ai essayé le code suivant, qui marche, mais c'est trop lent !!

For i = 1 To UBound(Split(Texte, Chr(10)))
If InStr(1, Split(Texte, Chr(10))(i), "993") <> 0 Then Debug.Print Split(=
Texte, Chr(10))(i)
Next i

Merci d'avance pour votre aide,

A bientôt

Nicolas
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michd
Le #26474748
Bonjour,
À partir de ce que j'ai compris, la procédure proposée copie le fichier texte dans la feuille de ton
classeur à partir de la cellule que tu spécifieras dans la procédure. Pour rechercher une expression
dans la plage de cellule, j'ai ajouté quelques lignes de code, à toi d'adapter...
'---------------------------------------------------------------
Sub test()
Dim Temp As String, Expression As String
Dim FichierTexte As String, Adr As String
Dim X As Long, T As Variant
Dim Rg As Range, Trouve As Range
'Chemin + nom du fichier
FichierTexte = "F:Documentstest.txt"
X = FreeFile
Open FichierTexte For Binary Access Read As #X
Temp = String(LOF(X), Chr(0))
Get #X, , Temp
Close #X
T = Split(Temp, vbCrLf)
'Nom de la feuille est l'adresse de la cellule à adapter
With Worksheets("Feuil1")
.Range("A1").Resize(UBound(T) + 1) = Application.Transpose(T)
Set Rg = .Range("A1").Resize(UBound(T) + 1)
End With
Application.EnableEvents = False
Application.ScreenUpdating = False
'Pour rechercher un mot ou une expression
Expression = "toto"
With Rg
Set Trouve = .Find(What:=Expression, LookIn:=xlValues, lookAt:=xlPart)
If Not Trouve Is Nothing Then
Adr = Trouve.Address
Do
'Le code pour ce que tu veux faire pour toutes les lignes
'qui renferment l'expression recherchée
MsgBox "Ligne : " & Trouve.Row & vbCrLf & _
Trouve.Value
Set Trouve = .FindNext(Trouve)
Loop Until Trouve.Address = Adr
End If
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'---------------------------------------------------------------
IL fut adapté cette section, si tu remplaces l'expression recherchée, à titre d'exemple, remplacer
chaque occurence de "toto" par "titi"
'Pour rechercher un mot ou une expression
Expression = "toto"
With Rg
Set Trouve = .Find(What:=Expression, LookIn:=xlValues, lookAt:=xlPart)
If Not Trouve Is Nothing Then
Adr = Trouve.Address
Do
'Le code pour ce que tu veux faire pour toutes les lignes
'qui renferment l'expression recherchée
' MsgBox "Ligne : " & Trouve.Row & vbCrLf & _
Trouve.Value
Trouve.Replace "toto", "titi", xlPart
Set Trouve = .FindNext(Trouve)
Loop Until Trouve Is Nothing
End If
End With
================================================================
MichD
Nicolas
Le #26474767
Merci beaucoup pour ta réponse MichD,
Elle m'a été très utile.
Ce que je cherchai à éviter dans ce cas précis, c'était l'utilisation de cellules pour convertir directement mon Texte (=String) en Tableau (=Variant).
Grâce à ta réponse, j'y suis parvenu en écrivant...
Dim Tableau As Variant
Tableau = Application.Transpose(Split(Texte, vbCrLf))
À bientôt et encore merci
Nicolás
Nicolas
Le #26474773
En faisant des preuves je m'aperçois que :
Application.Transpose(Split(Text, vbCrLf))
ne fonctionne pas si le fichier texte contient plus 65536 lignes.
¿ de quelle façon puis je adapter ce code pour obtenir un Array à partir d'un fichier Texte qui contient plus de 65536 lignes ?
PD: j'ai lancé la procédure depuis un fichier xlsm et j'ai obtenu le même résultat.
A bientôt et encore merci
Nicolas
Michd
Le #26474782
Essaie comme ceci, par une simple boucle.
Comme tu es en mémoire vive, c'est très rapide...
Exemple : Attention à la déclaration des variables!
'------------------------------------------
Sub test()
Dim A As Long, T As Variant
Dim Tableau()
texte = "toto est beau" & vbCrLf & "toto est beau"
T = Split(texte, vbCrLf)
ReDim Preserve Tableau(0 To UBound(T))
For A = 0 To UBound(T)
Tableau(A) = T(A)
Next
End Sub
'------------------------------------------
Michd
Nicolas
Le #26474794
C'est parfait,
encore merci
Nicolas
Michd
Le #26474798
Je te fais remarquer que la variable "Tableau" est identique à la variable "T".
Tu pourrais avoir simplement une procédure de ce type :
Seule cette ligne de code serait suffisante :
Tableau = Split(texte, vbCrLf)
C'est beaucoup plus rapide, plus simple... cela dépend
de ce que tu veux faire...
'----------------------------------------
Sub test()
Dim A As Long, T As Variant
Dim Tableau As Variant
texte = "toto est beau0" & vbCrLf & "toto est beau1"
T = Split(texte, vbCrLf)
'Tu peux copier le tableau T vers la variable Tableau
'de cette manière
Tableau = T
'Un petit test, le contenu des 2 variables est le même!
For A = 0 To 1
MsgBox Tableau(A)
MsgBox T(A)
Next
End Sub
'----------------------------------------
MichD
Nicolas
Le #26474869
Simple et précis et effectivement très rapide: un test lancé sur un fichier txt de + de 260.000 lignes a mis à peine plus d'une se conde,
exactement ce que je cherchai.
Merci encore
Nicolas
Publicité
Poster une réponse
Anonyme