Gambas France BETA


Pas de compte ? Incription

Supprimer un élément texte

Ce sujet est résolu.

12
AuteurMessages
Foromus#1 Posté le 14/7/2017 à 09:46:32
Bonjour à tous,

Voilà, j'ai un fichier texte, avec une liste de mots , genre :

marteau
pinces
cisailles
etc.

Je liste tout ça avec un boucle While, et une variable "MotActuel", qui me récupère chaque mot successivement.
A un moment, le mot scanné n'est plus opportun, je veux le supprimer, purement et simplement, de manière à obtenir, par exemple :

marteau
cisailles
etc.

Là, j'ai supprimé "pinces".

Comment je fais ?

J'ai bien une solution, que j'ai utilisée dans la recherche des doublons : en fait, c'est simple, je recopie dans un second fichier, et si le mot apparaît deux fois de suite, je ne le recopie pas. Certes, je pourrais utiliser le même principe ici, mais si il y avait plus simple...

Merci à vous !
vuott#2 Posté le 14/7/2017 à 11:40:24
Ne cedere ineluctabili possimus
...je recopie dans un second fichier...

Tu pourrais utiliser aussi un array de type "string[ ]", puis éliminer le mot avec la méthode ".Remove()"; et finalement, pour générer le nouveau fichier texte, la méthode ".Join()" avec "File.Save()" . :|
« Vita non suavis esse potest, nec Mors amara. »
Foromus#3 Posté le 14/7/2017 à 14:54:00
Merci vuott,

Effectivement, j'avais pensé à une solution du genre, même sans en en appréhender totalement la finalité. Cela dit, c'est beaucoup trop compliqué.
Pour l'heure, mon besoin concerne un fichier dictionnaire, qui comporte environ 180 mille éléments (180 000), autant dire que, dans l'affaire, Gambas rame complètement ! Et c'est bien là tout le souci d'un logiciel interprété. Dans ma recherche des doublons - ce que j'ai fait remarquer ci-dessus, le processus prend énormément de temps, et ce qui est désagréable avec ce langage, c'est que l'on ne sait pas quand le processus est réellement terminé. Et il n'y a aucune possibilité de le savoir, il faut attendre en espérant que... Je me suis déjà fait avoir plusieurs fois (j'avais à l'occasion posté sur le sujet), c'est que, une fois le processus lancé, assez rapidement, l'affichage semble indiquer que l'opération est terminée, mais en réalité, tout le processus est occulté, probablement tout est confiné en RAM, aussi on ne sait pas où les choses en sont réellement. Quand j'ai fait mon programme de recopie de fichiers, j'ai eu des désagréments, et au final, je n'avais que la moitié ou le quart de recopié, simplement parce que, pensant les choses menées à bien, j'avais fermé l'application - trop prématurément, alors que tout n'était pas terminé. Ici, dans mon projet, j'ai une recherche de doublons, et j'ai eu le même souci, mais comme j'étais en alerte, j'en ai vite conclu que j'avais fermé prématurément.
Je crois que pour cette action spécifique de suppression, je vais opter pour la même formule que pour les doublons, à savoir la recopie pure et dure. Après tout, la routine de recopie existe pour les doublons, il me semble qu'elle pourrait aussi servir pour l'occasion, encore que l'écriture d'une nouvelle ne serait pas une tâche insurmontable !
Bref, en l’absence d'autre solution vraiment simple, je vais opter pour la recopie !
vuott#4 Posté le 14/7/2017 à 21:56:53
Ne cedere ineluctabili possimus
Dans ma recherche des doublons - ce que j'ai fait remarquer ci-dessus, le processus prend énormément de temps, et ce qui est désagréable avec ce langage, c'est que l'on ne sait pas quand le processus est réellement terminé.


...il faudrait savoir comment c'est le processus de recherche des copies, c'est-à-dire son code.
« Vita non suavis esse potest, nec Mors amara. »
Foromus#5 Posté le 14/7/2017 à 22:04:50
Finalement, j'ai opté pour la recopie, c'est simple, la procédure prévue pour les doublons fonctionne tout à fait bien pour ce tri, et sans aucune modification.
Non, ce n'est peut-être pas très "académique", mais je ne prétends pas au top niveau, et en l'occurrence, c'est quand même un usage ponctuel !
Après, je n'ai pas encore tenté les 180 000, là, je verrai si Gambas résiste...
linuxos#6 Posté le 14/7/2017 à 23:07:02
Un peu de sel, de poivre et la crevette sera... Bonjour Foromus,
Apres avoir lu ton message, j'ai été très surpris par ton experience en terme de lenteur pour effectuer ton traitement.

