Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

rn et excel

3 réponses
Avatar
zad massy
je voudrai importer des données excel exportées en csv (délimiteur de
champs: ;) mais certains champs posent problème, ayant des \r\n (cas de
cellule sur plusieur lignes dans excel) et donc perl croit que c'est un
"End of Record" et ne charge pas toute la ligne d'un coup dans mon while
(<>) { traitement par ligne }

exemple:

1;TOTO;GRAND PERE;1970\r\n
2;TATA;"GRAND MERE\r\nADOPTIVE\r\nGENTILLE";1945\r\n
3;TITI;FILS;1984\r\n

je voudrais donc filtrer avant de lire mon fichier pour obtenir:

1;TOTO;GRAND PERE;1970\r\n
2;TATA;GRAND MERE ADOPTIVE GENTILLE;1945\r\n
3;TITI;FILS;1984\r\n

qui lui serait lu sans problème, mais je ne voit pas quel s///g employé
pour virer ses \r\n (un ou plusieurs) entre deux ".

merci de votre aide

3 réponses

Avatar
Paul GABORIT
À (at) Thu, 03 Jun 2004 16:09:29 +0200,
zad massy écrivait (wrote):
je voudrai importer des données excel exportées en csv (délimiteur de
champs: ;) mais certains champs posent problème, ayant des rn (cas de
cellule sur plusieur lignes dans excel) et donc perl croit que c'est un "End
of Record" et ne charge pas toute la ligne d'un coup dans mon while (<>) {
traitement par ligne }


'perl' ne croit rien du tout. C'est la manière dont vous avez codé l'analyse
de vos fichiers CSV qui vous amène vers ce problème.

Le plus simple est d'utiliser un module tout prêt : Text::CSV (si vous voulez
un module pure Perl mais plus lent que le suivant) ou Text::CSV_XS. Ils savent
très bien lire des fichiers CSV. Ils vous permettent, entre autres, de définir
le séparateur de ligne et de champs, d'indiquer le caractère de "quotation" et
celui d'échapement pour pouvoir continuer à utiliser ce caractère de
quotation, etc. Pour la lecture d'un fichier CSV, il *faut* utiliser la
méthode 'getline' qui sait justement comment retrouver un enregistrement
complet (que les champs contiennent ou non des passage à la ligne).

exemple:

1;TOTO;GRAND PERE;1970rn
2;TATA;"GRAND MERErnADOPTIVErnGENTILLE";1945rn
3;TITI;FILS;1984rn

je voudrais donc filtrer avant de lire mon fichier pour obtenir:

1;TOTO;GRAND PERE;1970rn
2;TATA;GRAND MERE ADOPTIVE GENTILLE;1945rn
3;TITI;FILS;1984rn

qui lui serait lu sans problème, mais je ne voit pas quel s///g employé pour
virer ses rn (un ou plusieurs) entre deux ".


La doc de Text::CSV_XS donne un exemple intéressant :

"I said, ""Hi!""",Yes,"",2.34,,"1.09"rn

Voici les 5 champs :

1-> I sais, "Hi!"
2-> Yes
3->
4-> 2.34
5-> 1.09

Aviez-vous pensé à ce cas là ?

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Paul GABORIT
À (at) Thu, 03 Jun 2004 17:06:42 +0200,
Paul GABORIT écrivait (wrote):
La doc de Text::CSV_XS donne un exemple intéressant :

"I said, ""Hi!""",Yes,"",2.34,,"1.09"rn

Voici les 5 champs :

1-> I sais, "Hi!"
2-> Yes
3->
4-> 2.34
5-> 1.09


Je corrige ma propre prose :

Voici les 6 champs :
1-> I sais, "Hi!"
2-> Yes
3->
4-> 2.34
5->
6-> 1.09

Aviez-vous pensé à ce cas là ?


Au passage dans la solution que vous envisagiez de coder, vous perdez les
passages à la ligne présent dans les valeurs d'origine ? Est-ce volontaire ou
est-ce une solution de repli ?

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
zad massy
Paul GABORIT wrote:

À (at) Thu, 03 Jun 2004 17:06:42 +0200,
Paul GABORIT écrivait (wrote):

La doc de Text::CSV_XS donne un exemple intéressant :

"I said, ""Hi!""",Yes,"",2.34,,"1.09"rn

Voici les 5 champs :

1-> I sais, "Hi!"
2-> Yes
3->
4-> 2.34
5-> 1.09



Je corrige ma propre prose :

Voici les 6 champs :
1-> I sais, "Hi!"
2-> Yes
3->
4-> 2.34
5->
6-> 1.09


Aviez-vous pensé à ce cas là ?



Au passage dans la solution que vous envisagiez de coder, vous perdez les
passages à la ligne présent dans les valeurs d'origine ? Est-ce volontaire ou
est-ce une solution de repli ?

c'est volontaire, il me gêne


je veux supprimer ces rn entre les deux guillemets (double-quote)

je suis en train de regarder le module

merci de votre réponse