Traiter une ligne csv

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 978 fois - Téléchargée 39 fois

Contenu du snippet

Voici donc une fonction à utiliser sur une ligne CSV (à vous d'implémenter la lecture du fichier CSV).
Le code fonctionne sans verifier la syntaxe CSV et peut donc aussi fonctionner avec une syntaxe 'batarde'.

Source / Exemple :


Public Function GetLignCSV(ByVal Ligne As String, ByRef ptrElements() As String, Optional ByVal EscapeChar As String = "\", Optional ByVal Delimitor As String = "", Optional ByVal Separator As String = ";") As Long
On Error GoTo erreur

Dim Getting, EscapeMode As Boolean
Dim strBuffer, uChar As String
Dim i, nElement As Long

'Sortie si parametres invalides
If Len(Ligne) = 0 Or Len(EscapeChar) <> 1 Or (Len(Delimitor) <> 1 And Len(Separator) <> 1) Then
   GetLignCSV = -1
   Exit Function
End If
If Len(Delimitor) <> 1 And Len(Separator) = 1 Then
   Getting = True
End If

'Traitement de la ligne
For i = 1 To Len(Ligne) Step 1
   uChar = Mid$(Ligne, i, 1)
   If EscapeMode And Getting Then
      strBuffer = strBuffer & uChar
      EscapeMode = False
   ElseIf Getting Then
      Select Case uChar
         Case Delimitor
            ReDim Preserve ptrElements(nElement): ptrElements(nElement) = strBuffer
            nElement = nElement + 1: strBuffer = "": Getting = False
         Case Separator
            If Len(Delimitor) = 0 Then
               ReDim Preserve ptrElements(nElement): ptrElements(nElement) = strBuffer
               nElement = nElement + 1: strBuffer = ""
            Else
               GetLignCSV = -1
               Exit Function
            End If
         Case EscapeChar
            EscapeMode = True
         Case Else
            strBuffer = strBuffer & uChar
      End Select
   ElseIf uChar = Delimitor Then
      Getting = True
   End If
Next i

'Recuperation du dernier element si necessaire
If Len(strBuffer) > 0 And Len(Delimitor) <> 1 And Len(Separator) = 1 Then
   ReDim Preserve ptrElements(nElement): ptrElements(nElement) = strBuffer
   nElement = nElement + 1: strBuffer = ""
End If

GetLignCSV = nElement - 1

Exit Function
erreur:
MsgBox "Une erreur est inopinément survenue !" & vbCrLf & "Code erreur : " & CStr(Err.Number) & vbCrLf & Err.description
End Function

Conclusion :


Exemple :
dim myLigne = "toto;cool;super;56;is;WAAAAAAAAAAAAAZZZZZZAAAAAAAAAAAAAAAAA"
dim ret as integer
dim ptrCSV() as string
ret = GetLignCSV(myLigne, ptrCSV, "\", "", ";")
'Maintenant on un un tableau ptrCSV avec les donnees de la ligne
'L'interet de la fonction par rapport à split de vb est qu'elle gere les caractères d'echappement & les delimiteurs.

N'hésistez pas a me contacter pour commenter la source. Elle est tiré d'un module écris par moi même me facilitant la vie avec MySQL. Si vous êtes interessé, postez moi un petit message.

A voir également

Ajouter un commentaire Commentaires
Messages postés
4
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
26 août 2004

Perso, j'ai adapté le code pour qu'il corresponde à mes attentes (gestion d'un délimiteur de String, trim des champs, retour = nb de champs)

Utilisation :
Dim Valeurs() As String
Dim NbElement As Long
NbElement = GetLignCSV("a, b, ""c"", ""d1,d2"", e", Valeurs, ",", """")

Retour :
Valeurs = [a; b; c; d1,d2; e]

Voici le code modifié :

Public Function GetLignCSV(ByVal Ligne As String, ByRef ptrElements() As String, Optional ByVal Separator As String ",", Optional ByVal StringDelimitor As String """", Optional ByVal EscapeChar As String = "") As Long
On Error GoTo erreur
Dim Getting, EscapeMode, InString As Boolean
Dim strBuffer, uChar As String
Dim i, nElement As Long
'Sortie si parametres invalides
If Len(Ligne) = 0 Or Len(EscapeChar) <> 1 Or (Len(StringDelimitor) <> 1 And Len(Separator) <> 1) Then
GetLignCSV = -1
Exit Function
End If

'Traitement de la ligne
For i = 1 To Len(Ligne) Step 1
uChar = Mid$(Ligne, i, 1)
If EscapeMode And Getting Then
strBuffer = strBuffer & uChar
EscapeMode = False
Else 'If Getting Then
Select Case uChar
Case StringDelimitor
If InString Then
InString = False
Else
InString = True
End If
Case Separator
If InString Then
strBuffer = strBuffer & uChar
Else
ReDim Preserve ptrElements(nElement): ptrElements(nElement) = Trim$(strBuffer)
nElement nElement + 1: strBuffer ""
End If
Case EscapeChar
EscapeMode = True
Case Else
strBuffer = strBuffer & uChar
End Select
End If
Next i
'Recuperation du dernier element si necessaire
If Len(strBuffer) > 0 And Len(Separator) = 1 Then
ReDim Preserve ptrElements(nElement): ptrElements(nElement) = Trim$(strBuffer)
nElement nElement + 1: strBuffer ""
End If
GetLignCSV = nElement
Exit Function
erreur:
MsgBox "Une erreur est inopinément survenue !" & vbCrLf & "Code erreur : " & CStr(Err.Number) & vbCrLf & Err.Description
End Function
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Ça ne fonctionne qu'à moiter :/
Si j'envoie la chaine |2;";";""";"""|
Je devrais logiquement obtenir un tableau contenant :
2|;|";"
Or j'obtiens :
2|"|"|"""|"""

En plus, je ne comprends pas non plus ce qu'es "EscapeChar".

Je n'aime pas donnée de mauvais note je ne note donc pas ;)
Messages postés
235
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
16 mai 2011
2
personnellement, ca me donne juste le nombre de délimiteur, mais ca ne me donne pas le contenu de la ligne....ou alors je m'y prend mal...
Messages postés
1133
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011
1
Je ne comprends pas ce que sont ces caractères déchappement dont tu parles.
Messages postés
161
Date d'inscription
mardi 19 juin 2001
Statut
Membre
Dernière intervention
10 avril 2007
1
Voilà c'est fait, happy coding Mike ;)
Afficher les 7 commentaires

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.