Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2015, 12:59   #1
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию Массовая проверка

Доброго времени суток.
Столкнулся с задачей:
Проверить VLANы на наличие в файлах.
Это значит: Есть 32 файла с базой вланов.
Они почти все одинаковые, но в некоторых не хватает. К примеру в одном файле есть то, чего нету в другом и тд.
Задача проверить все файлы и сделать одну базу которая будет иметь все ВЛАНЫ.
База данных вланов включает в себя:
индекс, имя, состояние, порты.
Меня интересуют только индекс и имя.

Что на данный момент я сделал:
1. Проверка 2х файлов. Каким образом?
считываю первые 4 символа в строку (индекс)
к примеру:
23 (первый файл) и 45 (второй файл)
67 46
после цифры 3 пробела, удаляю их и перевожу в число
У первого и второго файла аналогично. После я отдельно выясняю где индекс меньше копирую первым в третий файл, когда доходит до того что индекс второго меньше чем у первого копирую строку из второго файла. Если совпадает то копирую один из них.

Код:
for i := 0 to len do
  begin
    if x <= len1 - 1 then
    begin
      temp1 := Memo1.Lines.Strings[x];
      for m := 0 to 5 do
      begin
        if Memo1.Lines.Strings[x][m] = ' ' then
        begin
          Delete(temp1, m, length(temp1) - m + 1);
          break;
        end;
      end;
    end;

    if z <= len2 - 1 then
    begin
      temp2 := Memo2.Lines.Strings[z];
      for l := 0 to 5 do
      begin
        if Memo2.Lines.Strings[z][l] = ' ' then
        begin
          Delete(temp2, l, length(temp2) - l + 1);
          break;
        end;
      end;
    end;

    if (x <= len1 - 1) or (z <= len2 - 1) then
    begin
      if StrToInt(temp1) = StrToInt(temp2) then
      begin
        Memo3.Lines.Add(Memo2.Lines[z]);
        inc(x);
        inc(z);
      end;
    end;

    if z <= len2 - 1 then
    begin
      if (StrToInt(temp1) > StrToInt(temp2)) then
      begin
        Memo3.Lines.Add(Memo2.Lines[z]);
        inc(z);
      end;
    end
    else if x <= len1 - 3 then
    begin
      inc(x);
      Memo3.Lines.Add(Memo1.Lines[x]);

    end;

    if x <= len1 - 1 then
    begin
      if (StrToInt(temp2) > StrToInt(temp1)) then
      begin
        Memo3.Lines.Add(Memo1.Lines[x]);
        inc(x);
      end;
    end
    else if z <= len2 - 3 then
    begin
      inc(z);
      Memo3.Lines.Add(Memo2.Lines[z]);

    end;
фрагмент кода моего алгоритма.

Как автоматизировать, что бы не подгружать каждый раз файл?
Как мне сразу загрузить 32 файла и работать с ними?
viks1 вне форума Ответить с цитированием
Старый 16.01.2015, 13:47   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Задача проверить все файлы и сделать одну базу которая будет иметь все ВЛАНЫ.
А бы ниче не писал вообще.
Все файлы загрузил бы в Экзель, отфильтровал (а точнее сгруппировал бы) по информации, и получил бы список без повторений.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.01.2015, 13:56   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Тут просто слияние, файлы должны быть отсортированы по возрастанию ключа в строке и можно примерно так:
Код:
var FileNames: array[1..32] of String;
    List1,List2: TStringList;
    i,i1,i2: Integer;
    s1,s2: String;

