TRAITER UNE LIGNE CSV

cs_Mike Messages postés 70 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 24 juillet 2004 - 19 nov. 2002 à 11:19
boillm Messages postés 4 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 26 août 2004 - 16 oct. 2009 à 17:34
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/2915-traiter-une-ligne-csv

boillm Messages postés 4 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 26 août 2004
16 oct. 2009 à 17:34
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
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
19 févr. 2008 à 16:50
Ç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 ;)
EvilGost Messages postés 235 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 mai 2011 2
4 oct. 2004 à 11:47
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...
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
11 janv. 2004 à 21:16
Je ne comprends pas ce que sont ces caractères déchappement dont tu parles.
cs_zappy Messages postés 161 Date d'inscription mardi 19 juin 2001 Statut Membre Dernière intervention 10 avril 2007 2
19 nov. 2002 à 14:52
Voilà c'est fait, happy coding Mike ;)
cs_zappy Messages postés 161 Date d'inscription mardi 19 juin 2001 Statut Membre Dernière intervention 10 avril 2007 2
19 nov. 2002 à 14:09
Je vais mettre à jour la source cet aprem (j'ai corrigé ma fonction pour du VRAI csv)
cs_Mike Messages postés 70 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 24 juillet 2004 1
19 nov. 2002 à 11:19
T'as pas un exemple d'utilisation STP, ça m'aiderais GRAVE lol !!!
Rejoignez-nous