cs_julbute
Messages postés8Date d'inscriptionmardi 4 avril 2006StatutMembreDernière intervention13 avril 2006
-
13 avril 2006 à 11:54
cs_julbute
Messages postés8Date d'inscriptionmardi 4 avril 2006StatutMembreDernière intervention13 avril 2006
-
13 avril 2006 à 15:25
Bonjour à tous,
Voilà je dois séparer des données en utilisant la fonction split.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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
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
cs_julbute
Messages postés8Date d'inscriptionmardi 4 avril 2006StatutMembreDernière intervention13 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.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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