begin process at 2012 02 13 18:48:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Texte

 > TRAITER UNE LIGNE CSV

TRAITER UNE LIGNE CSV


 Information sur la source

Note :
Aucune note
Catégorie :Texte Niveau :Débutant Date de création :28/03/2002 Date de mise à jour :19/11/2002 14:50:28 Vu :6 715

Auteur : zappy

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note


 Description

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

  • 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
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;WAAAAAAAAAAAAAZZZZZZAAAAAAA AAAAAAAAAA"
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.


 Sources du même auteur

Source avec Zip EASY ARRAY, LES TABLEAUX DYNAMIQUES FACILE !
CLASS CONNEXION ADODB SECURISE
Source avec Zip CRACK DE "PROTECTION INVIOLABLE PAR MOT DE PASSE"
Source .NET (Dotnet) CLASS TCP/IP LISTENER TRES SIMPLE ET MULTITHREAD DOTNET
Source avec Zip MAGIQUE CAPTURE (CAPTURE D'ÉCRAN ET DE SOUS FENÊTRES)

 Sources de la même categorie

Source avec Zip Source avec une capture MASQUE DE SAISIE NUMÉRIQUE par acive
Source avec Zip Source .NET (Dotnet) COMPTEUR DE NOMBRE DE MOTS DANS UN TEXTE par alpha5
Source avec Zip Source avec une capture HM - BLOCNOTE par hassenmajor
Source .NET (Dotnet) [VB.NET] CLASS DE COLORATION SYNTAXIQUE "ON THE FLY" par huzima
Source avec Zip Source avec une capture PERSONNALISEZ VOS BOÎTES DE MESSAGE (X)HTML par medjahedScript

Commentaires et avis

Commentaire de Mike le 19/11/2002 11:19:03

T'as pas un exemple d'utilisation STP, ça m'aiderais GRAVE lol !!!

Commentaire de zappy le 19/11/2002 14:09:18

Je vais mettre à jour la source cet aprem (j'ai corrigé ma fonction pour du VRAI csv)

Commentaire de zappy le 19/11/2002 14:52:05

Voilà c'est fait, happy coding Mike ;)

Commentaire de PROGRAMMIX le 11/01/2004 21:16:53

Je ne comprends pas ce que sont ces caractères déchappement dont tu parles.  

Commentaire de EvilGost le 04/10/2004 11:47:40

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...

Commentaire de Polack77 le 19/02/2008 16:50:51

Ç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 ;)

Commentaire de boillm le 16/10/2009 17:34:45

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

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,638 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales