PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Fichier CSV et extrait chaine
Fichier CSV et extrait chaine
Débuté par Eric FONTAINE, 16 juin 2018 15:31 - 5 réponses
Membre enregistré
7 messages
Posté le 16 juin 2018 - 15:31
Bonjour
Je dois lire un fichier CSV qui contient "," comme séparateur. Le glitch est que dans mon fichier CSV, le manufacturier utilise la ,
dans la description du produit.

Exemples :
Colonne 1 Colonne 2 Colonne 3
B00328BEY8,WiFi Booster RP-TNC High,Gain Screw-On OMNI-Directional ,111-8028066-0016227

Évidement ExtraitChaine prend 4 colonne dans cette situation

Comment je pourrais faire pour corrigé ce problème
Merci pour vos suggestions
Eric
Membre enregistré
182 messages
Popularité : +10 (10 votes)
Posté le 16 juin 2018 - 19:17
Hello,
Voici une solution, à adapter ensuite à ton besoin :

Ref_Full est une chaîne = "B00328BEY8,WiFi Booster RP,TNC High-Gain Screw-On OMNI-Directional ,111-8028066-0016227"
Ref_Container est un tableau <agrandissement=n> de chaînes

Ref_Commas est un entier = ChaîneOccurrence(Ref_Full, ",")
SELON Ref_Commas
CAS 2
Ref_Extracted est une chaîne = ExtraitChaîne(Ref_Full, rangPremier, [",", ", "])
TANTQUE Ref_Extracted <> EOT
TableauAjoute(Ref_Container, Ref_Extracted)

Ref_Extracted = ExtraitChaîne(Ref_Full, rangSuivant, [",", ", "])
FIN

AUTRE CAS
Ref_Chars est un entier = Taille(Ref_Full)

Ref_Container[1] = ExtraitChaîne(Ref_Full, 1, [",", ", "])
Ref_Parsed est une chaîne = ChaîneSupprime(Ref_Full, 1, (Taille(Ref_Container[1]) + 1))

Ref_Container[3] = ExtraitChaîne(Ref_Parsed, 1, [",", ", "], DepuisFin)

n est un entier = Position(Ref_Parsed, ",", 0, DepuisFin)
Ref_Container[2] = ChaîneSupprime(Ref_Parsed, n, Ref_Chars)
FIN

POUR CHAQUE Value de Ref_Container
Trace(Value)
FIN
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 17 juin 2018 - 10:20
Bonjour,

Le plus simple ce serait de changer de séparateur. Si tu ne peux pas, le code le plus simple que je puisse proposer
sMachaine est une chaîne = "B00328BEY8,WiFi Booster RP-TNC High,Gain Screw-On OMNI-Directional ,111-8028066-0016227"
nPos1,nPos2 sont des entiers

nPos1 = Position(sMachaine,",",1,DepuisDébut)
nPos2 = Position(sMachaine,",",Taille(sMachaine),DepuisFin)

Trace(sMachaine[[1 À nPos1-1]])
Trace(sMachaine[[nPos1+1 À nPos2-1]])
Trace(sMachaine[[nPos2+1 À]])


C'est simple et efficace
--
Cordialement,

Philippe SAINT-BERTIN
Message modifié, 17 juin 2018 - 10:22
Membre enregistré
7 messages
Posté le 18 juin 2018 - 02:11
Merci pour ces réponses mais le problème est que j'ai d'autres valeurs avant et après la chaîne présenté
En fait la chaîne présenté fait partie d'un fichier qui contient 15 éléments
Je peut mettre le texte problématique comme premier élément de mon fichier.

sMachaine est une chaîne = "WiFi Booster RP-TNC High,Gain Screw-On OMNI-Directional ,111-8028066-0016227,B00328BEY8 ............."

De cette façon, est-ce plus facile de trouver une solution?

Merci de prendre le temps de répondre
Eric
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 18 juin 2018 - 07:17
Si c'est toi qui construit le fichier, je ne peux que t'engager à changer le séparateur, tu y gagneras du temps. Si le nombre d'éléments est fixe (15 dans le cas présent), il; et préférable de mettre cette valeur en fin de ligne.

En effet, tu récupèreras les 14 premières valeurs et enfin tout le reste. Il est aisé de retrouver la position de la 14ème occurrence de la virgule. Mais mon conseil reste de changer de séparateur.

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
190 messages
Popularité : +21 (23 votes)
Posté le 18 juin 2018 - 11:01
Bonjour

il me semble que pour éviter ce genre de soucis il y a une convention, les chaines doivent être encadrées par des quotes ou double quotes.
genre :
1 , 2 , "je suis une chaine", 4, "5, rue des lilas", 6

après les instructions csv de windev ne tient pas compte de cette approche