Modifier un seul mot dans un fichier

Résolu
eccsup Messages postés 77 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 14 novembre 2022 - 26 mai 2011 à 14:20
eccsup Messages postés 77 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 14 novembre 2022 - 31 mai 2011 à 13:03
Bonjour a tous,

VOila mon probleme :

J'ai un fichier faisant office de base de donnée, et je souhaitrais ne modifier qu'une seul ligne dans celui ci, sans avoir besoin de réécrire le fichier en entier.

J'ai pour l'instant une solution qui marche, mais qui oblige la réécriture complete du fichier, or, comme il fait plus de 2000 lignes, ca prend vite du temps.

Si quelqu'un sait comment faire, je suis ouvert a tout, car pour l'instant, je n'ai trouver que des solution conseillant de réécrire tout le fichier.

Merci pour votre aide

21 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
27 mai 2011 à 15:55
chez moi ça prend meme pas 1 sec pour écrire
40000 lignes dans un fichier
 Private listitems As New List(Of String)
For iter = 0 To 40000
            listitems.Add("mvmvlvdldv,vdmdmdd fvdfdgdfgfdfd ---" & iter.ToString)
        Next
        System.IO.File.WriteAllLines(pathfichier, listitems.ToArray)


donc ce n'est l'écriture du fichier qui est long
3
eccsup Messages postés 77 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 14 novembre 2022
31 mai 2011 à 11:31
Bon, du coup, problème résolu, en écrivant dans un fichier temporaire sur la machine locale, le traitement va extèmement vite, du coup, plus besoin de modifier un seul mot à la fois

Merci pour tout, shayW, en tout cas
3
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
26 mai 2011 à 14:36
Salut
je ne pense pas qu'on peut le faire
il faut réecrire tout le fichier
2000 lignes c'est rien

envoi ton code pour voir
0
eccsup Messages postés 77 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 14 novembre 2022
26 mai 2011 à 15:16
Je sais que c'est pas énorme, mais il faudrait que le traitement se fasse en une fraction de seconde...

ce serait le cas si on pourrait n'ajouter qu'une ligne, ou qu'un mot au fichier

sinon, voila le code que j'utilise, mais il est relativement long a traiter (faut dire que les PC sur lesquel il tourne sont pas super :

My.Computer.FileSystem.WriteAllText(nomFichierBDDTemporaire, "", False)

            'on enregistre les données, triées, dans le fichier de base de donnée
            BaseDeDonnees.Sort()
            Dim buffer As String = ""
            For i As Int32 = 0 To (BaseDeDonnees.Count - 1)
                Dim ligne As String = BaseDeDonnees(i)
                buffer = buffer & ligne & vbCrLf
                If buffer.Length > 5000 Then
                    My.Computer.FileSystem.WriteAllText(nomFichierBDDTemporaire, buffer, True)
                    buffer = ""
                End If
            Next
            My.Computer.FileSystem.WriteAllText(nomFichierBDDTemporaire, buffer, True)
            buffer = ""
            My.Computer.FileSystem.MoveFile(nomFichierBDDTemporaire, nomFichierBdd, True)


l'Utilisation de la variable 'buffer' me fait gagner un temps considérable, mais ce n'est pas suffisant
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
26 mai 2011 à 15:58
tout d'abord
quand tu dis fichier quel genre
fichier text ?

tu sais quelle ligne il faut modifier ?
0
eccsup Messages postés 77 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 14 novembre 2022
26 mai 2011 à 16:06
oui, fichier texte de la forme :


mot1;mot2;mot3
mot4;mot5;mot6
mot7;mot8;mot9
..............


Et ce que je veux faire, c'est changer le mot6 par exemple en mot10, sans avoir à tout réécrire....

ou éventuellement juste réécrire la ligne 'mot4;mot5;mot6' en 'mot4;mot5;mot10'

Grace aux fonctions que j'ai implémentées précédemment, il ne me faut pas longtemps pour trouver la ligne a modifier.

Tu as une idée?
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
26 mai 2011 à 16:14
c'est la structure de ton fichier ?
trois mots par ligne et entre chaque mot
tu as un ;

