Récupérer texte d'un fichier txt et convertir les lignes en tableau Array
7 réponses
Nicolas
Bonjour a tous,
je vous expose ma situation.
1=C2=BA) Le code suivant r=C3=A9cup=C3=A8re le texte complet d'un fichier t=
xt qui contient, dans mon exemple, plus de 18000 lignes.
Dim txtFilePath As String
txtFilePath =3D "C:\Exemples\MonFichier.txt"
Set FSO =3D CreateObject("Scripting.FileSystemObject")
Set Fname =3D FSO.OpenTextFile(txtFilePath)
Texte =3D CStr(Fname.ReadAll)
2=C2=AA) 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=C3=A9rente, dans mon exemple, Range("A1:A18184")
3=C2=BA) Enfin, le code configure une Array avec la zone copi=C3=A9e et rec=
herche une valeur ("993") dans chacune des lignes tu tableau.
Dim tableau As Variant
tableau =3D Selection.Value
For i =3D 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=C3=A9e et de fa=C3=A7on quasi ins=
tantan=C3=A9e.
Cependant je souhaiterais ne pas avoir =C3=A0 passer par le presse-papier e=
t l'utilisation de cellules pour convertir le texte en tableau array, et do=
nc sauter l'=C3=A9tape n=C2=BA2.
J'ai essay=C3=A9 le code suivant, qui marche, mais c'est trop lent !!
For i =3D 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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Michd
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
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
================================================================
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
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
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))
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
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
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.
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
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
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
'------------------------------------------
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
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
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
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
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
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,
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