Bonjour
En fait j'ai insérer un contenu texte dans un Richedit, je veux supprimer les lignes vides dans ce texte, aligner les mots à gauche et supprimer les mots en doubles.
Comment faire tous cela?
Merci pour votre aide.
Bonjour
En fait j'ai insérer un contenu texte dans un Richedit, je veux supprimer les lignes vides dans ce texte, aligner les mots à gauche et supprimer les mots en doubles.
Comment faire tous cela?
Merci pour votre aide.
Bosser au niveau d'un TStringList, peut-être, puis l'injecter APRÈS dans le TRichEdit ?
TStringList permet déjà la suppression des doublons, le tri, les splits (découpe d'une ligne en mots, puis fusion des deux TStringList), etc. : autant l'utiliser...
Mac LAK.
___________________________________________________
Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.
Sources et composants Delphi sur mon site, L'antre du Lak.
Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.
Rejoignez-nous sur : ► Serveur de fichiers [NAS] ► Le Tableau de bord projets ► Le groupe de travail ICMO
Bonjour,
1) Suppression des doublons : Pour les supprimer tu peux :
- Sauver le contenu du RichEdit ou de ta StringList vers le disque puis utiliser le code de la procedure SupprDoublonsAOS(const nomFiSource, NomFiDest : string; IgnoreCase : boolean) que tu peux trouver ici : http://www.developpez.net/forums/d44...t/#post2784174
2) Suppression des lignes vides : les lignes vides étant également des doublons il n'en restera plus qu'une seule après l'étape 1.
3) Aligner les mots à gauche : Je suppose que tu veux dire aligner les "lignes" à gauche, et dans ce cas :
... par contre si tu veux découper chaque ligne en des séries de lignes ne contenant qu'un seul mot tu peux utiliser à cet effet la routine ExplodeLazy de ShaiLeTroll (utiliser la fonction Chercher du site)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 RichEdit1.SelectAll; RichEdit1.Paragraph.Alignment := taLeftJustify
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Gilbert Geyer, Mac LAK Merci pour votre réponse.
Je vais essayer ce que vous m'avez proposer et vous rendre la réponse.
Merci Gilbert Geyer, le lien était très bénéfique.
J’ai rencontré un autre problème, en fait je génère du texte dans un Richedit et quand je l’enregistre sous format « TXT » il génère tous le blabla de la mise en forme par exemple :
{\rtf1\ansi\ansicpg1252\deff0\deflang1036{\fonttbl{\f0\fnil\fcharset0 Arial;}}
\viewkind4\uc1\pard\fs16
\par
\par
\par
\par
\par
\par La l\'e9gende des si\'e8cles
\par
\par Hugo
\par Victor
\par
\par
J’ai passé alors vers Memo pour éviter ce problème, l’histoire de la suppression des doublons marche bien sauf que j’ai encore le problème de décalage. Je n’ai pas pu aligner les lignes à gauche et supprimer les vides de ces lignes.
Salut,
... l'utilisation d'un TMemo est une bonne idée pour virer les balises rtf.J’ai passé alors vers Memo pour éviter ce problème, l’histoire de la suppression des doublons marche bien sauf que j’ai encore le problème de décalage. Je n’ai pas pu aligner les lignes à gauche et supprimer les vides de ces lignes.
... par contre je ne comprends pas quand tu dis "Je n’ai pas pu aligner les lignes à gauche" vu que dans un TMemo l'alignement à gauche se fait tout seul avec taLeftJustify.
... et que veux tu dire par "supprimer les vides de ces lignes" ???
... s'agit-il des espaces ??? (vu qu'il ne peut s'agir de lignes entièrement vides dont la string vaut '' et qui sont donc des doublons supprimés automatiquement). Faudrait préciser un peu plus clairement.
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Salut
En fait j'essaye de générer le conenu textuel d'un fichier XML dans un TMemo et ça marche bien. Ci-dessous un exemple du contenu d'un Tmemo
-----------------------------------------------
******************************************
*********************Bases de donn¿ avanc¿
*********************Bases de donn¿ distibu¿
*********************Bases de donn¿ Ontologiques
*********************DataMining
*********************Entrep¿
*********************+213 66 55 44 33
*********************+213 66 77 88 77
*********************Laboratoire d'Inginerie en Bases de
*********************LIBD
*********************Universit¿e Bab Ezzouar USTHB, Alger
*********************xy@usthb.dz
******************************************
Donn¿
Hugo
HugoOO
La légende des siècles
Victor
Victorrr
---------------------------------------------------------
Je veux aligner le contenu pour qu'il soit comme suit :
-----------------------------------------------
Bases de donn¿ avanc¿
Bases de donn¿ distibu¿
Bases de donn¿ Ontologiques
DataMining
Entrep¿
+213 66 55 44 33
+213 66 77 88 77
Laboratoire d'Inginerie en Bases de
LIBD
Universit¿e Bab Ezzouar USTHB, Alger
xy@usthb.dz
Donn¿
Hugo
HugoOO
La légende des siècles
Victor
Victorrr
---------------------------------------------------------
Merci
Salut
Je ne m'y connais pas trop, mais tu devrais mettre le texte dans un mémo AVANT de le traiter ? Parce que les deux lignes soit disant vides doivent differer de par leurs balises (invisibles). Et si tu veux supprimer toutes les lignes vides, tu n'as qu'a inserer une ligne vide au début, ensuite effacer les doublons, et effacer la premiere ligne !
Bonne chance !
Edit : Lors du post de ce message, il n'y avait pas de "*" dans ton message donc, laisse tomber
Articles :
Création d'un système de chat en Pascal
Programmes :
Défi Pascal 2011 - Mon Tetris
Défi Pascal 2010 - Mon système de chat
Défi Delphi 2009 - Mon Sudoku Solver
Retrouvez mes différents projets sur ma page personnelle.
Salut,
Il se peut également que les deux lignes apparemment vides soient formées de quelques espaces ' ' chr(32)
Utilisation : Exemple pour supprimer toutes lignes formées par des '-----------' :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 procedure SupprStringOfChar(M : tMemo; CharIndesirable : char); var i,j,len : integer; begin If M.text='' then Exit; // Memo vide i:=M.lines.count-1; repeat len:=length(M.Lines[i]); if len=0 then M.lines.Delete(i) // Supprssion ligne réellement vide else begin j:=1; while (j<len) and (M.Lines[i][j]=CharIndesirable) do inc(j); if j=len then M.lines.Delete(i); end; dec(i); until i=-1; end;
A+.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 procedure TForm1.SpeedButton1Click(Sender: TObject); begin SupprStringOfChar(Memo2,'-'); end;
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Salut,
pour bien expliquer mon probleme j'ai édité mon message en haut.
les "*" représentent les vides affichés dans Tmemo
voilà
Re-Salut,
Utilisation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 procedure TrimLeftMemo(M : tMemo; CharIndesirable : char); var i,len : integer; snett : string; function TrimG(s : string; Ch : Char) : string; // suppression de Char indésirables à gauche de s var j : Integer; begin len := Length(s); j:=1; while (j <= len) and (s[j] = Ch) do Inc(j); Result := Copy(s, j, maxInt); end; begin if M.text='' then Exit; // Memo vide i:=M.lines.count-1; repeat snett:=TrimG(M.Lines[i],CharIndesirable); len:=length(snett); if len=0 then M.lines.Delete(i) // Suppression ligne else M.Lines[i]:=snett; // Remplacement ligne dec(i); until i=-1; end;
A+.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 procedure TForm1.SpeedButton1Click(Sender: TObject); begin TrimLeftMemo(Memo2,'*'); //<- pour supprimer des * à gauche TrimLeftMemo(Memo2,' ')); //<- pour supprimer des espaces vides à gauche end;
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Merci Gilbert
Je teste le programme et je t'informe sur les résultats
à Toute
Salut
Toujours le meme problème, je ne comprends rien sincerement.
J'ai testé les 2 codes de Gilbert, que les lignes vides sont supprimés, les espaces ne sont pas supprimés. voilà le résultats (les * sont les vides qui existent toujours).
-----------------------------------------------
*********************Bases de donn¿ avanc¿
*********************Bases de donn¿ distibu¿
*********************Bases de donn¿ Ontologiques
*********************DataMining
*********************Entrep¿
*********************+213 66 55 44 33
*********************+213 66 77 88 77
*********************Laboratoire d'Inginerie en Bases de
*********************LIBD
*********************Universit¿e Bab Ezzouar USTHB, Alger
*********************xy@usthb.dz
Donn¿
Hugo
HugoOO
La légende des siècles
Victor
Victorrr
---------------------------------------------------------
Salut,
Comme j'ai testé le code qui marche chez moi avec TrimLeftMemo(Memo2,' ')) il y a de fortes chances que tes vides ne soient pas formés d'espaces simples chr(32) mais d'espaces-insécables chr(160)....les * sont les vides qui existent toujours
Essayes donc avec TrimLeftMemo(Memo2,chr(160))
Et dans le cas où cela ne marcherait toujours pas le plus direct sera de faire un ShowMessage(IntToStr(Ord(Memo2.lines[i][1]))) où i correspond à l'indice d'une des lignes du type *********************DataMining
pour identifier la valeur X du chr(X) à injecter dans TrimLeftMemo(Memo2,chr(X)) pour supprimer les caractères en question.
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Bonsoir,
les vides finalement sont des #9 .
Mais Pour un TMemo qui contient des milliers de lignes le programme de suppression des vides et trop trop lent.
Merci
Salut,
Voiçi un truc qui utilise TMemoryStream, donc les suppressions se font en mémoire vive, donc vitesse optimale : ça supprime les #09 qu'ils soient à gauche ou à droite.Mais Pour un TMemo qui contient des milliers de lignes le programme de suppression des vides et trop trop lent.
Utilisation avec un TRichEdit ou un TMemo:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure SupprChar(const S : string; var MS : TMemoryStream; CharSuppr : Char); const ibMax = 65536; var ic,ib,transf : integer; buff : array [0..ibMax] of char; begin ib:=-1; transf:=0; MS.Position:=0; for ic:=1 to length(S) do begin if S[ic] <> CharSuppr then begin inc(ib); buff[ib]:=S[ic]; inc(transf); end; if transf=ibMax+1 then begin MS.Write(buff,transf); ib:=-1; transf:=0; end; end; if transf<>0 then MS.Write(buff,transf); end;
A+.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 procedure TForm1.SpeedButton1Click(Sender: TObject); var MS : tMemoryStream; i : integer; begin MS := tMemoryStream.create; //SupprChar(RichEdit1.Text,MS,#09); SupprChar(Memo2.Text,MS,#09); MS.Position:=0; //RichEdit1.Lines.LoadFromStream(MS); Memo2.Lines.LoadFromStream(MS); MS.Free; end;
EDIT : Suggestion à propos de vitesse : Faire un premier test en utilisant d'abord la routine de suppression des lignes formant des doublons avant d'utiliser le code ci-dessus, puis un deuxième test en faisant l'inverse, pour retenir la solution la plus rapide.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Salut,
Autre suggestion pour obtenir un gain de vitesse supplémentaire avec la procedure SupprChar(...) : Si tu disposes d'une memoire vive disponible de taille suffisante tu peux augmenter la valeur de la constante ibMax en conséquence.
Exemples de gains de vitesse obtenus ainsi (Pentium III à 1,13 GHz) :
- 1) avec SupprChar(ibMax = 65536) mis : 6563 millisecondes
- 2) SupprChar(ibMax =131072) mis : 5328 millisecondes soit 1,23 fois plus rapide que 1)
- 3) SupprChar(ibMax =262144) mis : 5250 millisecondes soit 1,25 fois plus rapide que 1)
Le fichier utilisé pour ces tests pesait 6,878 Mo et comportait 122024 lignes de texte (A titre de comparaison ce fichier équivaut à un texte imprimé en Times New Roman taille 10 recto-verso sur les 1000 pages d'un paquet de 500 feuilles A4, épais de 5 cm.)
A+.
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
Salut,
Le merci est prématuré car voici encore du gain de vitesse : Je pensais qu'on ne pourrait pas faire mieux qu'avec un MemoryStream ... mais que nenni les PChar pédalent encore plus vite : Voiçi SupprCharV2 :
Utilisation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 function SupprCharV2(const S : string; CharSuppr : Char) : string; var i,Transf : integer; pIn,pOut : PChar; begin Result:=S; if Result='' then Exit; pIn:=@S[1]; pOut:=@Result[1]; Transf:=0; for i:=1 to length(S) do begin if pIn^ <> CharSuppr then begin pOut^:=pIn^; inc(Transf); inc(pOut); end; inc(pIn); end; SetLength(Result,Transf); end;
Résultats SupprCharV2 durée : 2875 millisecondes (même fichier de tests de 6,878 Mo d'hier) donc si on compare aux résultats d'hier on multiplie le vitesse par environ deux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure TForm1.FormShow(Sender: TObject); begin RichEdit1.lines.LoadFromFile(ExtractFilePath(Application.ExeName)+'test0.mem'); // Chargement du fichier de tests de 6,878 Mo end; procedure TForm1.SpeedButton1Click(Sender: TObject); var Start : Dword; begin Start:=GetTickCount; RichEdit1.Text:=SupprCharV2(RichEdit1.Text,#09); RichEdit1.lines.Add('SupprCharV2 durée : '+IntToStr(GetTickCount-Start)+' millisecondes'); end;
A+.
EDIT : En cas d'utilisation de la fonction SupprCharV2 l'appeler comme recommandé c'est à dire avec RichEdit1.Text:=SupprCharV2(RichEdit1.Text,#09) ou Memo1.Text:=SupprCharV2(Memo1.Text,#09) c'est à dire sur l'ensemble du texte de façon à ce que le SetLength inclus à la fin de SupprCharV2 ne soit activé qu'une seule et unique fois quel que soit le nombre de lignes du texte (Donc éviter d'appeler SupprCharV2 dans une boucle pour effectuer un traitement ligne par ligne qui serait plus lent);
N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi
@Gilbert Geyer
Pourrais-tu essayer cette version?
je crois ganger quelque ms en éliminant la boucle for par Repeat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Function SupprCharV3(Const S: String; CharSuppr: Char): String; Var Transf: integer; pIn, pOut,pStop: Pchar; Begin If s = '' Then Exit; SetLength(Result, length(S)); pIn := @S[1]; pOut := @Result[1]; pStop:=@s[Length(s)]; Transf := 0; repeat If pIn^ <> (CharSuppr) Then Begin pOut^ := pIn^; inc(Transf); inc(pOut); End; inc(pIn); until(pStop<pIn); SetLength(Result, Transf); End;
à battre: 2875ms
Comment dupliquer un disque...ça vous intéresse?
Tutoriel et code source delphi ici
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager