Découpage de chaîne

Résolu
Signaler
Messages postés
103
Date d'inscription
jeudi 2 mars 2006
Statut
Membre
Dernière intervention
4 février 2009
-
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
-
bonjour,
mon pb= je possede un fichier dont voici une ligne:
0032-1DM ;SUPPORT MOULEUSE 1DM ;SUPPORT ;
;UN;N; 7509.8900; 4688.8428; 0;00-XXX-0000;
; ;20-FEB-1998;26-FEB-1992;UN; 1.000000;UN; 1.000000;SU;NOME;ME
dans mon code vb6, jai declarer un type personnalise pour pouvoir lire ce fichier et integrer
chaque donnees dans des colonnes dans une table de ma BD
:
Private Type article
codeArticle As String * 15 'correspond au premier champs
pt As String * 1 'permet de contenir le point virgule
designationArticle As String * 35
pt1 As String * 1
designationAnglaise As String * 35
pt2 As String * 1
designation2 As String * 35
pt3 As String * 1
unité_de_mesure As String * 2
pt4 As String * 1
codeSource As String * 1
pt5 As String * 1
prixVente As String * 14
pt6 As String * 1
coutUnitaireStandart As String * 14
pt7 As String * 1
cycleDappro As String * 4
pt8 As String * 1
dateModifEdition As String * 11
pt9 As String * 1
edition As String * 4
pt10 As String * 1
FormatPlan As String * 1
pt11 As String * 1
dateDernMAJ As String * 11
pt12 As String * 1
dateCreation As String * 11
pt13 As String * 1
unitéAchat As String * 2
pt14 As String * 1
coeff As String * 13
pt15 As String * 1
unitedeVente As String * 2
pt16 As String * 1
coeffUV As String * 13
pt17 As String * 1
codeFamilleProduit As String * 2
pt18 As String * 1
codeFamilleArticle As String * 4
pt19 As String * 1
groupeProduction As String * 2
caractere1 As String * 2
End Type


le champs codeFamilleArticle est soit vide donc inexistant, soit il comprend 4 caracteres.
ce que je voudrais faire c remplir toutes les zones entre points virgules correspondant
a ce champs codeFamilleArticle avec 4 caracteres blanc lorsquil ny en a pas.
pourriez vous maider? (jespere que mon explication est assez precise!)
merci davance pour ceux qui essaieront.

20 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
re,

Regarde si le code peut t'aider.

Le resultat est un tableau de type Article (attention le dernier element du tableau est vide)
C:\1.txt est mon fichier source alors il te faudras le remplacer par le tien

Private Type article
codeArticle As String * 15 'correspond au premier champs
designationArticle As String * 35
designationAnglaise As String * 35
designation2 As String * 35
unité_de_mesure As String * 2
codeSource As String * 1
prixVente As String * 14
coutUnitaireStandart As String * 14
cycleDappro As String * 4
dateModifEdition As String * 11
edition As String * 4
FormatPlan As String * 1
dateDernMAJ As String * 11
dateCreation As String * 11
unitéAchat As String * 2
coeff As String * 13
unitedeVente As String * 2
coeffUV As String * 13
codeFamilleProduit As String * 2
codeFamilleArticle As String * 4
groupeProduction As String * 2
caractere1 As String * 2
End Type


Private Sub form_Load()
Dim LaLigne As String
Dim LesArticles() As article
ReDim LesArticles(0)
Open "C:\1.txt" For Input As #1


While Not EOF(1)
Line Input #1, LaLigne
LesArticles(UBound(LesArticles)) = FillArticles(LaLigne)
ReDim Preserve LesArticles(UBound(LesArticles) + 1)
Wend


Close #1


End Sub



Private Function FillArticles(LaLigne As String) As article
Dim TesDonnees() As String
Dim TmpArticle As article


TesDonnees = Split(LaLigne, ";")


With TmpArticle
.codeArticle = TesDonnees(0)
.designationArticle = TesDonnees(1)
.designationAnglaise = TesDonnees(2)
.designation2 = TesDonnees(3)
.unité_de_mesure = TesDonnees(4)
.codeSource = TesDonnees(5)
.prixVente = TesDonnees(6)
.coutUnitaireStandart = TesDonnees(7)
.cycleDappro = TesDonnees(8)
.dateModifEdition = TesDonnees(9)
.edition = TesDonnees(10)
.FormatPlan = TesDonnees(11)
.dateDernMAJ = TesDonnees(12)
.dateCreation = TesDonnees(13)
.unitéAchat = TesDonnees(14)
.coeff = TesDonnees(15)
.unitedeVente = TesDonnees(16)
.coeffUV = TesDonnees(17)
.codeFamilleProduit = TesDonnees(18)
.codeFamilleArticle = TesDonnees(19)
.groupeProduction = TesDonnees(20)
'.caractere1 = TesDonnees(21)
End With
FillArticles = TmpArticle
End Function



