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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.08.2011, 14:01   #21
zhukovms
Пользователь
 
Регистрация: 30.08.2011
Сообщений: 13
Радость

Serge_Bliznykov, спасибо за помощь. Можешь написать приблизительный кусочек кода как скидывать в TStringList и сортировать?
zhukovms вне форума Ответить с цитированием
Старый 31.08.2011, 14:36   #22
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот практически полностью готовая программа!
Код:
implementation
uses Masks;

{$R *.DFM}

var
  CurrentAreaFieldName : string;

function GetAreaFieldNameFromFile(FN : string) : string;
begin
   if FileExists(FN) then begin
     // тут нужно открыть файл FN, прочитать его и найти в нём строчку FLD. FIELD NAME:
     //  из данной строки вытащить всё, что идёт после двоеточия и вернуть в качестве
     //  наименования области. Если область не найдена - вернуть строчку о том, что возникла ошибка
     //  GetAreaFieldNameFromFile := '#ERROR#';
     // не забыть закрыть файл (если нужно)!
     GetAreaFieldNameFromFile := 'Ананьевское';
   end
   else
     GetAreaFieldNameFromFile := '#ERROR#';
end;

procedure DirSearch(Dir: string; Mask : string; var FNames, AreaNames : TStringList);
var
  SearchRec: TSearchRec;
begin
  Dir := IncludeTrailingBackslash(Dir);

  if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
    repeat
      Application.ProcessMessages;

      if (SearchRec.Attr and faDirectory) <> 0 then begin
        if (SearchRec.name <> '.') and (SearchRec.name <> '..') then
                DirSearch(Dir + SearchRec.name, Mask, FNames, AreaNames)
      end
      else
        // если нашли файл по маске, тогда...
        if MatchesMask(ExtractFileName(SearchRec.Name), Mask) then begin
            CurrentAreaFieldName := GetAreaFieldNameFromFile(Dir + SearchRec.Name);
            if (CurrentAreaFieldName<>'#ERROR#') then begin
               // сохранили путь к файлу
               FNames.Append(Dir + SearchRec.Name);
               // сохранили имя области и индекс имени файла (он равен количеству файлов в структуре) минус 1
               AreaNames.AddObject(CurrentAreaFieldName, Pointer(FNames.Count-1));
            end;
        end;
    until FindNext(SearchRec) <> 0;
  FindClose(SearchRec);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  TFileNames, TFAreasNames : TStringList;
  i, indexFileName : integer;
begin
  TFileNames := TStringList.Create;
  TFAreasNames := TStringList.Create;
  try
    DirSearch('C:\testLas\', '*.las', TFileNames, TFAreasNames);
    // сортировка по наименованию площади
    TFAreasNames.Sort;
    // вывод всех имен площадей и имён файлов в мемо1 (для отладки)
    for i := 0 to TFAreasNames.Count-1 do begin
      indexFileName := Integer(TFAreasNames.Objects[i]);
      Memo1.Lines.Append('Имя файла = '+ TFileNames.Strings[indexFileName]+
             ' Площадь: '+TFAreasNames.Strings[i]);
    end;
  finally
    FreeAndNil(TFAreasNames);
    FreeAndNil(TFileNames);
  end;
end;

end.
на форму кинуть Memo1 (туда будут выдавать результаты)
и кнопку Bitton1.
назначить код на кнопку Button1Click
исправить путь
DirSearch('C:\testLas\', '*.las', TFileNames, TFAreasNames);
на свой (где лежат LAS файлы)
запустить....

если всё получится дописать процедуру чтения из файла наименования площади GetAreaFieldNameFromFile
ну и код вывода чуть-чуть доработать, чтобы выдались только наименования площадей-дубликатов...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.08.2011, 20:12   #23
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,871
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
NetSpace, попрошу не обижаться, но мне выложенный Вами код не понравился!..

несмотря на то, что код, вроде бы, работоспособный, но реализация, имхо - жуткая..

Даже одно это в процедуре PrintFile чего стоит...
это мне было необходимо снимать атрибуты для махинаций с файлами, а то какие-то открываются и редактируются, а какие-то нет...
код жуткий, не спорю, но это одна из первых программ, созданная когда я ещё был зелёным и малоразбирающимся новичком
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 01.09.2011, 08:33   #24
zhukovms
Пользователь
 
Регистрация: 30.08.2011
Сообщений: 13
По умолчанию

Не подскажите что сделал не правильно. Файл открыл, сделал счетчик поиска по строкам, а строчку нужную не находит

Код:
function GetAreaFieldNameFromFile(FN : string) : string;
var
  Flas:TStrings;
  z:integer;
begin
   if FileExists(FN) then begin
         Flas:= TStringList.Create();
         Flas.LoadFromFile(FN);
         For z:=0 to Flas.count-1 do
           begin
             if Flas.Strings[z]='FLD.                  FIELD NAME: ' then
                application.MessageBox('Площадь найдена', MB_OKCANCEL);
                end;
    GetAreaFieldNameFromFile := 'Ананьевская';
     end
   else
     GetAreaFieldNameFromFile := '#ERROR#';

end;
Цитата:
Не подскажите что сделал не правильно
Не оформил код тегом #. Делаю замечание!

Последний раз редактировалось artemavd; 01.09.2011 в 11:32.
zhukovms вне форума Ответить с цитированием
Старый 01.09.2011, 15:29   #25
zhukovms
Пользователь
 
Регистрация: 30.08.2011
Сообщений: 13
Радость

С этим куском кода разобрался.
Не могу понять как из строки выдернуть нужную информацию
Мне надо из строчки:
FLD. FIELD NAME: Ананьевское
выдернуть слово Ананьевское
zhukovms вне форума Ответить с цитированием
Старый 01.09.2011, 16:19   #26
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,871
По умолчанию

используйте функцию COPY(), работающую со строками. там всё что хочешь можно выдернуть, если постараться
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 01.09.2011, 17:08   #27
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

что то типо этого... =))):
Код:
...
const
  ss ='FLD.FIELD NAME:';
