Split amélioré (pour fichiers csv du style 001,"youpi,ça va?","ras",,)

Soyez le premier à donner votre avis sur cette source.

Vue 8 446 fois - Téléchargée 402 fois


Description

split amélioré pour traiter un texte formaté du style ,001,"bonjour tout le monde, ça va,"?",,"etc...",,
(en gros ça tient compte de la présence ou non de guillemets avant la chaine contenant le séparateur afin de déterminer quel role attribuer au séparateur: bien pratique pour certains fichiers csv)

cette fonction s'utilise comme le split traditionnel:
une chaine en entrée + un séparateur au choix
elle retourne un tableau comme split

NB1:le séparateur supplémentaire " n'est pas paramétrable; il est considéré par défaut

NB2: Pour rendre l'appli utile, je viens de rajouter des export HTM ou RTF ainsi que la possibilité de copier le contenu de la listview

Source / Exemple :


'####la fonction megasplit###
Private Function Megasplit(chaine As String, separateur As String) As Variant

'testé avec les cas suivants
',,3,4,,6,,,9,"10",
'1,"2,2",,"4","5",6,7,8,9,10,11
',,,,,,,,9,10,"11"
'1,2,3,4,5,6,7,8,9,10,11

Dim resultatcoll As New Collection
Dim compte As Double
ReDim resultat(1)
Dim ouinon As Boolean
Dim t As Variant
Dim t2 As Variant
Dim x As Variant
Dim x2 As Variant
Dim chaine2 As String
Dim chaine3 As String
Dim carspe1 As String
Dim carspe2 As String

'je recherche deux caractères non utilisés dans la chaine
'si la condition n'est pas remplie,
'c'est que ce n'est pas un fichier texte ;-)

Dim m As Integer
Dim mm As Integer
For m = 254 To 1 Step -1
    If InStr(1, chaine, Chr(m)) = 0 Then
        carspe1 = Chr(m)
        For mm = m - 1 To 1 Step -1
            If InStr(1, chaine, Chr(mm)) = 0 Then
                carspe2 = Chr(mm)
                Exit For
            End If
        Next
        Exit For
    End If
Next
If m = 1 And mm = 1 Then
    Exit Function
End If

'debarassons nous des cas particuliers
If Left(chaine, 1) = separateur Then
    chaine = carspe1 + chaine
End If
If Right(chaine, 1) = separateur Then
    chaine = chaine + carspe1
End If

'l algorithme qui distingue les chaines avec
'ou sans des "
ouinon = True
t = Split(chaine, Chr(34), , vbTextCompare)
For Each x In t
    If ouinon = True Then
        chaine2 = x
        chaine2 = Replace(chaine2, separateur + separateur, separateur + carspe1 + separateur)
        If Left(chaine2, 1) = separateur Then
            chaine2 = Right(chaine2, Len(chaine2) - 1)
        End If
        If Right(chaine2, 1) = separateur Then
            chaine2 = Left(chaine2, Len(chaine2) - 1)
        End If
        t2 = Split(chaine2, separateur, , vbTextCompare)
        For Each x2 In t2
            chaine3 = x2
            chaine3 = Replace(chaine3, " ", carspe2)
            chaine3 = Trim(Replace(chaine3, carspe1, " "))
            chaine3 = Replace(chaine3, carspe2, " ")
            
            compte = compte + 1
            ReDim Preserve resultat(compte)
            resultat(compte) = chaine3
        Next
    Else
        compte = compte + 1
        ReDim Preserve resultat(compte)
        resultat(compte) = x
    End If
    ouinon = ouinon - (ouinon = True) + (ouinon = False)
Next

'fini
Megasplit = resultat

End Function
'####fin de la fonction megasplit###

Conclusion :


- A gauche, tapez le texte (ou ouvrez le fichier texte) que vous souhaitez formater,
puis cliquez "Lancer MegaSplit" pour visualiser le résultat dans la grille de droite.

-vous pouvez copier le contenu de la listview ou enregistrer au format RTF ou HTM

-Nécessite le composant MSCOMCTLOCX sur votre poste

- une api qui n'est pas de moi pour ouvrir les fichiers et qui n'a rien à voir avec le sujet de ce source.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_julbute
Messages postés
8
Date d'inscription
mardi 4 avril 2006
Statut
Membre
Dernière intervention
13 avril 2006
-
Bon ok dans ton exemple ça marche mais serais tu comment proceder si on devait effectuer un split sur plusieurs lignes et qu'il y a également un séparateur à la fin de chaque lignes.exemple:

1153748,13/04/2006 03:02:35,1,SpaceManager,
1153747,12/04/2006 22:06:25,1,RS_Global.asp,
1153746,12/04/2006 22:06:08,1,RS_Global.asp,
ld40
Messages postés
336
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
22 février 2019
-
si je comprends bien, tu es en train de lire un fichier texte de plusieurs lignes, c'est ça?
le code serait
dim i as integer
dim monfichier as string
dim a$
dim t as variant
i=freefile
monfichier = "c:\toto.txt"
open monfichier for input as #i
do until eof(i)
line input #i,a$
t = split(a$,",")
' et la tu traites...t(0) t(1) t(2) etc...
loop
close #i

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.