@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
103
Date d'inscription
jeudi 2 mars 2006
Statut
Membre
Dernière intervention
4 février 2009

merci a toi Julien car tu ma bcp aider. voici le code final, au cas ou quelquun aurai le meme pb:

Dim record As New adodb.Recordset
'CONNEXION A LA BASE DE DONNÉS
Dim Conn As New adodb.Connection 'Connecteur à la base
Dim Chaine As String 'Chaîne de connexion à ODBC



Private Type article
codeArticle As String * 15 'correspond au premier champs
designationArticle As String * 35
designationAnglaise As String * 35
designation2 As String * 35
unité_de_mesure As String * 2
codeSource As String * 1
prixVente As String * 14
coutUnitaireStandart As String * 14
cycleDappro As String * 4
dateModifEdition As String * 11
edition As String * 4
FormatPlan As String * 1
dateDernMAJ As String * 11
dateCreation As String * 11
unitéAchat As String * 2
coeff As String * 13
unitedeVente As String * 2
coeffUV As String * 13
codeFamilleProduit As String * 2
codeFamilleArticle As String * 4
groupeProduction As String * 2
caractere1 As String * 2
End Type




Private Function FillArticles(LaLigne As String) As article
Dim TesDonnees() As String
Dim TmpArticle As article


TesDonnees = Split(LaLigne, ";")


With TmpArticle
.codeArticle = TesDonnees(0)
.designationArticle = TesDonnees(1)
.designationAnglaise = TesDonnees(2)
.designation2 = TesDonnees(3)
.unité_de_mesure = TesDonnees(4)
.codeSource = TesDonnees(5)
.prixVente = TesDonnees(6)
.coutUnitaireStandart = TesDonnees(7)
.cycleDappro = TesDonnees(8)
.dateModifEdition = TesDonnees(9)
.edition = TesDonnees(10)
.FormatPlan = TesDonnees(11)
.dateDernMAJ = TesDonnees(12)
.dateCreation = TesDonnees(13)
.unitéAchat = TesDonnees(14)
.coeff = TesDonnees(15)
.unitedeVente = TesDonnees(16)
.coeffUV = TesDonnees(17)
.codeFamilleProduit = TesDonnees(18)
.codeFamilleArticle = TesDonnees(19)
.groupeProduction = TesDonnees(20)
'.caractere1 = TesDonnees(21)
End With
FillArticles = TmpArticle


With TmpArticle
'On crée la requête
req2 = "INSERT INTO article VALUES ('" _
& Replace(Trim(.codeArticle), "'", "\'") & "','" _
& Replace(Trim(.designationArticle), "'", "\'") & "','" _
& Replace(Trim(.designationAnglaise), "'", "\'") & "','" _
& Replace(Trim(.unité_de_mesure), "'", "\'") & "','" _
& Replace(Trim(.codeSource), "'", "\'") & "','" _
& Replace(Trim(.edition), "'", "\'") & "','" _
& Replace(Trim(.FormatPlan), "'", "\'") & "');"


End With
'On met à jour la base
If Asc(TmpArticle.codeArticle) <> 0 Then
With record
.ActiveConnection = Conn
.Source = req2
.Open
End With
End If


End Function





Private Sub form_Load()


'Initialisation
Chaine = "driver={MySQL ODBC 3.51 Driver};" _
& "database=ordre_de_fabrication;" _
& "server=localhost;" _
& "uid=root;" _
& "pwd=123456;" _
& "port=;" _
& "option=;" _
& "stmt=;"


'Connexion à MySQL
With Conn
.ConnectionString = Chaine
.Open
End With



Dim LaLigne As String
Dim LesArticles() As article
ReDim LesArticles(0)
Open "C:\Documents and Settings\elisabeth.novello\Bureau\Files ALPHA1\ARTICLE_WEB_OF.TXT" For Input As #1


