Detection d'un doublon de lignes et le supprimer

cs_Napster Messages postés 76 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 19 septembre 2009 - 19 avril 2007 à 22:25
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015 - 20 avril 2007 à 22:40
salut tout le monde  ,
j'ai créer un petit editeurExtraire un fichie dans Listbox , mais dans le fichier ya des doublons de ligne , comment faire pour laisser qune ligne et  supprimer ces doublons .
 merci d'avance 

9 réponses

cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
20 avril 2007 à 09:06
salut,

tstringlist a une gestion de doublon si t alist est triée. lit l'aide.

sinon:
- parcourt la liste original
- si déjà present dans list copy, efface la l'item
- sinon ajouter le item dans list copy (list triée)

bon code,

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
20 avril 2007 à 18:25
Salut la compagnie ;)

un exemple :





<hr />
var
M:TStringlist;

begin
    M:=TStringlist.Create;
    M.Sorted:=true;
    M.Duplicates:=dupIgnore;
    M.Text:=Listbox1.Items.Text;
    Listbox1.Items.Text:=M.Text;
    M.Free;
end;


<hr />






DrJerome
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
20 avril 2007 à 18:41
tite correction :

var
  TSL : TStringList;
begin
  TSL := TStringList.Create;
  try
    TSL.Sorted     := true;
    TSL.Duplicates := dupIgnore;
    TSL.Assign(ListBox1.Items);
    ListBox1.Items.Assign(TSL);
  finally
    TSL.Free;
  end;
end;

<hr size="2" width="100%" />Croc (click me)
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
20 avril 2007 à 19:13
"Assign" corespond à une méthode AddStrings(TStrings(Source))  // je résume car c'est plus compliqué

ça marche aussi mais le principe est le même

c'est surtout "Duplicates" l'essentiel du code après on peut broder des optimisations voire de l'ASM pour ceux qui aiment l'asm

DrJerome
0

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

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
20 avril 2007 à 19:26
oui, il est certains qu'assign est moins simple que Text := Text ... mais, c'est la meilleure methode pour assigner le contenus d'un TStrings a un autre TStrings.
tout comme pour assigner le contenus d'un TPersistent a un autre TPersistent, c'est la methode la plus propre et la plus respectueuse.

donc autant, montrer, le bon exemple, même si il fait partis d'une multitude de solutions possibles, l'avantage d'assign c'est qu'elle s'adapte trés bien a toute forme de liste, contrairement a ta solution ou on perd certaines informations quand on utilise une liste particuliere, notement les listes delimitées et donc le duplicate ne pourrait pas fonctionner forcement.
de plus elle contient deja tout le code necessaire qu'on devrait normalement mettre en place lors des modifications de liste (beginupdate, endupdate, clear, etc)

procedure TStrings.Assign(Source: TPersistent);
begin
  if Source is TStrings then
  begin
    BeginUpdate;
    try
      Clear;
      FDefined := TStrings(Source).FDefined;
      FNameValueSeparator := TStrings(Source).FNameValueSeparator;
      FQuoteChar := TStrings(Source).FQuoteChar;
      FDelimiter := TStrings(Source).FDelimiter;
      AddStrings(TStrings(Source));
    finally
      EndUpdate;
    end;
    Exit;
  end;
  inherited Assign(Source);
end;

<hr size="2" width="100%" />Croc (click me)
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
20 avril 2007 à 19:34
c'est bien ce que je disais on brode sur ma soluce, le "duplicate" est l'essentiel

je répondais juste à une question je ne cherchais pas une solution générale à tous les problèmes non énoncés rajoutant des méthodes

Allez bravo si tu veux... moi je pars au restau ;)

DrJerome
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
20 avril 2007 à 19:39
sinon ton assign plus court :
<hr />
procedure TStrings.Assign(Source: TPersistent);
begin
  if Source is TStrings then
  begin
    BeginUpdate;
    try
      Clear;
      AddStrings(TStrings(Source));
    finally
      EndUpdate;
    end;
    Exit;
  end;
  inherited Assign(Source);
end;
<hr />

DrJerome
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
20 avril 2007 à 20:47
non non non, tu me modifie pas le code de la VCL comme ça mon ami !
que vas dire borland si tu commence a modifier leur code !?

<hr size="2" width="100%" />Croc (click me)
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
20 avril 2007 à 22:40
on n'a pas besoin des "separators" pour le cas présent (et selon les versions delphi le code n'est pas le même les separators ne sont pas sur toutes les versions)

DrJerome
0
Rejoignez-nous