Et ce que je veux faire, c'est changer le mot6 par exemple en mot10, sans avoir à tout réécrire....


seulement ça ou autre chose aussi
que veux tu faire exactement ?
0
eccsup Messages postés 77 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 14 novembre 2022
26 mai 2011 à 16:34
non, c'est la structure simplifié... le nombre de mots par ligne est variable


Il s'agit d'une base de donnée faisant la correspondance entre plusieurs mot de plusieurs langues

Par exemple, tous les mots de la colonne1 corresponde à la langue anglaise, tous ceux de la colonne2 à la langue francaise....

Ce que je veux faire, c'est pouvoir modifier un mot si l'utilisateur se rend compte que la traduction est fausse
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
26 mai 2011 à 20:10
Ce n'est pas encore clair
non, c'est la structure simplifié... le nombre de mots par ligne est variable


quelle est la vraie structure exacte ?

Ce que je veux faire, c'est pouvoir modifier un mot si l'utilisateur se rend compte que la traduction est fausse


tu affiches à l'utilisateur tout le fichier ?
comment dans ton interface l'utilisateur indique
qu'un mot est mal traduit ?


tu corrige un mot à la fois ou plusieurs mots
mal traduit ?

plus tu donnes des détails mieux c'est
0
eccsup Messages postés 77 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 14 novembre 2022
27 mai 2011 à 09:23
Je vais essayer d'etre clair


Mon application est utilisée pour stocker des mots (en Anglais) et leurs traduction dans plusieurs langues....

Ces langues sont paramètrables par l'utilisateur : il peut en rajouter autant qu'il le souhaite.

les mots sont enregistrés dans un fichier texte, lequel est de la forme suivante:

--------------------------------------------
Anglais (GB);Francais (FR);Espagnol (ES)
Dog;Chien;perro
Cat;chat;gato
............

---------------------------------------------
Les différentes colonnes sont séparées par des ';', et chaque langue correspond à une colonne :
-tous les mots anglais sont situés à la première colonne
-tous les mots francais sont situés a la deuxième colonne
...........;

Ensuite, j'ai un interface graphique du type de 'google traduction' qui, lorsque l'utilisateur saisit un mot, renvoi sa traduction dans une langue choisie.


Mon problème se trouve ici: si le mot traduit est incorrecte, je veux que l'utilisateur ait la possibilitée de le modifier. Pour cela, il saisit la nouvelle traduction dans un textBox et appuie sur un bouton 'modifier'.

Le problème pour l'instant c'est que, lorsqu'il appuie sur le bouton 'modifier', je stock le contenu de ma base de donnée dans une arrayList, je modifie la traduction du mot, je supprime l'ancien fichier de base de donnée, et je le réécris complètement.

Ce traitement n'est pas optimal, car, pour changer un seul mot, j'en réécris environ 2000, c'est pour cela que je cherchais un moyen de modifier une ligne précise du fichier.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
27 mai 2011 à 10:36
Salut
je commence à compendre que ce n'est pas si simple
Enfin ce n'est pas vraiment comme Google
la tu ne traduis seulement un mot pas une
phrase c'est plutot comme Babylon

pourquoi tu ne mets pas les mots dans une BD
sans fichier text
Si tu contruis ta BD correctement c'est beaucoup plus efficace
tu peux fair avec un seul tableau
Avec Access je ferais comme ça
TraductionTab le non du tableau
les champs du tableau
automatic key EN FR ES
chaque champ correspond à une langue
par l'utilisateur choisit de quelle langue
à quelle langue traduire disons de français à anglais
il va écrire fleur
Sql Select En From TraductionTab WHERE FR = 'FLEUR'
Si c'est mal traduit
j'écris la traduction correct
il va falloir mettre à jour le TraductionTab
UPDTATE
il se peut que le mot correct se trouve
autre part dans le tableau il faudra
corriger

Enfin c'est en gros
0
eccsup Messages postés 77 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 14 novembre 2022
27 mai 2011 à 11:30
oui, j'y ai pensé, et ca n'aurait tenu qu'a moi, c'est ce que j'aurais fait, mais mon entreprise m'impose l'usage du fichier texte (c'est dans le cahier des charges)

