Fonction Split

Résolu
cs_julbute Messages postés 8 Date d'inscription mardi 4 avril 2006 Statut Membre Dernière intervention 13 avril 2006 - 13 avril 2006 à 11:54
cs_julbute Messages postés 8 Date d'inscription mardi 4 avril 2006 Statut Membre Dernière intervention 13 avril 2006 - 13 avril 2006 à 15:25
Bonjour à tous,
Voilà je dois séparer des données en utilisant la fonction split.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Exemple de données:


<COLGROUP>
<COL style=\"WIDTH: 60pt\" width=80>

----

Position,DateTime,TraceLevel,Context,Content,Host,MaxPos,,
----

1153684,11/04/2006,1,Space,cycle starts,MWEB,1153685,,
----

1153683,10/04/2006,1,RS,'9597asb' logged out,MW,1153685,

Remarque: le code suivant fonctionnne parfaitement lorsqu'il n'y a pas de virgule à la fin de chaque lignes.

Code utilisé:
---------------------------------------------------------------------------------------
Private Sub Btn_ajout_analyses_Click()


Dim Fice As String ' Chemin et Fichier .csv à traiter
Dim LignE As String
Dim TableW() As String
Dim TableA() As String
Dim I As Long, J As Long
Dim Ltitre As String ' Ligne description des rubriques
Dim rs1
Dim No As Integer


fichier_csv = OuvrirUnFichier(Me.Hwnd, "Parcourir", 1, "Fichier Excel", "csv")

If fichier_csv <> "" Then
'definit le sablier
DoCmd.Hourglass True

'On Error GoTo fin2
Set db = CurrentDb
'Set db = OpenDatabase(".\bd_traces.mdb")
No = FreeFile()
Open fichier_csv For Input As #No 'acces sequentiel:On ouvre le fichier et on lui assigne le chiffre 1.




Line Input #No, LignE ' Lecture de la ligne des noms de rubrique
TableW() = Split(LignE, ",")

For I = 0 To UBound(TableW) ' Nbr de rubriques de l'enregistrement
Ltitre = Ltitre + TableW(I) + " TEXT"
If I <> UBound(TableW) Then Ltitre = Ltitre + ","
Next I

' ***** Création des lignes détail *****

Set rs = db.OpenRecordset("traces", dbOpenTable) ' Ouverture de la table

Do While EOF(No) = False
Line Input #No, LignE 'L'instruction Line Input # lit un à un les caractères d'un fichier jusqu'au premier retour chariot
TableW() = Split(LignE, ",")

rs.AddNew

For I = 0 To (UBound(TableW) - 1)
rs.Fields(I).Value = TableW(I) ' Création d'une ligne
If I = 1 Then 'on verifie s'il s'agit du champ contenant la date et l'heure
rs.Fields(6).Value = FormatDateTime((rs(I) - Int(rs(I))), vbGeneralDate) 'on récupère l'heure
rs.Fields(I).Value = FormatDateTime(rs(I) - (rs(I) - Int(rs(I))), vbGeneralDate) 'on récupère la date
ElseIf I = 2 Then 'Trace Level
If rs(I) = 1 Then
rs(I) = "Info Trace"
ElseIf rs(I) = 2 Then
rs(I) = "Warning Trace"
ElseIf rs(I) = 4 Then
rs(I) = "Error Trace"
ElseIf rs(I) = 8 Then
rs(I) = "Critical Trace"
End If
ElseIf I = 4 Then ' on isole les identifiants des utlisateurs
TableA() = Split(rs(4), "'")
For J = 0 To (UBound(TableA) - 1)
rs(7) = TableA(J)
'If rs(7) = "" Then
'rs(7) = "Non identifié"
'End If
Next J
End If
Next I SQL "SELECT * FROM traces WHERE position " & rs.Fields(0).Value & ""
Set rs1 = db.OpenRecordset(SQL, dbOpenDynaset)
If rs1.RecordCount = 0 Then
rs.Update
End If
Loop

'enleve le sablier
DoCmd.Hourglass False

MsgBox "Mise à jour de la base de données terminée"

Close #No

Call close_nothing_db_rs
Call visualiser_Analyses
End If
GoTo fin
fin2: msg = MsgBox("Le fichier sélectionné n'est pas compatible", vbCritical)
fin:
End Sub

-------------------------------------------------------------------------------------
Merci d'avance.

3 réponses

cs_julbute Messages postés 8 Date d'inscription mardi 4 avril 2006 Statut Membre Dernière intervention 13 avril 2006
13 avril 2006 à 15:25
Je voulais vous remercier de m'avoir répondu.

Sinon je n'ai pas le choix du séparateur, le fichier CSV sur lequel je travaille est généré à partir d'une application sur un serveur.
Et depuis que j'ai posté ce message je me suis rendu compte qu'en ouvrant le fichier csv sous excel depuis access, les virgules sont automatiquement remplacées par des colonnes.
Donc c'est plus simple.

Merci encore.
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 avril 2006 à 12:19
C'est quoi ton problème, où est et quelle est l'erreur?

Si c'est simplement la virgule en fin de chaine qui te pose problème, édite ta chaine et vire la virgule avant traitement, ou rajoute un caractère quelconque après cette virgule.

if right$(Ta_Chaine,1)= "," then
Ta_Chaine = left$(TaChaine,len(TaChaine)-1)
end if

ou alors

if right$(Ta_Chaine,1)="," then

Ta_Chaine = TaChaine & " "

end if




<hr size ="2" width="100%">
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 avril 2006 à 14:56
SalutOu encore, si Len(TableW(UBound(TableW))) 0 Then ... la donnée est vide

Tu rencontreras un autre problème un jour où l'autre :
Si une des données comporte une virgule, cette virgule sera considérée comme un séparateur alors qu'elle n'est qu'une donnée.
Il te faut donc compter le nombre de champs récupérés = UBound(TableW)
Si ce nombre est anormalement plus élevé que le nombre de champs attendu, il faudra faire quelque chose.


Personnellement, un séparateur "virgule" de fichier CSV n'est pas le meilleur choix.
Utilise plutôt des tabulations car tu auras beaucoup moins de risque d'en rencontrer dans des données.
Pour le Split, il suffira d'utiliser vbTab à la place de "."

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'accro
0
Rejoignez-nous