...
var
...
  f: TextFile;
  s: String;
  i: integer;
...
  AssignFile(f,fn);
  reset(f);
  while not eof(f) do
  begin
    readln(f,s);
    i := pos(ss, s);
    if i>0 then
    begin
      i := i+length(ss);
      GetAreaFieldNameFromFile := copy(s,i+1,length(s)-i);
      break;
    end;
  end;
  CloseFile(f);
...
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 02.09.2011, 08:34   #28
zhukovms
Пользователь
 
Регистрация: 30.08.2011
Сообщений: 13
Радость

А как можно сравнить строки в разных файлах?
Допустим у меня 100 файлов и нужно найти файлы с одинаковой строкой
Номер строки известен - 16 строка.
Получается в цикле сравниваем все файлы построчно и выводим имена файлов в Memo с одинаковыми строками (16 строка).
zhukovms вне форума Ответить с цитированием
Старый 02.09.2011, 09:38   #29
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от zhukovms
Получается в цикле сравниваем все файлы построчно и выводим имена файлов в Memo с одинаковыми строками
zhukovms, Вы с алгоритмом, который заложен в мою программу ознакомились?!
Чем он Вас не устроил?!

Процедура DirSearch
заполняет нужными данными две структуры
TFileNames - имена файлов
TFAreasNames - наименования площадей (одновременно в этой структуре в поле Object содержится номер строки с именем файла)

в Memo выводится просто так - чтобы Вам было видно, что программа заполнения структур работает.

После заполнения данных выполняется сортировка по именам площадей.

после этого ЭЛЕМЕНТАРНО найти те наименования площадей (и соответствующие им имена файлов, разумеется), которые повторяются.

Честное слово. Ну хоть чуть-чуть попытайтесь подумать! Это же чрезвычайно просто! (буквально пять-шесть операторов)...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.09.2011, 09:44   #30
zhukovms
Пользователь
 
Регистрация: 30.08.2011
Сообщений: 13
По умолчанию

Serge_Bliznykov, я с алгоритмом ознакомился. Он меня устраивает.
Пытаюсь думать немного, но не все получается - вот и спрашиваю кое-какие моменты.
Я уже 6 лет не программировал - все забыл. Тем более работа с файлами у меня всегда плохо получалась.
Написать какую-нибудь базу даных с SQL-запросами это запросто, а вот с файлами беда у меня
zhukovms вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрый поиск в больших текстовых файлах RIO Общие вопросы Delphi 6 29.04.2011 15:46
Поиск и замена в текстовых файлах akm-gala Помощь студентам 1 18.06.2010 09:08
Сравнение данных в файлах Exel (Visual Studio 2008 C++) Nikiforov_Alex Помощь студентам 1 05.05.2010 10:52
Обработка информации, хранящейся в текстовых файлах (БД) Troi666 Помощь студентам 1 02.12.2008 21:54
Как посчитать сумму строк во всех текстовых файлах? qwestor PHP 8 30.12.2007 16:02