sinon, j'aurais probablement utilisé une base de donnée type oracle, optimale pour ce genre de situation.


En tout cas, merci pour toutes tes réponses et pour le temps que tu as consacré a mon problème , ShayW
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
27 mai 2011 à 12:51
Ah bon
mais mon entreprise m'impose l'usage du fichier texte (c'est dans le cahier des charges)


c'est comme ci qu'on donnait à un jardinier
une pioche pour retouner le jardin
c'est comme ça que veut le chef
alors retourner le jardin avec une pioche rapidement

je sais qu'avec les fichiers si on modifie
il faut après écrire tout le fichier

bien alors on va essayer avec le fichier txt
le prblème ce n'est pas pour lire le fichier
ou pour l'écrire
tu peux le lire entierement dans une list of string
Private listitems As New List(Of String)
 Try
   listitems = System.IO.File.ReadAllLines(pathfichier).ToList
 Catch ex As Exception
   MessageBox.Show(ex.Message)
End Try


maintenant il faut traiter avec le listitems
avec le list tu as des méthodes efficaces
dans ton fichier entre chaque mot il y a
une virgule ou un espace
et aussi comment fais tu pour traduire ?
0
eccsup Messages postés 77 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 14 novembre 2022
27 mai 2011 à 14:00
j'ai des méthodes du genre 'getMotLigne(byval ligne as String,byval colonne as Int16) as String', qui renvoi le contenu de la colonne passée en paramètre.

et des fonction de recherche dans une arrayList qui renvoie la ligne du mot a recherché dans une colonne donnée :

chercheLigneBDD (byval mot as String, byval Colonne as int16) as Int64

Etc.


Mes fonctions de recherches sont optimales car elles sont extrèmement rapide, mais mes fonctions pour écrire, elles, sont très lentes...
0
eccsup Messages postés 77 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 14 novembre 2022
28 mai 2011 à 21:13
Il y a peut-etre aussi le fait que le fichier soit sur un réseau qui n'accélère rien...

En tout cas, merci pour tout, je vais tester avec ta méthode et je te tiens au courant
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
28 mai 2011 à 22:02
Salut
Je pense que ce n'est pas si simple de programmer
un dictionnaire
Si je comprends la structure de l'application pour chaque mot en français tu as un mot en anglais et en espagnol
mais si le meme mot en anglais peut etre traduit différement en français il va apparaitre plusieurs fois dans la meme colonne
ex light lumière léger
je veux voir la traduction de light je vais avoir
léger si c'est par ordre alphabétique
mais lumière non
0
eccsup Messages postés 77 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 14 novembre 2022
30 mai 2011 à 09:15
Salut, ce n'est pas vraiment un dictionnaire que je programme, car il n'est utilisé que pour des mots techniques très spécifiques. Par conséquent, il ne peut n'y avoir qu'une seule traduction par mot...

J'ai essayé du travail avec la ListItem, et, c'est extrèmement rapide quand j'utilise cette fonction localement sur Mon XP, mais le temps de traitement est hyper long quand la fonction est lancé depuis les Windows Seven des utilisateurs avec le dico sur le réseaux...

J'en déduit que ca vient du réseau.

En tout cas, merci pour ton aide
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
30 mai 2011 à 13:30
Salut
As tu testé le bout de code qui écrit 40000 lignes dans un fichier dans le réseau
C'est aussi long ?
0
eccsup Messages postés 77 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 14 novembre 2022
30 mai 2011 à 14:11
Oui, sur le réseau c'est super long,
Du coup, je pense que je vais faire un fichier temporaire sur l'ordinateur local, puis le copier grace a My.Computer.filesystem.movefile()
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
31 mai 2011 à 12:09
Salut
et après tu le mets en réseau ?
chacun peut corriger mais que ce passe t'il
si un corrige et l'autre veut voir la traduction
chacun regarde sur un fichier différent
il faut effectuer plusieurs test en réseau
0
Rejoignez-nous