PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Lecture CSV avec des <0>
Lecture CSV avec des <0>
Débuté par Philippe, 04 juil. 2024 15:28 - 13 réponses
Membre enregistré
125 messages
Posté le 04 juillet 2024 - 15:28
Bonjour,

je créée un fichier csv et écrit dedans avec le code suivant:

NomCheminFichier = sCheminDonnées + "/VersPC/PATIENTPC_" + NumériqueVersChaîne(fichierA.IDVISITE) + ".csv"
IDFichier = fOuvre(NomCheminFichier, foAjout)
ResEcrit = fEcritLigne(IDFichier, fichierA.IDVISITE + ";" + fichierA.IDOPERAT + ";" + fichierA.IDPATIENT)
ResFermeFichier = fFerme(IDFichier)

Je transfère ensuite le fichier en FTP sur un serveur et lorsque je le récupère en local:
UnFichier = GlNomRepPROG +"\VersPC\PATIENTPC_*.csv"
IDFichier = fOuvre(UnFichier, foLectureEcriture)
WLigne = fChargeTexte(UnFichier)

Mon contenu est: 1<0>6<0>3<0>7<0>;<0>P<0>H<0>I<0>L<0>I<0>P<0>P<0>E<0>

Au lieu de 1637; PHILIPPE

Quelqu'un sait m'expliquer pourquoi ?

Merci

--
Cordialement

Philippe T.
Membre enregistré
4 097 messages
Posté le 04 juillet 2024 - 16:56
Bonjour,
C'est typique de l'UNICODE

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
125 messages
Posté le 05 juillet 2024 - 09:05
Bonjour Voroltinquo,

merci pour ta réponse.

En fait, je dois transférer un fichier csv depuis une tablette (WM) vers Windev.

Depuis ma tablette je fais:
WResu est une chaine Unicode
WResu = "2" + ";" + "PHILIPPE"

Et lorsque je récupère le fichier du côté de Windev, je fais:
WLigne est une chaine
IDFichier = fOuvre(UnFichier, foLectureEcriture)
Wligne = fChargeTexte(UnFichier)

Mais WLigne contient : 2<0>;<0>P<0>H<0>I<0>L<0>I<0>P<0>P<0>E<0>

Je fais quoi de faux ?

Merci pour ton aide.

--
Cordialement

Philippe T.
Membre enregistré
434 messages
Posté le 05 juillet 2024 - 09:31
Bonjour,

Il est dommage de ne pas avoir pris en compte l'indice de Voroltinquo, pour effectuer une recherche dans la documentation sur la manipulation de chaînes UNICODE. :)

Vous écrivez une chaine UNICODE sur votre tablette. Il faut donc la récupérer dans une chaîne UNICODE sur WinDev. Pour cela, plusieurs possibilités : soit déclarer tout le projet en UNICODE via la description de la configuration du projet, soit déclarer votre WLigne comme une chaîne UNICODE. Sinon utiliser la fonction UnicodeVersAnsi().
Membre enregistré
125 messages
Posté le 05 juillet 2024 - 09:37
Bonjour bchanudet,

j'avais bien tenu compte de la remarque de Voroltinquo, mais je viens de réessayer avec ce code du coté de Windev:

WResU est une chaîne Unicode
WResU = fChargeTexte(UnFichier)

Et j'ai toujours le même problème.

--
Cordialement

Philippe T.
Membre enregistré
2 676 messages
Posté le 05 juillet 2024 - 09:50
Bonjour,

Plutôt que de traiter le fichier en Unicode, il est préférable de la coder en UTF 8. Ton code devient:
// Tablette
WResu est une chaîne = ChaîneVersUTF8 ("2" + ";" + "PHILIPPE")

// Appli desktop
WLigne est une chaîne
IDFichier = fOuvre(UnFichier, foLectureEcriture)
Wligne = UTF8VersChaîne(fChargeTexte(UnFichier))


--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
125 messages
Posté le 05 juillet 2024 - 10:29
Je viens de faire exactement ça, et j'ai toujours le même problème:

Côté tablette :
WREsu est une chaine
WResU = ChaîneVersUTF8("2" + ";" + "PHILIPPE")

Côté Windev :
IDFichier = fOuvre(UnFichier, foLectureEcriture)
WLigne = UTF8VersChaîne(fChargeTexte(UnFichier))

--
Cordialement

