Je dois vérifier chaque ligne d'un fichier par rapport à un autre fichier. Si une ligne du premier fichier existe dans le deuxième fichier, je dois la supprimer. En ce moment, j'utilise 2 listbox et le "for listbox1.items.count-1 downto do begin ..." Mon programme fonctionne mais je dois vérifier cela pour des fichiers énormes avec plus de 1 million de lignes. Existe-t-il une approche plus rapide de cette méthode? Je veux charger les fichiers dans la mémoire afin d'être extrêmement rapide! Merci

1
user2858981 5 janv. 2016 à 20:04

2 réponses

Meilleure réponse

Vous pouvez utiliser TStringList pour cela. La liste du deuxième fichier doit être triée pour une recherche plus rapide. Essaye ça:

var
  l1, l2: TStringList;
  i: integer;
begin
  l1 := nil;
  l2 := nil;
  try
    l1 := TStringList.Create;
    l1.loadfromFile('file1');

    l2 := TStringList.Create;
    l2.LoadFromFile('file2');
    l2.Sorted := True;

    for i := l1.Count -1 downto 0 do
    begin
      if l2.IndexOf(l1[i]) <> -1 then
        l1.Delete(i);
    end;

    l1.SaveToFile('file1');
  finally
    FreeEndNil(l1);
    FreeEndNil(l2);
  end
end
1
Evgeny 5 janv. 2016 à 17:21

Une solution rapide (mais pas la plus rapide) consiste à utiliser deux listes TStringList au lieu de zones de liste.

var
  a, b: TStringList;
  i: Integer;
begin
  a := TStringList.Create;
  b := TStringList.Create;
  try
    a.LoadFromFile('C:\1.txt');
    b.LoadFromFile('C:\2.txt');

    b.Sorted := True;

    for i := a.Count - 1 downto 0 do
    begin
      // Check if line of file 'a' are present in file 'b'
      // and delete line if true

      if b.IndexOf(a[i]) > -1 then
        a.Delete(i);
    end;

    a.SaveToFile('C:\1.txt');
  finally
    b.Free;
    a.Free;
  end;
end;

Encore une fois, il s'agit d'une solution lente et simple qui charge des fichiers entiers dans la RAM. Ce sera toujours beaucoup plus rapide que d'utiliser une ListBox. Parfois, simple suffit pour résoudre un problème ponctuel.

Une méthode plus rapide serait de créer un index (par exemple, une arborescence binaire) des deux fichiers sur le disque dur et d'utiliser cet index pour comparer. De cette façon, vous n'aurez pas besoin de stocker tous les fichiers sur le disque.

1
quasoft 6 janv. 2016 à 17:54