Lire un fichier texte et récupérer son contenu dans excel [Résolu]

olivier857 188 Messages postés mardi 21 décembre 2004Date d'inscription 10 avril 2008 Dernière intervention - 2 janv. 2007 à 20:32 - Dernière réponse : mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention
- 4 janv. 2007 à 14:55
Bonjour à tous,

Je me pose 2 questions :

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
 
Afficher la suite 

18 réponses

Répondre au sujet
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 2 janv. 2007 à 20:51
+3
Utile
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)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Jack
TMONOD 260 Messages postés mardi 25 novembre 2003Date d'inscription 6 novembre 2009 Dernière intervention - 3 janv. 2007 à 00:46
+3
Utile
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






Jcbé[^]
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de TMONOD
TMONOD 260 Messages postés mardi 25 novembre 2003Date d'inscription 6 novembre 2009 Dernière intervention - 3 janv. 2007 à 22:40
+3
Utile
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 !!

à +
Jcbé[^]
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de TMONOD
olivier857 188 Messages postés mardi 21 décembre 2004Date d'inscription 10 avril 2008 Dernière intervention - 4 janv. 2007 à 13:29
+3
Utile
J'ai trouvé, apperement faut faire un  line input au lieu de input :



Line Input #1, ligne


La gestion des fichiers texte est nouvel pour moi et j'avoue avoir un peu d emal a tout assimilé.

Je ne comprend pas non plus la fonction des debug.print
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de olivier857
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 2 janv. 2007 à 20:51
0
Utile
Salut,

1/ regarde du côté de Open ... For Input
ensuite, faut faire un Split(données, vbCrLf) pour lire chaque ligne.

2/ Il faut faire un nouveau Split

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Commenter la réponse de mortalino
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 2 janv. 2007 à 20:52
0
Utile
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 ...
Commenter la réponse de jmfmarques
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 2 janv. 2007 à 20:54
0
Utile
Jack bats Mortalino de 21 sec
et Jmfmarques de 56 sec !
Vive moi, lol
Commenter la réponse de cs_Jack
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 2 janv. 2007 à 20:57
0
Utile
lol, et en plus c'est toi qui a mis le + d'infos.

Bravo !

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Commenter la réponse de mortalino
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 2 janv. 2007 à 21:12
0
Utile
Minute, minute lézami !

S'il faut dire le dernier mot et arriver à le faire plus rapidement qu'avec split : jmf sera présent !
Commenter la réponse de jmfmarques
olivier857 188 Messages postés mardi 21 décembre 2004Date d'inscription 10 avril 2008 Dernière intervention - 2 janv. 2007 à 23:32
0
Utile
Ok merci beaucoup,

Bon alors on peut dire que vos combats pour répondre le plus vite et le mieux possible à mes questions, ne me déplaise bien évidement pas.

Par contre du coup quand j'aurais regardé ca de plus il me faudra faire 3 fois le boulot de réponse accepté. Ca va être dure

Bon merci, je regarde çà demain ou apres demain au boulot.
Commenter la réponse de olivier857
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 2 janv. 2007 à 23:43
0
Utile
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"
<!--
Commenter la réponse de mortalino
olivier857 188 Messages postés mardi 21 décembre 2004Date d'inscription 10 avril 2008 Dernière intervention - 2 janv. 2007 à 23:58
0
Utile
Bien évidement, c'était juste un point d'humour.

++
Commenter la réponse de olivier857
olivier857 188 Messages postés mardi 21 décembre 2004Date d'inscription 10 avril 2008 Dernière intervention - 3 janv. 2007 à 14:43
0
Utile
Slt,


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 ?

Merci !

Oliv
Commenter la réponse de olivier857
olivier857 188 Messages postés mardi 21 décembre 2004Date d'inscription 10 avril 2008 Dernière intervention - 4 janv. 2007 à 11:06
0
Utile
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.

D'ou cela peut il venir ?
Commenter la réponse de olivier857
olivier857 188 Messages postés mardi 21 décembre 2004Date d'inscription 10 avril 2008 Dernière intervention - 4 janv. 2007 à 12:38
0
Utile
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.
Commenter la réponse de olivier857
TMONOD 260 Messages postés mardi 25 novembre 2003Date d'inscription 6 novembre 2009 Dernière intervention - 4 janv. 2007 à 13:23
0
Utile
En effet, Input  est un peu "brut de fonderie"
il faut remplacer input par line input et ça roule !

D'autre part, il y aura certainement des ajustements à faire dans
l'utilisation de QueryTables...






En esperant avoir fait avancer le sdcsdcsdhmilllblick
Jcbé[^]
Commenter la réponse de TMONOD
olivier857 188 Messages postés mardi 21 décembre 2004Date d'inscription 10 avril 2008 Dernière intervention - 4 janv. 2007 à 14:31
0
Utile
Oups j'avais pas fait attention que tu avait répondu 6 minute avant moi.

Sinon je cherche tjs à comprendre a quoi sert les debug.print ?

Je vais également me pencher sur le QueryTables pour comprendre un peut mieux son fonctionnement. Vive f1
Commenter la réponse de olivier857
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 4 janv. 2007 à 14:55
0
Utile
Fait Debug.Print "Salut"
puis Ctrl + G, tu verras bien 

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Commenter la réponse de mortalino

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.