Parser CSV

Parser CSV

Messagepar StasS » 27 Fév 2009 à 16:36

Bonjour !
Voici un parseur CSV simple, en esperant qu'il puisse servir à quelqu'un :

Utilisation :
[syntax="LotusScript"]'Déclaration
Dim clFileCsv As readCSV

'Création de la classe, on passe le chemin vers le fichier en paramètre
Set clFileCsv = New readCSV([Chemin du fichier] As String)

''Les fonctions
'Récupérer le nombre de ligne
Dim lineCount As Integer
lineCount = clFileCSV.lineCount

'Récupérer le nombre de colonne
Dim colCount As Integer
lineCount = clFileCSV.colCount

'Récupérer les valeures
Dim valeurReturn As String
valeurReturn = clFileCSV.getValue([Numéro de ligne] As Integer, [Numéro de colonne] As Integer)
[/syntax]

La classe :
[syntax="LotusScript"]Public Class readCSV
Private fileCsv As Integer
Private outReadCsv() As String
Private countCol As Integer
Private countLine As Integer

Public Sub new(fileName As String)
Dim bufferTemp As String
Dim countLineTemp As Integer

fileCsv% = Freefile()
Open fileName$ For Input As fileCsv%
Call getCountLine
Seek fileCsv%, 1

Do Until Eof(fileCsv%)
Line Input #fileCsv%, bufferTemp
If(countLineTemp = 0) Then
countCol = getCountCol(bufferTemp)
End If
Redim Preserve outReadCsv(countLine - 1, countCol - 1)
Call traiteData(bufferTemp, countLineTemp)
countLineTemp = countLineTemp + 1
Loop

Close fileCsv%
End Sub

Public Property Get lineCount As Integer
lineCount = countLine
End Property

Public Property Get colCount As Integer
colCount = countCol
End Property

Public Function getValue(numLine As Integer, numCol As Integer) As String
getValue = outReadCsv(numLine, numCol)
End Function

Private Function getCountCol(lineEx As String) As Integer
Dim buff As Variant
Dim countTmp As Integer

countTmp = 0
buff = Split(lineEx, ";")
Forall b In buff
countTmp = countTmp +1
End Forall

getCountCol = countTmp
End Function

Private Sub getCountLine
Dim buffTemp As String
Do Until Eof(fileCsv%)
Line Input #fileCsv%, buffTemp
countLine = countLine + 1
Loop
End Sub

Private Sub traiteData(buff As String, lineRead As Integer)
Dim xBoucle As Integer
Dim buffTemp As Variant

buffTemp = Split(buff, ";")
For xBoucle = 0 To countCol - 1
outReadCsv(lineRead, xboucle) = buffTemp(xboucle)
Next
End Sub
End Class[/syntax]

N'hésitez pas à me dire ce qui ne va pas (ouai, et puis si ça va c'est sympa de le dire aussi hein :wink: )
Dernière édition par StasS le 04 Mars 2009 à 10:25, édité 2 fois.
Qui verra vivra !
Avatar de l’utilisateur
StasS
Administrateur
Administrateur
 
Message(s) : 115
Inscrit(e) le : 13 Août 2008 à 07:35
Localisation : Paris

Messagepar billbock » 03 Mars 2009 à 10:29

Merci pour ce post il servira surement pour mes import EAI
Avatar de l’utilisateur
billbock
Modérateur
Modérateur
 
Message(s) : 310
Inscrit(e) le : 15 Fév 2007 à 13:58
Localisation : paris

Messagepar Dominux » 03 Mars 2009 à 10:51

J'aurai mis des 'Public Property Get' à la place des 'Public Function' ;-)
Cordialement,
Olivier (www.dominux.fr et sur Twitter)
Image
Avatar de l’utilisateur
Dominux
Administrateur
Administrateur
 
Message(s) : 1201
Inscrit(e) le : 16 Déc 2004 à 10:56
Localisation : Nantes

Messagepar StasS » 03 Mars 2009 à 16:01

Merci pour les commentaires, j'ai remis à jour le code pour y inclure les Public Property Get
Qui verra vivra !
Avatar de l’utilisateur
StasS
Administrateur
Administrateur
 