// В FileNames полные пути к файлам
// строки сравниваются целиком, переделай под свои требования
  List1:=TStringList.Create;
  List2:=TStringList.Create;
  try
    try
      List1.LoadFromFile(FileNames[1]);
    except
      ShowMessage(Format('Ошибка загрузки файла %s',[FileNames[1]]));
      Exit;
    end;
    for i:=2 to 32 do begin
      List2.Clear;
      try
        List2.LoadFromFile(FileNames[i]);
      except
        ShowMessage(Format('Ошибка загрузки файла %s',[FileNames[i]]));
        Exit;
      end;
      i1:=0; i2:=0;
      while i2<List2.Count do begin
        s2:=List2.Strings[i2];
        if i1=List1.Count then begin List1.Add(List2.Strings[i2]); Inc(i2); end
        else begin
          s1:=List1.Strings[i1];
          if s2<=s1 then begin
            if s2<s1 then List1.Insert(i1,List2.Strings[i2]);
            Inc(i2);
          end;
        end;
        Inc(i1);
      end;
    end;
    Memo1.Lines.Assign(List1);
  finally
    List1.Free;
    List2.Free;
  end;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.01.2015 в 14:52. Причина: Чуть подправил
Аватар вне форума Ответить с цитированием
Старый 19.01.2015, 12:03   #4
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

последовал примера Аватара
Но проблема с выходом за пределы листа.
Я уже по разному изощрялся с переменными, которые отвечают за перемещение по строкам но результата никакого.
В чем я ошибаюсь? (убил день...)
Код:
var
  Form1: TForm1;
  FN: array [1 .. 32] of string; // mass for file names vlans
  List1, List2, List3: TStringList; // list vlans
  p: integer; // pointer massiv

implementation

{$R *.dfm}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  inc(p);
  if OD.Execute then
    FN[p] := OD.FileName;
  Memo1.Lines.Add(FN[p]);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  len: integer;
  x, z: integer;
  i,j: integer;
  s1, s2: string;
  t1, t2: string;
begin
  List1 := TStringList.Create;
  List2 := TStringList.Create;
  List3 := TStringList.Create;
  p := 2;
  for i := 1 to 2 do
  begin
    if p = 2 then
      List1.LoadFromFile(FN[1])
    else
      List1.Add(List3.Text);

    List2.LoadFromFile(FN[p]);

    if List1.Count > List2.Count then
      len := List1.Count
    else
      len := List2.Count;

   for j := 0 to 4 do

    begin
   //   s1 := copy(List1[x], 1, 5); // выделение первы 4 символа строки
    //  s2 := copy(List2[z], 1, 5); //

      if s1 = s2 then
      begin
        //Memo2.Lines.Add(List1[x]);
        List3.Append(List2[z]);
        inc(x);
        inc(z);
      end

      else

      if (s1 > s2) then
      begin
       // Memo2.Lines.Add(List2[z]);
        List3.Append(List2[z]);
        inc(z);
      end

      else

      if (s2 > s1) then
      begin
      //  Memo2.Lines.Add(List1[x]);
        List3.Append(List1[x]);
        inc(x)
      end;

    end;
    Label3.Caption := 'x: ' + IntToStr(List1.Count);
    Label4.Caption := 'z: ' + IntToStr(List2.Count);
    Label5.Caption := 'len: ' + IntToStr(len);
    inc(p);
    List1.Clear;
    List1.Add(List3.Text);
    List3.Clear;
    x := 0;
    z := 0;
  end;
  Memo2.Lines.Add(List1.Text);

end;
// for пока до 4-х просто, что бы не грузить все 32 файла
Изображения
Тип файла: png Снимок.PNG (6.6 Кб, 145 просмотров)

Последний раз редактировалось viks1; 19.01.2015 в 12:38. Причина: Прикрепил скрин ошибки
viks1 вне форума Ответить с цитированием
Старый 19.01.2015, 12:40   #5
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

Нашел другой способ реализации данной задачи, это Collections.Generics .
Правда я не могу понять принцип его работы
viks1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массовая рассылка hoperkrot Windows 0 31.05.2013 06:53
Vk массовая авторизация Mrsqler Работа с сетью в Delphi 7 03.07.2012 07:30
массовая рассылка RUSlan48 Работа с сетью в Delphi 2 24.03.2011 23:10
Массовая замена Rossoman Microsoft Office Word 12 14.05.2010 00:32