Philippe T.
Membre enregistré
434 messages
Posté le 05 juillet 2024 - 10:43
Avez-vous essayé cela :

WResU est une chaîne UNICODE
WResU = fChargeTexte(UnFichier, foUnicode)


La documentation de fChargeTexte() propose aussi de passer par un buffer :

// Charger le contenu du fichier "C:\MesFichiers\MonFichier.XML" dans la chaîne MaChaîne
MonBuffer est un Buffer
MonBuffer = fChargeTexte("C:\MesFichiers\MonFichier.XML")
MaChaîne est une chaîne UNICODE
MaChaîne = MonBuffer
Info(MaChaîne)
Message modifié, 05 juillet 2024 - 10:45
Membre enregistré
125 messages
Posté le 05 juillet 2024 - 10:48
;( Toujours le même soucis

--
Cordialement

Philippe T.
Membre enregistré
125 messages
Posté le 05 juillet 2024 - 10:52
Bonne nouvelle !!!!!

Alors je viens de tester la deuxième partie de code:
MonBuffer est un Buffer
MonBuffer = fChargeTexte(UnFichier)
MaChaîne est une chaîne Unicode
MaChaîne = MonBuffer

Dans MonBuffer, j'ai les <0> et dès que je charge MaChaine, j'ai les bons caractères !!!

Merci beaucoup et excellente journée.

--
Cordialement

Philippe T.
Membre enregistré
125 messages
Posté le 05 juillet 2024 - 13:32
Je vous sollicite encore dans ce post, car j'ai un autre problème de traitement sur cette chaîne Unicode.

Après avoir récupéré mon contenu de mon fichier csv, je n'arrive pas à lire mon fichier HFSQL avec la clé. Mon exemple:

Wligne contient "2;PHILIPPE"

WLigne est une chaine Unicode
WID est une chaîne
WID = ExtraitChaîne(WLigne,1,";")

et WID contient alors "?2"

Je dois mettre le contenu dans une chaine normale, car je dois lire mon fichier avec
HLitRecherchePremier(MonFichier,UniqueKey,[CodSoc,WID])

et si fais cette commande avec une variable de type Unicode (le contenu sera bien = "2"), le record n'est pas trouvé.

Merci pour votre aide.

--
Cordialement

Philippe T.
Membre enregistré
81 messages
Posté le 05 juillet 2024 - 16:41
Salut,

et si; maintenant que tu as une chaine UNICODE qui va bien, pourquoi tu ne la transfères pas dans une chaine ANSI avec la fonction UnicodeVersAnsi ?
Il y a plein de fonctions qui permettent de passer d'un encodage à un autre, fais un petit tour dans l'aide.


Autre Remarque, tu aurais pu charger le contenu du fichier avec le paramètre "foUnicode" de sMonContenu = fChargeTexte(sMonFichier,foUnicode)

Eric
Membre enregistré
125 messages
Posté le 05 juillet 2024 - 18:42
Bonjour et merci Eric !

alors finalement cette solution fonctionne :
WLigne est une chaîne Unicode
WIDPatient est une chaîne Unicode
WLigne = fChargeTexte(UnFichier, foUnicode)
WIDPatient = ExtraitChaîne(WLigne,1,";")

Mais pour info, ce code ci-dessous ne fonctionnait pas:

MonBuffer est un Buffer
WLigne est une chaîne Unicode
WChaine est une chaîne
MonBuffer = fChargeTexte(UnFichier)
WLigne = MonBuffer //Contenu = "2;PHILIPPE"
WChaine = UnicodeVersAnsi(WLigne) //Contenu WChaine = "?2;PHILIPPE"

Donc selon moi, impossible de bien récupérer dans une variable de type chaine tout court (même après conversion avec UnicodeVersAnsi.

--
Cordialement

Philippe T.
Membre enregistré
2 676 messages
Posté le 08 juillet 2024 - 08:09
Juste pour info, L'unicode n'est pas traité de la même manière selon les plateformes. Le seul encodage commun à toutes les plateformes est l'UTF8.

Il est donc préférable de trouver la solution avec de l'UTF8 et non de l'Unicode. Tu risques de rencontrer des problèmes avec d'autres fonctions, notamment si tu veux chiffrer une chaîne d'un côté et la déchiffrer sur une autre plateforme.

--
Cordialement,

Philippe SAINT-BERTIN