[R] Transformer un fichier texte en CSV et inverse

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
clark17
Niveau 4
Niveau 4
Messages : 70
Enregistré le : ven. 23 sept. 2011 02:12
Status : Hors ligne

[R] Transformer un fichier texte en CSV et inverse

#1

Message par clark17 »

Bonjour à tous,

Afin de proposer une traduction française à un jeu que j'affectionne particulièrement (Capitalism Lab -> http://www.capitalismlab.com/) j'aurai besoin de transformer un fichier texte en csv, et vice versa.

La traduction du jeu s’effectue à l'aide d'un fichier translate.txt qui contient la phrase d'origine en anglais puis sa traduction en français et enfin un séparateur. Concrètement, il se présente sous cette forme:

Code : Tout sélectionner

LOAD SCRIPT|
Charger script|
~
Your Name|
Votre Nom|
~
Corporation Name|
Nom Corporation|
~
Difficulty Level|
Niveau de difficulté|
~
 
Le problème c'est que sous cette forme c'est super chiant à éditer. Si je transforme ce fichier texte en csv il sera beaucoup plus facilement éditable sous libre office par exemple. Je pourrais aussi l'agrémenter avec des commentaires par exemple.

L'idéal serait ainsi d'aboutir à un fichier csv sous cette forme:

Code : Tout sélectionner

; Commentaires
LOAD SCRIPT|Charger script
Your Name|Votre Nom
Corporation Name|Nom Corporation
Difficulty Level|Niveau de difficulté
 
Modifié en dernier par clark17 le ven. 21 mars 2014 22:31, modifié 1 fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Transformer un fichier texte en CSV et inverse

#2

Message par jguinch »

Un truc de ce genre ?
► Afficher le texte
Bon, j'en connais un qui va arriver avec une solution "plus-mieux" :wink:
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
clark17
Niveau 4
Niveau 4
Messages : 70
Enregistré le : ven. 23 sept. 2011 02:12
Status : Hors ligne

Re: [..] Transformer un fichier texte en CSV et inverse

#3

Message par clark17 »

Merci de ton aide! Les expressions régulières c'est géniales mais j'ai beaucoup de mal à m'y faire...

Voila ce que ça donne pour transformer mon translate.txt en csv:

Code : Tout sélectionner

#include<File.au3>

Local $fichier = FileOpen("test.txt", 0)

; Test si fichier ok
If $fichier = -1 Then
    MsgBox(0, "Erreur", "Impossible d'ouvrir le fichier.")
    Exit
EndIf

; Lecture contenu du fichier txt
Local $contenu = FileRead($fichier)
If @error = -1 Then Exit
FileClose($fichier)

; Formattage en CSV
$contenuformate = StringRegExpReplace($contenu, "([^|]+)\|\R([^|]+)\|\R~", "$1|$2")

; Ecriture dans un fichier CSV
FileWrite("test.csv", $contenuformate)
FileClose("test.csv")

; Message de réussite
MsgBox(0, "Fin", "Transformation en CSV terminée.")
 
Maintenant je me lance dans le chemin inverse 8)
clark17
Niveau 4
Niveau 4
Messages : 70
Enregistré le : ven. 23 sept. 2011 02:12
Status : Hors ligne

Re: [..] Transformer un fichier texte en CSV et inverse

#4

Message par clark17 »

Bon finalement je sèche un peu sur l'expression régulière inverse.

Pour l'instant j'en suis la:

Code : Tout sélectionner

$contenuformate = StringRegExpReplace($contenu, "([^|]+)\|([^|]+)\R", "$1|\R$2\R~\R")
 
Cependant cette expression ne fonctionne pas, il interprête \R comme un caractère standard et non un échappement...
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Transformer un fichier texte en CSV et inverse

#5

Message par jguinch »

L'opération inverse :

Code : Tout sélectionner

$sResultTXT = StringRegExpReplace($sResult, "(?m)([^;]+);(.+)", "$1|" & @CRLF & "$2|" & @CRLF & "~")
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Transformer un fichier texte en CSV et inverse

#6

Message par mikell »

clark17, ton message précédent semble suggérer que tu n'es pas franchement à l'aise avec les expressions régulières
Tu te retrouves donc face à un choix :
- apprendre à maîtriser les regex (c'est vrai que c'est génial) parce qu'il vaut toujours mieux comprendre ce qu'on écrit dans son script
- approfondir les fonctions String* (plus compréhensibles) qui te permettent d'arriver au même résultat mais avec davantage de lignes, exemple :
► Afficher le texte
J'ajouterais même qu'acquérir une bonne maîtrise de ces fonctions String* te facilite grandement la tâche pour appréhender ensuite la mécanique des expressions régulières :wink:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
clark17
Niveau 4
Niveau 4
Messages : 70
Enregistré le : ven. 23 sept. 2011 02:12
Status : Hors ligne