Voici un petit bout de code qui réalise ce que tu décris. Est ce que cela te conviendrait ?

Source dans la Forge: code-165-test-doublon-fichier.tar.gz
Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
gambix#7 Posté le 15/7/2017 à 19:30:13
Faire simple !sinon tu a la solution en deux passe...

tu créé un tableau aDoublon as new boolean[]

tu calcule le nombre total de mot et dimentionne aDoublon.Resize(iLignes)


tu lit le premier mot

tu teste le mot tout le long du fichier

si mot = motFichier alors aDoublon[iLigne] = true

tu passe au mot suivant

iLigne+=1

si aDoublon[iLigne] = true alors continue

sinon aMotFichier = Lire iLigne

si fin fichier alors sortir boucle

en faite comme ça on ne reteste pas les doublons

enfin on recopie le fichier sans les doublons c'est a dire les élément aDoublon qui sont a true.


Pour chaque ligne dans le fichier

si aDoublon[Ligne] = false alors ecritmotdans nouveaufichier


ensuite

avec cette technique plus l'analyse avancera plus elle sera rapide car elle ne reteste pas les mot marqué doublon. et elle ne génère le fichier propre qu'en fin de traitement

Si tu veux suivre la progression tu peut suivre iNumLine avec une progressbar.value = iNumLine/iTotLine

bon c'est du morse que je fais la mais je n'ai vraiment que peu de temps :-)
Moins de texte dans une signature c'est agrandir son espace.
Foromus#8 Posté le 15/7/2017 à 21:21:13
Bonjour à tous,

En fait, non, ce n'est pas vraiment résolu...
Là, je me suis fait lamentablement avoir, en réalité, mon idée de tester deux éléments qui se suivent, est assurément bonne, mais pas suffisante. Pour peu qu'un doublon soit 2 lignes plus loin, et c'est foutu !
De plus, comme c'est un dico, j'ai besoin que les éléments soient strictement classés alphabétiquement, ce qui ne semble pas le cas avec le code de linuxos. Au passage, j'avoue avoir pas mal de difficultés pour comprendre le code proposé, et honnêtement, je dois reconnaître que je n'y comprends pratiquement rien, il y a trop d'éléments que j'ignore, et que, par conséquent, je ne peux pas utiliser puisque je ne sais pas qui ils sont et à quoi ils servent. Par contre, là, au niveau de la rapidité, c'est génial !
Avec mon code, j'ai utilisé une appli extérieure une fois découvert le pourquoi des doublons oubliés, j'ai fait un tri et après, forcément, ça marche, et j'ai pu utiliser le fichier résultant (mais c'est un peu lourd comme procédé).
La proposition de gambix me convient bien, j'en avais un instant caressé l'idée, mais n'avais pas poursuivi justement par manque de connaissances sur le sujet, je n'ai utilisé qu'une seule fois une textearea, un peu plus les tableaux, c'est vrai donc, c'est à approfondir.
Je vois à peu près le code de gambix, sauf sa sortie justement en cas de doublon ; pourquoi "lire la ligne " ? Je mets à false, ça ne suffit pas ? Ensuite, je ne crois pas que le code fasse le tri (.sort), et là non plus, je ne sais pas faire un tri alphabétique, numérique ça va, mais avec les lettres, c'est différent.
Bon, je vais revoir tout ça, et essayer de reconstruire mon organigramme, l'idéal serait :
- Considérer un fichier
- Expurger les caractères accentués
- Eliminer les doublons
- Trier alphabétiquement
- Construire un nouveau fichoer
Merci à vous, je vais travailler là-dessus, mais ça va certainement me demander beaucoup de temps...
Pour l'anecdote, j'ai beaucoup de mal à comprendre votre code, c'est assez sibyllin, je suppose que vous maîtrisez d'autres langages, ceci expliquerait cela...
gambix#9 Posté le 16/7/2017 à 00:02:45
Faire simple !Pour le tri si tu n'a que 180000 mots il vaut mieux les charger dans un tableau et ensuite trier le tableau avec montableau.sort

