olivier857
Messages postés188Date d'inscriptionmardi 21 décembre 2004StatutMembreDernière intervention10 avril 2008
-
2 janv. 2007 à 20:32
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 2011
-
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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 2 janv. 2007 à 20:51
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)
TMONOD
Messages postés256Date d'inscriptionmardi 25 novembre 2003StatutMembreDernière intervention 6 novembre 20091 3 janv. 2007 à 00:46
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
TMONOD
Messages postés256Date d'inscriptionmardi 25 novembre 2003StatutMembreDernière intervention 6 novembre 20091 3 janv. 2007 à 22:40
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 !!
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 2 janv. 2007 à 20:52
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 ...
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 2 janv. 2007 à 23:43
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"
<!--
olivier857
Messages postés188Date d'inscriptionmardi 21 décembre 2004StatutMembreDernière intervention10 avril 2008 3 janv. 2007 à 14:43
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 ?
olivier857
Messages postés188Date d'inscriptionmardi 21 décembre 2004StatutMembreDernière intervention10 avril 2008 4 janv. 2007 à 11:06
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.
olivier857
Messages postés188Date d'inscriptionmardi 21 décembre 2004StatutMembreDernière intervention10 avril 2008 4 janv. 2007 à 12:38
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.