Re: [..] Transformer un fichier texte en CSV et inverse

#7

Message par clark17 »

Effectivement les expressions régulières c'est un peu ardu pour moi... Si tu as un bon tuto là-dessus je suis preneur.

Du coup je me rabats sur la fonction StringReplace comme tu me le suggères.

Pour essai je teste ceci:

Code : Tout sélectionner

$sContent = "LOAD SCRIPT|Charger script" & @CRLF & _
            "Your Name|Votre Nom" & @CRLF

$sContent = StringReplace($sContent, @crlf, "|" & "~" & @crlf )
$sContent = StringReplace($sContent, "|", "|" & @crlf)

MsgBox(0, "", $sContent)
 
Ca marche parfaitement, je me retrouve avec texte formatté comme je le désire.

Maintenant avec ce code pour convertir directement le fichier ça ne fonctionne pas:

Code : Tout sélectionner

#include<File.au3>

Local $fichier = FileOpen("translate.csv", 0)

; Test si fichier ok
If $fichier = -1 Then
    MsgBox(0, "Erreur", "Impossible d'ouvrir le fichier.")
    Exit
EndIf

; Lecture contenu du fichier txt
Local $contenu = FileRead($fichier)
If @error = -1 Then Exit
FileClose($fichier)

MsgBox(0, "Test", $contenu)

; Formattage en txt
$contenuformate = StringReplace($contenu, @crlf, "|" & "~" & @crlf )
$contenuformate = StringReplace($contenu, "|", "|" & @crlf)

MsgBox(0, "Test", $contenuformate)

; Ecriture dans un fichier CSV
FileWrite("translate_csv.txt", $contenuformate)
FileClose("translate_csv.txt")

; Message de réussite
MsgBox(0, "Fin", "Transformation en TXT terminée.")
 
Le fichier en entrée est composé comme ceci:
Automobile|voiture
Footweare|sport
Et il me genère cela:
Automobile|
voiture
Footweare|
sport
Je ne comprends vraiment pas pourquoi alors que j'utilise le même morceau de code???
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Transformer un fichier texte en CSV et inverse

#8

Message par jguinch »

Pour débuter avec les expressions régulières, il y a le topic Traitement de chaînes de caractères, rédigé par Mikell.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Transformer un fichier texte en CSV et inverse

#9

Message par mikell »

Attention aux variables, il y a 2 traitements successifs

Code : Tout sélectionner

[b]$texte2[/b] = StringReplace([b]$texte1[/b], @crlf, "|" & "~" & @crlf )
[b]$texte3[/b] = StringReplace([b]$texte2[/b], "|", "|" & @crlf)
Et pour démarrer : http://www.autoitscript.fr/autoit3/docs ... regexp.htm
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
clark17
Niveau 4
Niveau 4
Messages : 70
Enregistré le : ven. 23 sept. 2011 02:12
Status : Hors ligne

Re: [..] Transformer un fichier texte en CSV et inverse

#10

Message par clark17 »

Ok super finalement ça marche. Comme je maitrise mal les regex j'ai fait avec des stringreplace.

Voici mon code pour le sens csv -> txt:

Code : Tout sélectionner

#include<File.au3>

Local $fichier = FileOpen("translate.csv", 0)

; Test si fichier ok
If $fichier = -1 Then
    MsgBox(0, "Erreur", "Impossible d'ouvrir le fichier.")
    Exit
EndIf

; Lecture contenu du fichier txt
Local $contenu = FileRead($fichier)
If @error = -1 Then Exit
FileClose($fichier)

; Formattage en txt
$contenuformate1 = StringReplace($contenu, @crlf, "|" & "~" & @crlf )
$contenuformate2 = StringReplace($contenuformate1, "|", "|" & @crlf)

; Ecriture dans un fichier CSV
FileWrite("translate_csv.txt", $contenuformate2)
FileClose("translate_csv.txt")

; Message de réussite
MsgBox(0, "Fin", "Transformation en TXT terminée.")
 
Merci beaucoup à vous deux. Il ne me reste plus qu'a potasser ses regex :lol:
Répondre