en faite ton problème n'en est pas un ... je te fais ça en deux coup de cuillère a pot. Mais ça ne t'aiderai pas a apprendre n'est-ce pas ;-).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
DIM aTaBleau AS NEW String[]
DIM aDrapeau AS NEW Boolean[]
DIM iIndex AS INTEGER
DIM j AS INTEGER
DIM OutFile AS File
DIM sMot AS STRING


PRINT "Chargement du fichier..."
FOR EACH sMot IN Split(File.Load("MyDico.txt"), "\n")

IF sMot THEN aTaBleau.Add(Trim(sMot))

NEXT


PRINT "Tri alphabetique du tableau en cour..."

aTaBleau = aTaBleau.Sort(gb.Natural)

PRINT "Tableau trié..."
PRINT

aDrapeau.Resize(aTaBleau.Count)

PRINT "Découverte des doublons..."

FOR iIndex = 0 TO aTaBleau.Max
IF aDrapeau[iIndex] THEN CONTINUE
sMot = aTaBleau[iIndex]

FOR j = iIndex + 1 TO aTaBleau.Max
aDrapeau[j] = Comp(aTaBleau[j], sMot, gb.Natural + gb.IgnoreCase) = 0
NEXT

NEXT

PRINT

OutFile = OPEN "~/OutFile.txt" FOR WRITE CREATE

PRINT "Création du nouveau fichier..."

FOR iIndex = 0 TO aTaBleau.Max

IF aDrapeau[iIndex] THEN CONTINUE
PRINT #OutFile, aTaBleau[iIndex]

NEXT

CLOSE #OutFile

PRINT "Traitement Terminé !"


END
Moins de texte dans une signature c'est agrandir son espace.
Foromus#10 Posté le 18/7/2017 à 13:39:17

en faite ton problème n'en est pas un ... je te fais ça en deux coup de cuillère a pot. Mais ça ne t'aiderai pas a apprendre n'est-ce pas ;-).


Bonjour à tous,

@ gambix,
Vous programmez, moi je pose des contrôles sur une feuille... C'est toute la différence !
Mais grâce à vous, et aux autres, j'ai un peu appris, bien que ma "formation" à la programmation ait été tout autre.

Et je suis toujours reconnaissant aux aidants.

J'ai commencé à étudier votre code.
Désolé, les termes que l'on ne connaît pas, c'est difficile de les inventer, encore moins de les utiliser. Croyez bien que je ne suis pas négligent dans mes recherches, mais la logique n'est pas la même pour tout le monde.
Voici quelques commandes, que je ne connais pas, même si je les ai déjà +/- vues quelque part :

Split
\n (Written peut-être ?)
Trim

Par ailleurs, la variable aDrapeau est assignée comme Boolean, et vous faites :
1
aDrapeau.Resize(aTaBleau.Count)

Comment est-ce possible de la redimensionner à une valeur numérique (aTaBleau.Count) ?

Bon, une fois tout cela compris, je vais voir... Et ça ne ma paraît pas insurmontable.
Désolé, mais c'est parfois déroutant... Et l'accès à l'aide ne m'apparaît pas comme allant de soi, sinon, j'aurais eu beaucoup moins de questions à poser ici.

Merci de votre compréhension.
linuxos#11 Posté le 18/7/2017 à 15:03:19
Un peu de sel, de poivre et la crevette sera... Bonjour Foromus,

Il n'y a pas de problème avec ton niveau de connaissance de Gambas, nous avons tous débuté un jour...

aDrapeau => En fait c'est tout simple. Le fait d'ajouter les doubles crochets '[]' a une variable lors de sa déclaration permet de déclarer un Tableau du type de ton choix plutot qu'un variable simple.

Dim aVariable as Boolean => Simple variable Boolean
Dim aTabVariable as Boolean[] => Tableau de Boolean, qu'il faut instancier pour pouvour l'utiliser (Exemple: aTabVariable = New Boolean[])

