1ère : Comment lire un Fichier Texte ligne par ligne et le mettre dans une Feuille Excel ?
2ème : Comment gérer un fichier qui possède différents type de séparateur de données afin de différencier dans une ligne différentes catégories de données ?
Je m'explique : Je voudrais interpréter un fichier ou les données sont séparés par des ";" et parfois par des "//1//" afin d'indiquer qu'on passe à un nouveau type de données ou ces données sont également séparé par des ";". Le but est pour moi de pouvoir récupérer dans excel seulement les données des type de données que je souhaite et ne pas récupérer les autres.
Exemple de fichier texte :
toto;tutu;titi;tata//1//10;12;13;15//1//lolo;lulu;lili;lala//1//maison;immeuble;maison
A voir également:
Vba lire fichier texte avec séparateur
Vba lire fichier texte ligne par ligne - Meilleures réponses
Salut
Bah les fichiers de données séparées par des marqueurs, c'est une structure CSV.
Par contre, tu ne pourras lui dire de séparer un coup avec un ; et en même temps aussi avec //1//.
Il faudra le faire en deux étapes :
- Tu lis/charges le fichier avec séparateur ";"
- Tu analyses ensuite chaque cellule à la recherche des //1// et tu isoles les données internes.
Pour cette deuxième étape, il faudra passer par une macro et faire une boucle qui devra chercher :
Dans quelle cellule apparait le 1er //1//
Dans quelle cellule apparait le //1// suivant et concaténer les données situées entre deux.
et ainsi de suite.
Va falloir utiliser les fonctions de recherche de texte VBA (langage macro) ou celle de VB (instr, left, right, mid ...)
Ou ... faire l'inverse :
- Charger le fichier avec séparateur //1//
- puis découper les données de chaque cellule avec le ";"
Ce sera peut être plus simple à faire ... bof
Beau casse tête !
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Champion du monde de boule de cristal - 2005 Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Salut,
Si on suis la logique du truc il faut d'abord eclater les lignes en fonction des "//1//" , puis parser les ";" avec split
Pour pas que tu te fatigues trop :
Sub TesterImport()
ImporterFichierDeDaube "c:\Fichiertexte.txt"
End Sub
Sub ImporterFichierDeDaube(NomDuFichier As String)
Dim ligne As String, Position As Integer, data As String
Dim fichiertempo As String
'Ouverture du fichier à lire
On Error GoTo FermezTout
Open NomDuFichier For Input As #1
'Ouverture du fichier temporaire
fichiertempo = "c:\FichierTemp.txt"
Open fichiertempo For Output As #2
While Not EOF(1)
Input #1, ligne
Position = 1
Do
'Debug.Print ligne
Position = 1
Position = InStr(Position, ligne, "//1//")
Debug.Print Position
If Position > 0 Then
'extraction de la ligne à séparateurs
data = Left(ligne, Position - 1)
Debug.Print data
'rognage de ligne pour ne garder ce qui reste à "découper"
ligne = Right(ligne, Len(ligne) - Position - Len("//1//") + 1)
Debug.Print "ligne= " + ligne
'Ecriture dans le fichier temportaire
Print #2, data
End If
Loop While Len(ligne) > 0 And Position > 0
If ligne <> "" Then Print #2, ligne
Wend
Close #2
Close #1
'Importation du fichier temporaire
'Pour l'exemple l'import se fait dans la feuille active
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & NomDuFichier , _
Destination:=Range("A1"))
.Name = "FichierTemp"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlWindows
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1)
.Refresh BackgroundQuery:=False
End With
'On efface le fichier temporaie paskeu on en a pu besoing
Kill(FichierTempo)
'-----------------------------------------------------------
GoTo Fin
FermezTout:
If FreeFile() = 3 Then
Close #2
End If
If FreeFile() = 2 Then
Close #1
End If
Fin:
End Sub
Le Split c'était une blague.
D'autre part j'ai fait une petite erreur dans le nom du fichier à importer :
With ActiveSheet.QueryTables.Add(Connection:= "TEXT;" & fichiertempo , _
Sinon, si tu ne veux tester les données tu inseres un controle sur la variable data du genre :
...
'Ecriture dans le fichier temportaire
if ControlerData(data) =true then
Print #2, data
end if
...
Pareil sur la ligne :
If ligne <> "" And ControlerData(ligne) = True Then Print #2, ligne
Dans la fonction controlerdata() tu fait une verif en récupérant les données dans un tableau exemple :
Function ControlerData(data As String) As Boolean
Dim montableau() As String
montableau = Split(data, ";")
Debug.Print montableau(0) & "..."
If Not IsNumeric(Left(montableau(0), 1)) Then
ControlerData = False
Exit Function
End If
ControlerData = True
End Function
Voila, j'ai passé en deux jours, au moins 60 minutes pour un parfait inconnu à développer un code qui ne me servira jamais à rien !!
Enfoncés MSF !!
J'ai mal compris la finalité, notamment en ce qui concerne les différents "types de données", mais celà n'est que secondaire.
L'utilisation de la fonction split devrait te servir, d'abord pour "éclater" les expressions séparées par des ";" puis, en leur sein , pour "éclater les expressions séparées par "//1//"
tu pourrais revenir avec un code d'essai sur ces bases ...
T'en fait pas, une seule validation fait parfaitement l'affaire (celle qui t'aide le plus, donc ici Jack). J'en ai vu qui validaient à coup de 20 réponses, c'est inutile
Bons tests !
@++
--Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
Ok pour ton code c'est sympa de penser à ne pas pas trop me fatiguer.
Bon alors je l'ai essayer, il importe bien mais données mais il garde les //1// dans les données. De plus je ne vois pas comment dans ton code je peut gérer les données situé entre chaque //1// (càd chaque groupe de données) afin de savoir si oui ou non je les récupère ou non.
Autre chose tu a parlé de split avant de me donner ton code, mais je n'en vois pas dans celui-ci ?
Ok c'est super sympa de prendre du temps pour mon code. Ca m'aide bien.
Bon alors effectivement en ouvrant le fichier tempo au lieu d ela source ca va mieux. les //1// disparaisse bien.
Par contre maintenant j'ai un pb avec les données qui sont des chiffres décimaux. Les virgules sont interpréter comme des retours à la ligne. Du coup ca me donne un résultat traiter n'importe comment.
En fait c'est au niveau de la ligne Input #1, ligne que ca merde.
Le prog ne stock pas tout dans la variable ligne, il s'arette à la première virgule trouvée et ne prend pas la suite. Du coup ca print a chaque virgule et on obtient un résultat sans virgule et avec de retour à la ligne à la place.