Page 1 sur 1

Parser CSV

MessagePublié: 27 Fév 2009 à 16:36
par StasS
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: )

MessagePublié: 03 Mars 2009 à 10:29
par billbock
Merci pour ce post il servira surement pour mes import EAI

MessagePublié: 03 Mars 2009 à 10:51
par Dominux
J'aurai mis des 'Public Property Get' à la place des 'Public Function' ;-)

MessagePublié: 03 Mars 2009 à 16:01
par StasS
Merci pour les commentaires, j'ai remis à jour le code pour y inclure les Public Property Get

MessagePublié: 03 Mars 2009 à 16:34
par Dominux
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.

MessagePublié: 04 Mars 2009 à 10:26
par StasS
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:

MessagePublié: 04 Mars 2009 à 16:22
par Dominux
nickel ... avec les préfixes 'get' en moins dans les noms des getter, c'est nickel!

MessagePublié: 06 Mars 2009 à 10:58
par StasS
C'est à dire? dans les function private?
Je les ai enlevé des proprety get mais pas ceux des private.

MessagePublié: 06 Mars 2009 à 12:22
par Dominux
Non c'est bien comme ca!

MessagePublié: 30 Sep 2009 à 12:52
par oguruma
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.

MessagePublié: 10 Déc 2009 à 15:53
par mike76
Merci StasS
Génial cette classe !