\n => Equivalent Unix du retour a la ligne dans un texte, donc par exemple pour avoir un texte sur 2 lignes on insere au milieu du texte ce caractère. (L'anti-slash permet de ne pas interpréter 'n' comme une simple lettre mais comme un caractère spécial, dans notre cas, un retour a la ligne)

Trim => Fonction Gambas pour supprimer les espaces présents de chaque coté d'un texte
Ex: ' Toto s'en va a la pêche ' => deviendra: 'Toto s'en va a la pêche'

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
Foromus#12 Posté le 18/7/2017 à 17:24:18
Re,

Merci pour l'aide encore une fois !
Mais je viens de trouver le wiki avec sensiblement ce que j'avais vu autrefois. Il y a les explications de la fonction ou de la commande, et souvent des exemples. Le souci - gros pour moi, c'est que ce n'est pas traduit, et vu mon niveau d'anglais, ça coince une peu.

Pour les [] après la variable, en fait, je savais, j'ai quand même utilisé plusieurs fois, par contre, je ne me souviens pas de l'appellation de tableau, là, je dois avoir une lacune... Le + que j'ai utilisé, c'est à 3 dimensions, après, ça devient sujet à gourances multiples... Autrement, lors de la déclaration, qu'est-ce qui se passe si je laisse les crochets vides ? Et si je renseigne à la déclaration, par exemple pour un à deux dimensions, est-ce que je peux redimensionner après ? C'est ce qu'a fait gambix dans son code, il a laissé vides il me semble ? Et pourquoi devoir ajouter NEW dans maintes déclarations, surtout si c'est la première fois ?
Pour \n en retour à la ligne, c'est vrai que c'est plus simple que Chr$(13), par contre, est-ce nécessaire de le mettre entre & \n & dans une commande ( "fsdqf" \n "kjkj" ou "fsdqf" & \n & "kjkj" ) ?

Bon, avec cette nouvelle source de renseignements, je vais tenter de continuer.
gambix#13 Posté le 18/7/2017 à 22:02:08
Faire simple !

pour \n non justement c'est fait pour l'inclure directement dans la chaine "comme ceci.\n et hop a la ligne"

split découpe une chaine et retourne un tableau de chaine de type string[]. la découpe dans mon exemple se fais au niveau des retour a la ligne "\n"


dim aDrapeau as Boolean[] definit une variable pouvant etre liée a un tableau.

Dim aDrapeau as New Boolean[] definit une variable qui est liée a un nouveau tableau de taille non définie.


NOTA : Il faut bien avoir en tete que la variable ne contient pas le tableau en lui meme mais un index qui renvoi vers la zone memoire qui contient le tableau.

donc si je fait aMonTableau2 = aMonTableau1 en faite je copie uniquement l'index. Il s'agit par conséquent du meme tableau.

pour une vraie copie il fau faire aMontableau2 = aMonTableau1.Copy()



Dans l'exemple je redimentionne le tableau pour avoir le meme nombre de ligne qu'il y a de mot. en faite c'est deux tableau qui agissent en parallele. c'est plus simple et rapide qu'un multidimentionnel.

Donc si monDrapeau[2] est a true c'est que aMontMot[2] est un doublon.



juste pour info j'utilise la fonction comp qui est un outil permettant de comparer des chaines avec plusieurs options. Dans mon cas j'utilise une comparaison naturelle et sans tenir compte de la casse.
Moins de texte dans une signature c'est agrandir son espace.
Jack#14 Posté le 18/7/2017 à 22:46:42
Gambix, ou la richesse de la pédagogie ;)

Je trouve cette discussion très intéressante et très enrichissante.
Merci.
Pour un code démocratique nationalisons Gambas.
Patrick#15 Posté le 19/7/2017 à 08:07:35
Tout à fait d'accord Jack, Gambix et Flachy ont l'art et la manière de nous faire découvrir un petit truc à chaque discutions.
Quand je pense que lors de mon apprentissage de la programmation ... il y a un siècle, la seule façon de gérer et trier un tableau dont on ne connaissait pas les dimensions était de passer par les pointeurs. Il fallait réserver la place en mémoire, faire pointer les enregistrements les uns vers les autres et gérer les liens.
Aujourd'hui 2 instructions suffisent, y a du progrès quand même !!!
12