While Not EOF(1)
Line Input #1, LaLigne
LesArticles(UBound(LesArticles)) = FillArticles(LaLigne)
ReDim Preserve LesArticles(UBound(LesArticles) + 1)
Wend


Close #1


End Sub
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
14833
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
7 décembre 2021
157
Bonjour

Tu peux regarder comment faire après un split.

Il est plus facile de batiser kk1 que de la convertir. (surtout en programmation)
Une question se pose sur le forum, pas en privé
NHenry (VB6, VBA excel, VB.NET, C++, C#.Net)
Messages postés
268
Date d'inscription
lundi 9 janvier 2006
Statut
Membre
Dernière intervention
19 janvier 2017
2
Tout celà est bien compliqué, pour ma part, j'aurais fait une analyse de la chaîne de la ligne du fichier csv comme suit:

Sub ExtractCSV(sFileCSV As String, rsTableBD As Recordset)
Dim lFile as Long, sLine as String, sField As String, n As Byte, m As Byte
lFile=FreeFile
Open sFileCSV For Input As #lFile
Do
Line Input #lFile, sLine
m=0
rsTableBD.AddNew
For n=1 To Len(sLine)
If Mid(sLine,n,1)<>";" Then 'Lecture des données
sField=sField & Mid(sLine,n,1)
Else 'Enregistrement du champ
If sField<>"" Then rsTableDB.Fields(m)=sField
sField=""
m=m+1
End If
'Je suppose qu'il n'y a pas de ";" en fin de ligne
If n=Len(sLine) Then
If sField<>"" Then rsTableDB.Fields(m)=sField
End If
Next n
rsTableBD.Update
Loop Until EOF(lFile)
Close #lFile
End Sub
Bon courage!...
Messages postés
14833
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
7 décembre 2021
157
Bonjour

Après un split, tu as toutes les données dans un tableau, tu peux donc voir tous les items de la ligne et les traités sans utuiliser de Recordset (d'ailleur je n'en n'ai jamais utiliser).

Il est plus facile de batiser kk1 que de la convertir. (surtout en programmation)
Une question se pose sur le forum, pas en privé
NHenry (VB6, VBA excel, VB.NET, C++, C#.Net)
Messages postés
103
Date d'inscription
jeudi 2 mars 2006
Statut
Membre
Dernière intervention
4 février 2009

le probleme c que je dois utliser le recordset. et je nai jamais utiliser un split donc je ne sais pas comment il faut faire! merci de ton aide NHenry
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
salut,

Il est vrai que la fonction Split t'irais parfaitement.

As tu vraiment besoin de garder les ";"

Sinon essaie de voir:

Option Explicit
Private Type article
codeArticle As String * 15 'correspond au premier champs
designationArticle As String * 35
designationAnglaise As String * 35
designation2 As String * 35
unité_de_mesure As String * 2
codeSource As String * 1
prixVente As String * 14
coutUnitaireStandart As String * 14
cycleDappro As String * 4
dateModifEdition As String * 11
edition As String * 4
FormatPlan As String * 1
dateDernMAJ As String * 11
dateCreation As String * 11
unitéAchat As String * 2
coeff As String * 13
unitedeVente As String * 2
coeffUV As String * 13
codeFamilleProduit As String * 2
codeFamilleArticle As String * 4
groupeProduction As String * 2
caractere1 As String * 2
End Type


Private Sub form_Load()



Dim TaLigne As String
Dim TesDonnees() As String
Dim TmpArticle As article
TaLigne = "0032-1DM ;SUPPORT MOULEUSE 1DM ;SUPPORT ;" & _
" ;UN;N; 7509.8900; 4688.8428; 0;00-XXX-0000;" & _
" ; ;20-FEB-1998;26-FEB-1992;UN; 1.000000;UN; 1.000000;SU;NOME;ME"
TesDonnees = Split(TaLigne, ";")


With TmpArticle
.codeArticle = TesDonnees(0)
.designationArticle = TesDonnees(1)
.designationAnglaise = TesDonnees(2)
.designation2 = TesDonnees(3)
.unité_de_mesure = TesDonnees(4)
.codeSource = TesDonnees(5)
.prixVente = TesDonnees(6)
.coutUnitaireStandart = TesDonnees(7)
.cycleDappro = TesDonnees(8)
.dateModifEdition = TesDonnees(9)
.edition = TesDonnees(10)
.FormatPlan = TesDonnees(11)
.dateDernMAJ = TesDonnees(12)
.dateCreation = TesDonnees(13)
.unitéAchat = TesDonnees(14)
.coeff = TesDonnees(15)
.unitedeVente = TesDonnees(16)
.coeffUV = TesDonnees(17)
.codeFamilleProduit = TesDonnees(18)
.codeFamilleArticle = TesDonnees(19)
.groupeProduction = TesDonnees(20)
.caractere1 = TesDonnees(21)
End With
End Sub

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Messages postés
103
Date d'inscription
jeudi 2 mars 2006
Statut
Membre
Dernière intervention
4 février 2009

peux tu mexpliquer comment on fait dans mon cas avec un split? peut etre que cela pourrait maider. merci NHenry
Messages postés
103
Date d'inscription
jeudi 2 mars 2006
Statut
Membre
Dernière intervention
4 février 2009

salut Julien,
je nai pas besoin de garder les";" mais il faut bien les stocker quelque part non?
Messages postés
14833
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
7 décembre 2021
157
Bonjour

[auteurdetail.aspx?ID=89254 jrivet]
te donne une exemple fonctionnel, à toi de voir si cela te convient.

Il est plus facile de batiser kk1 que de la convertir. (surtout en programmation)
Une question se pose sur le forum, pas en privé
NHenry (VB6, VBA excel, VB.NET, C++, C#.Net)
Messages postés
103
Date d'inscription
jeudi 2 mars 2006
Statut
Membre
Dernière intervention
4 février 2009

le pb avec ton code Julien c que tu pars du principe que je nai quune ligne alors que en realite jen ai 160 000. et dans ce cas comment je fais?
Messages postés
14833
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
7 décembre 2021
157
Bonjour

Tu lis ton fichier ligne par ligne, avec LINE INPUT par exemple.

Il est plus facile de batiser kk1 que de la convertir. (surtout en programmation)
Une question se pose sur le forum, pas en privé
NHenry (VB6, VBA excel, VB.NET, C++, C#.Net)
Messages postés
103
Date d'inscription
jeudi 2 mars 2006
Statut
Membre
Dernière intervention
4 février 2009

et ensuite je voudrais y integrer ce code mais je ny parviens pas:
'REMPLISSAGE TABLE ARTICLE
' 'On lit le fichier des articles
' Fichart = FreeFile
'
' Open "C:\Documents and Settings\elisabeth.novello\Bureau\Files ALPHA1\ARTICLE_WEB_OF.TXT" For Random Access Read As #Fichart Len = Len(art)
'
' While Not EOF(Fichart)
' Get #Fichart, , art
'
' With art
' 'On crée la requête
' req2 = "INSERT INTO article VALUES ('" _
' & Replace(Trim(.codeArticle), "'", "\'") & "','" _
' & Replace(Trim(.designationArticle), "'", "\'") & "','" _
' & Replace(Trim(.designationAnglaise), "'", "\'") & "','" _
' & Replace(Trim(.unité_de_mesure), "'", "\'") & "','" _
' & Replace(Trim(.codeSource), "'", "\'") & "','" _
' & Replace(Trim(.edition), "'", "\'") & "','" _
' & Replace(Trim(.FormatPlan), "'", "\'") & "');"
'
' End With
' 'On met à jour la base
' If Asc(art.codeArticle) <> 0 Then
' With record
' .ActiveConnection = Conn
' .Source = req2
' .Open
' End With
' End If
'
' Wend
' Close #Fichart

comment je fais?
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
re, ou est ce que ca coince?
Que fais cette ligne exactement Get #Fichart, , art

les get rempli ta structure tout seul???

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
oui... les joies du mode Random....

Renfield
Admin CodeS-SourceS - MVP Visual Basic
Messages postés
103
Date d'inscription
jeudi 2 mars 2006
Statut
Membre
Dernière intervention
4 février 2009

c le code que jutilise pour remplir ma table article car le but de la manip est de remplir une table et g voulu adapter ce code mais je ny suis pas parvenue! voila pour lexplication.
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Re,

Et tu ne peux pas essayer la "fonction" que je t'ai proposee?

En l'adaptant a ta sauce.

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Messages postés
103
Date d'inscription
jeudi 2 mars 2006
Statut
Membre
Dernière intervention
4 février 2009

deja fait , mais pas sans erreur
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Re,

Le truc c est que j ai lu a partir d un fichier ou:
-Une Ligne = Un article

Peu etre que ton fichier source n est pas fait comme ca.
@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Re,

Ravi d'avoir pu t'aider

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée