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

conversion / import de données dans un fichier texte

3 réponses
Avatar
Sébastien Kirche
Bonjour,

j'aurais besoin de convertir certaines informations dans un fichier qui
me sert de log.

Comme je me sers d'Emacs pour écrire le fichier, je me suis dit que je
pourrais utiliser Emacs pour effectuer la modification.

À mes débuts de l'utilisation d'Emacs, je me suis servi d'une fonction
qui insérait la date en format anglo-saxon, que j'ai modifié par la
suite pour avoir notre format de date.

Je voudrais maintenant convertir les dates anglo-saxonnes. Je suppose
que c'est faisable en elisp et ça me fera un bon cours sur la question
mais je n'ai aucune idée d'où commencer.

Exemple des infos à traiter :
,----
| Thursday, February 27, 2003
| correction 2 bugs schintfCpta.c : champs ignorés dans le rechercher
| expédition & conditions exp
|
| Friday, February 28, 2003
| ajout des champs IDCOMPTETCT_BLFACT, IDCOMPTETCT_CONTROLENC et
| IDCOMPTETN_EXPEDITION modifiables
| IDCOMPTETN_EXPEDITION ne fonctionne pas !!!
|
| Monday, March 3, 2003
| IDCOMPTETN_EXPEDITION fonctionne
| correction bug suppression fenêtre élément Fournisseur dans
| SchintfCpta.c/ReplaceCompteT
`----

J'aimerai que ça se transforme en
,----
| lundi 24 octobre 2005
| blabla
| blabla
|
| mardi 25 octobre 2005
| blabla
| blabla
`----

Cas particulier : j'ai certaines dates sous la forme «Wednesday, April
30 - Monday, May 05» mais il y en a peu.

Je pensais pouvoir effectuer le traitement sur la région sélectionnée,
par exemple, mais je n'ai aucune expérience du traitement de chaînes en
lisp.

L'un de nos maître ès-elisp pourrait-il me guider un peu sur la
faisabilité du truc et si possible proposer un squelette ? Merci.

--
Sébastien Kirche

3 réponses

Avatar
Matthieu Moy
Sébastien Kirche writes:

Je voudrais maintenant convertir les dates anglo-saxonnes. Je suppose
que c'est faisable en elisp et ça me fera un bon cours sur la question
mais je n'ai aucune idée d'où commencer.



Positionner le curseur sur la ligne qui t'intéresse.
Récupérer la date dans une chaine (buffer-substring-no-properties ...)
C-h f date-to-time RET
C-h f parse-time-string RET
Aller voir le source des fonctions en question.
C-h f format-time-string RET

Je pensais pouvoir effectuer le traitement sur la région sélectionnée,



C-h f save-restriction RET
C-h f narrow-to-region RET

--
Matthieu
Avatar
drkm
Sébastien Kirche wrote:

| Friday, February 28, 2003
| ajout des champs IDCOMPTETCT_BLFACT, IDCOMPTETCT_CONTROLENC et
| IDCOMPTETN_EXPEDITION modifiables
| IDCOMPTETN_EXPEDITION ne fonctionne pas !!!

| Monday, March 3, 2003
| IDCOMPTETN_EXPEDITION fonctionne
| correction bug suppression fenêtre élément Fournisseur dans
| SchintfCpta.c/ReplaceCompteT



Le point intéressant (si l'exemple n'est pas tronqué par
rapport à la réalité), c'est que les chaînes à modifier
commencent toutes sur la première colonne, sont les seules dans
le cas, et toute la ligne repésente la chaîne à modifier.

Il suffit donc de traverser chaque ligne d'une position à une
autre et de traiter les lignes commençant sur la première
colonne. Un 'looking-at' avec des parenthèses et des
'match-string' te serviront ensuite à extraire les données de la
chaîne. Des alists pourront te servir de dictionnaires pour les
conversions.

Cas particulier : j'ai certaines dates sous la forme «Wednesday, April
30 - Monday, May 05» mais il y en a peu.



Tu peux facilement détecter ce cas (présence d'un '-') et agir
en conséquence (appel d'une routine de transformation
alternative, ou plutôt découpage en deux sous-chaînes et appel de
la même routine pour chacune).

Je pensais pouvoir effectuer le traitement sur la région sélectionn ée,
par exemple, mais je n'ai aucune expérience du traitement de chaînes en
lisp.



Les fonctions ci-dessus te permettent d'utiliser des
expressions rationnelles sur un buffer, et d'en récupérer les
sous-chaînes. 'match-beginning' et 'match-end' te permettent
d'en récupérer les bornes. Il te suffit alors de remplacer une
partie du buffer par une autre (générée à partir de la permière).

Pour ce qui est des bornes, tu as plusieurs solutions. Si tu
veux agir sur une région, tu acceptes deux arguments représentant
les bornes de la région. Un code de 'interactive' te permet d'en
récupérer automatiquement la valeur lors d'un appel interactif.
Tu peux également jouer avec des choses comme : « je travaille
sur le buffer, sauf si argument préfixe, alors sur la région »,
ou mieux encore : « j'agit de (point) à (point-max), sauf si
'transient-mark-mode' est enabled et que la region est active,
alors sur la région ». Si je ne m'abuse, c'est comme cela que
fonctionne 'query-replace[-regexp]'.

L'un de nos maître ès-elisp pourrait-il me guider un peu sur la
faisabilité du truc et si possible proposer un squelette ? Merci.



Désolé pour ne pas avoir le temps de proposer un squelette de
code, mais je pense que les infos ci-dessus devraient déjà être
d'une certaine aide.

Sinon, des outils comme SED et AWK seraient ici assez adaptés,
sauf bien sûr si les aspects apprentissage d'ELisp ou intégration
avec Emacs sont importants.

--drkm
Avatar
Sébastien Kirche
Le 24 octobre 2005 à 17:10, drkm vraute :

Le point intéressant (si l'exemple n'est pas tronqué par
rapport à la réalité), c'est que les chaînes à modifier
commencent toutes sur la première colonne, sont les seules dans
le cas, et toute la ligne repésente la chaîne à modifier.



Oui, les dates commencent toutes sur la première colonne et les
informations relatives sont indentées

Il suffit donc de traverser chaque ligne d'une position à une
autre et de traiter les lignes commençant sur la première
colonne. Un 'looking-at' avec des parenthèses et des
'match-string' te serviront ensuite à extraire les données de la
chaîne.



Ok, je vais essayer de partir là dessus.

Des alists pourront te servir de dictionnaires pour les conversions.



Par la correspondance monday => lundi et january => janvier ? Je me
demandais s'il n'existe pas de fonction stringToDate qui saurait
interpréter une date anglaise ? Éventuellement en modifiant les locales
auparavant ?

> Cas particulier : j'ai certaines dates sous la forme «Wednesday,
> April 30 - Monday, May 05» mais il y en a peu.

Tu peux facilement détecter ce cas (présence d'un '-') et agir
en conséquence (appel d'une routine de transformation
alternative, ou plutôt découpage en deux sous-chaînes et appel de
la même routine pour chacune).



Ok.


> Je pensais pouvoir effectuer le traitement sur la région
> sélectionnée, par exemple, mais je n'ai aucune expérience du
> traitement de chaînes en lisp.

Les fonctions ci-dessus te permettent d'utiliser des
expressions rationnelles sur un buffer, et d'en récupérer les
sous-chaînes. 'match-beginning' et 'match-end' te permettent
d'en récupérer les bornes. Il te suffit alors de remplacer une
partie du buffer par une autre (générée à partir de la permière).



La partie générée se trouve alors dans un buffer temporaire ?

Pour ce qui est des bornes, tu as plusieurs solutions. Si tu
veux agir sur une région, tu acceptes deux arguments représentant
les bornes de la région. Un code de 'interactive' te permet d'en
récupérer automatiquement la valeur lors d'un appel interactif.
Tu peux également jouer avec des choses comme : « je travaille
sur le buffer, sauf si argument préfixe, alors sur la région »,
ou mieux encore : « j'agit de (point) à (point-max), sauf si
'transient-mark-mode' est enabled et que la region est active,
alors sur la région ». Si je ne m'abuse, c'est comme cela que
fonctionne 'query-replace[-regexp]'.



Ok, je vais essayer de traduire ça.

> L'un de nos maître ès-elisp pourrait-il me guider un peu sur la
> faisabilité du truc et si possible proposer un squelette ? Merci.

Désolé pour ne pas avoir le temps de proposer un squelette de
code, mais je pense que les infos ci-dessus devraient déjà être
d'une certaine aide.



Oui, et les infos de Matthieu aussi.

Sinon, des outils comme SED et AWK seraient ici assez adaptés,
sauf bien sûr si les aspects apprentissage d'ELisp ou intégration
avec Emacs sont importants.



En fait J'aurais plus d'affinité avec python, mais l'idée est bien de
coder de l'elisp histoire de me faire la main.

J'ai encore trop de lacunes dans ce langage et quand on fait plus
qu'utiliser emacs ça limite les possibilités.

J'essaierai de publier le résultat pour me faire corriger.
Merci à vous deux pour les idées de départ.
--
Sébastien Kirche