Découpage de chaînes et recollage de morceaux découpés "par erreur"!

bertouille Messages postés 5 Date d'inscription mercredi 5 novembre 2003 Statut Membre Dernière intervention 27 novembre 2003 - 14 nov. 2003 à 17:16
ld40 Messages postés 336 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 22 février 2019 - 20 nov. 2003 à 21:48
Bonjour,

je suis actuellement en stage, et je bloque sur le découpage de chaînes de caractères pour renseigner les champs d'une BdD:
-pour le découpage brut de mes données,ça va, j'utilise la fonction SPLIT;
-mais le séparateur utilisé dans les données que je dois traiter est la "," et comme ces données contiennent des zones de saisie libre, placées entre " " et pouvant comporter des ",", je me retrouve avec plus de morceaux découpés que de champs dans la table de ma BdD.

Merci d'avance pour toute solution, morceau de solution ou idée!
CIAO!

4 réponses

cs_radada Messages postés 488 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 21 avril 2009 1
14 nov. 2003 à 17:23
Et tu ne peux pas faire un premier split sur les " " et faire ensuite un tri sur les ","????
0
ld40 Messages postés 336 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 22 février 2019 1
14 nov. 2003 à 20:56
ton pb me plait (j'ai déjà connu le même embarras).

J'ai donc retroussé mes manches et pondu la sub suivante.

J'espère qu'elle sera à la hauteur.(merci de me le dire).
NB: elle ne fonctionnera pas si la string contient chr(253) ou chr(254)
NB2: dans notre cas separateur=","

Public Sub Megasplit(chaine As String, separateur As String, resultatcoll As Collection)
'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 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
carspe1 = Chr(254)
carspe2 = Chr(253)

If Left(chaine, 1) = separateur Then
chaine = carspe1 + chaine
End If
If Right(chaine, 1) = separateur Then
chaine = chaine + carspe1
End If

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, " ")
resultatcoll.Add chaine3
Next
Else
resultatcoll.Add x
End Ifouinon ouinon - (ouinon True) + (ouinon = False)
Next

End Sub
0
bertouille Messages postés 5 Date d'inscription mercredi 5 novembre 2003 Statut Membre Dernière intervention 27 novembre 2003
20 nov. 2003 à 16:09
Merci pour ton aide Id40,

malheureusement, je n'ai pas réussi à faire correctement l'appel de ta sub (à cause des collections que je ne maîtrise pas ) et je n'est donc pas pu la tester dans mon appli.
Du coup, je suis parti sur autre chose:

Private Sub Command1_Click()

'Déclaration des variables
Dim Ligne As String 'Variable dans laquelle on stockera la ligne en cours de lecture
Dim Texte As String
Dim NomFichier As String 'Variable dans laquelle on stockera le chemin du rep.
Dim F As Integer
Dim monTab() As String 'Tableau qui stockera le résultat de la fonction Split
Dim monTab2() As String 'Tableau qui stockera les champs après leur retouche
Dim i As Integer
Dim j As Integer
Dim k As Integer
NomFichier = "C:\Documents and Settings\DESBIEYS\Bureau\a0092012.A"
F = FreeFile
k = 0

'Ouverture d'un fichier, lecture, ligne par ligne, et découpage
Open NomFichier For Input As F
Do While Not EOF(F)
Line Input #F, Ligne
Texte = Texte & Ligne & vbCrLf
monTab() = Split(Ligne, ",") 'Découpage de la ligne suivant le séparateur ","
Text6.Text = UBound(monTab()) 'Juste pour connaitre l'indice le plus élevé du tableau

'Recollage des morceaux découpés à tort
For i = 0 To UBound(monTab())
If monTab(i) = " "" * "" " Then 'Si l'expression commence et finit par " " "
monTab(i) = " * " 'Alors je supprime les " " "
monTab2(k) = monTab(i) 'Et je place cette expression dans mon tableau final
ElseIf monTab(i) = " "" * " Then 'Si l'expression commence mais ne finit pas par " " "
j = i + 1
Do 'Alors je concatène l'expression suivante
monTab(i) = monTab(i) & "," & monTab(j)
Loop Until monTab(j) = " * "" " 'Tant que l'expression ne finit pas par " " "
monTab2(k) = monTab(i) 'Je place le résultat de ma concaténation dans mon tableau final
i = j 'i prend la valeur de j pour ne pas relire la même expression en début de boucle for
Else
monTab2(k) = monTab(i) 'Pour toutes les expressions correctement découpées et sans " " "
End If
k = k + 1
Next
Loop

Seulement, dans le dernier :
Else
monTab2(k) = monTab(i) 'Pour toutes les expressions correctement découpées et sans " " "
le compilo bloque, apparament à cause de l'indice (i).
Je ne comprends pas.
Si qq'1 pouvait m'aider, SVP!!!
Merci d'avance.
B
0
ld40 Messages postés 336 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 22 février 2019 1
20 nov. 2003 à 21:48
--------------------------------------------------------------------

J'ai regardé un peu ton code:

Il y a des erreurs bien avant la ligne sur laquelle ça plante.
* Par exemple tu as ecrit:
If monTab(i) = " "" * "" "
...
ElseIf monTab(i) = " "" * "

Or, ces deux lignes ne sont pas correctes
Si tu recherches " il faut que tu recherche chr(34)

* Ensuite monTab2(k) = monTab(i) ne peut pas fonctionner puisque
montab2() n'est pas dimensionné.
On devrait trouver la ligne
Redim montab2(UBound(monTab()))
en ammont du code

* remarque, il n'y a pas eu besoin de dimensionner montab() car la fonction split
renvoi un tableau variant (pas de dimension)

-------------------------------------------------------------------
En conséquence, soit tu essayes de corriger ton code, soit je te propose d'essayer
le code suivant pour exploiter la fonction megasplit précédemment décrite
J'ai essayé de reprendre les noms de tes variables pour que tu comprennes comment
on peut remplir un tableau montab2() à partir d'une collection
-------------------------------------------------------------------

Private Sub Command1_Click()

'Déclaration des variables
Dim Ligne As String 'Variable dans laquelle on stockera la ligne en cours de lecture
Dim monTab2() As String 'Tableau qui stockera les champs après leur retouche
Dim NomFichier As String 'Variable dans laquelle on stockera le chemin du rep.

Dim tablo As New Collection
Dim i As Integer
Dim m As Integer
Dim resultatcoll As New Collection
NomFichier "C:\Documents and Settings\DESBIEYS\Bureau\a0092012.A" 'NomFichier "c:\fic.txt"

i = FreeFile
Open NomFichier For Input As #i
Do Until EOF(i)
Line Input #i, Ligne
'resultatcoll est la collection réceptrice : je la nettoie
Do Until resultatcoll.Count = 0
resultatcoll.Remove (1)
Loop

'je lance la sub Megasplit qui renvoyera les champs
'séparés dans la collection resultatcoll
Call Megasplit(Ligne, ",", resultatcoll)

'je recupère les données presentes dans la collection
'et je rempli mon tableau montab2()
'apres avoir correctement dimmensionné ce dernier
ReDim monTab2(1 To resultatcoll.Count)
For m = 1 To resultatcoll.Count
monTab2(m) = resultatcoll(m)
Next
Loop
Close i
End Sub
0
Rejoignez-nous