Message(s) : 115
Inscrit(e) le : 13 Août 2008 à 07:35
Localisation : Paris

Messagepar Dominux » 03 Mars 2009 à 16:34

Je vais faire mon chieur mais ... pour 'Value' c'est plutôt une fonction car retour d'une valeur suivant des paramètres.
Un Getter ou Setter représentent des variables mais associés à une classe, donc pas d'argument si ce n'est la valeur affectée ou retournée.
Cordialement,
Olivier (www.dominux.fr et sur Twitter)
Image
Avatar de l’utilisateur
Dominux
Administrateur
Administrateur
 
Message(s) : 1201
Inscrit(e) le : 16 Déc 2004 à 10:56
Localisation : Nantes

Messagepar StasS » 04 Mars 2009 à 10:26

Dominux a écrit:Je vais faire mon chieur mais ... pour 'Value' c'est plutôt une fonction car retour d'une valeur suivant des paramètres.
Un Getter ou Setter représentent des variables mais associés à une classe, donc pas d'argument si ce n'est la valeur affectée ou retournée.

Non non pas de souci, au contraire merci pour la remarque, c'est modifié :wink:
Qui verra vivra !
Avatar de l’utilisateur
StasS
Administrateur
Administrateur
 
Message(s) : 115
Inscrit(e) le : 13 Août 2008 à 07:35
Localisation : Paris

Messagepar Dominux » 04 Mars 2009 à 16:22

nickel ... avec les préfixes 'get' en moins dans les noms des getter, c'est nickel!
Cordialement,
Olivier (www.dominux.fr et sur Twitter)
Image
Avatar de l’utilisateur
Dominux
Administrateur
Administrateur
 
Message(s) : 1201
Inscrit(e) le : 16 Déc 2004 à 10:56
Localisation : Nantes

Messagepar StasS » 06 Mars 2009 à 10:58

C'est à dire? dans les function private?
Je les ai enlevé des proprety get mais pas ceux des private.
Qui verra vivra !
Avatar de l’utilisateur
StasS
Administrateur
Administrateur
 
Message(s) : 115
Inscrit(e) le : 13 Août 2008 à 07:35
Localisation : Paris

Messagepar Dominux » 06 Mars 2009 à 12:22

Non c'est bien comme ca!
Cordialement,
Olivier (www.dominux.fr et sur Twitter)
Image
Avatar de l’utilisateur
Dominux
Administrateur
Administrateur
 
Message(s) : 1201
Inscrit(e) le : 16 Déc 2004 à 10:56
Localisation : Nantes

Messagepar oguruma » 30 Sep 2009 à 12:52

ce petit commentaire arrive un peu tard.. dsl...
mais s'il sagit de lire uniquement les enregistrements un à un et de les traiter il existe la fonction split (voir Designer et les fonctions associées à celles-ci). Dans le passé certains ont développé le AT_Explode/AT_Implode qui rendait les mêmes services.
En fait on passe à Split la chaîne et le séparateur et on récupère un tableau.
Ce tableau pour faire simple doit être déclaré comme variant.
La 1ère colonne commence à vTablo(0) et ainsi de suite.
Je l'utilise régulièrement et elle fonctionne très bien.
Pour une simple lecture de CSV on n'a peut-être pas besoin de cette classe qui est certes très bien faite.
Attention cependant au temps d'initialisation avec un fichier volumineux.
Bien à vous

http://www.dominoarea.org/oguruma/

Les téléphones PORTABLES dans les TGV y en a MARRRE de ces voyageurs qui ne respectent pas les autres ! ARRET DES PORTABLES SVP - Merci

Fumeurs ! respectez les non fumeurs !!!
Fumeurs ! respectez la loi de février 2007 et les lieux publics !!! (ie. hall de gares)
Avatar de l’utilisateur
oguruma
Super V.I.P.
Super V.I.P.
 
Message(s) : 4086
Inscrit(e) le : 16 Déc 2004 à 08:50
Localisation : LILLE

Messagepar mike76 » 10 Déc 2009 à 15:53

Merci StasS
Génial cette classe !
mike76
V.I.P.
V.I.P.
 
Message(s) : 2122
Inscrit(e) le : 12 Oct 2006 à 13:14
Localisation : ROUEN


Retour vers Gestion de fichiers