Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Разработчикам [PtokaX] _ Перебор файлов в каталоге

Автор: dimajak 21.12.2010, 22:11

Имеем каталог, в котором лежат около 50 тысяч текстовых файлов.
Требуется вытащить инфу из этих файлов, причем не из всех, а имеющих в имени определенное слово.

Возможно ли такое?
Если возможно, то напишите пример скрипта.

Автор: Invisible 21.12.2010, 22:32

такс. Могу помочь только с вытаскиванием слова из файла.

Код
file = Core.GetPtokaXPath().."scripts/mytxtfile.txt" -- путь к файлу, с имеющей в ней информацией
slovo = 'тест' -- слово чтобы найти
    local sFile = io.open(file, "r" )                     -- Открываем файл
    local s = sFile:read("*a"):match(slovo)       -- Читаем и находим слово
    Core.SendToAll(s)                           -- Отправляем в общий чат
    sFile:close()                                              --Закрываем файл


остальное, жди ответа от Медалистов =)

PS. Спасибо за тему. Сам нуждаюсь полного ответа по этой теме.

Автор: Setuper 21.12.2010, 22:45

lfs в помощь

Автор: Nickolya 22.12.2010, 1:23

Допустим как-то вот так:

Код
sWeNeedDataInFiles = "some data here"
tData = {}

require"lfs"

function attrdir (path)
    for file in lfs.dir(path) do
        if file ~= "." and file ~= ".." then
            local f = path..'/'..file
            -- print ("\t "..f)
            local attr = lfs.attributes (f)
            assert (type(attr) == "table")
            if attr.mode == "directory" then
                attrdir (f)
            else
                local h = io.open(f, 'r+')
                if h then
                    local sData = h:read('*a')
                    if sData:find(sWeNeedDataInFiles, 1, true) then
                        tData[f] = sData
                    end
                    h:close()
                end
            end
        end
    end
end

attrdir ("./somepath/")


Лишь немного переделал http://mydc.ru/r/?http://keplerproject.github.com/luafilesystem/examples.html.

Автор: dimajak 24.12.2010, 14:24

Немного не то - нужны были файлы с определенным словом в имени файла, а не внутри самого файла.
Подумал что с таким перебором да еще и с парсингом файлов завесит хаб часа на два big_smile.gif
Сделал на дельфе, всем спасибо!

А чем отличается http://mydc.ru/r/?http://luaforge.net/frs/?group_id=66 библиотека lfs от http://mydc.ru/topic1970.html ?

Автор: Saymon 24.12.2010, 14:27

ну раз сделал хорошо, но может стоит выложить решение? big_smile.gif
Авось и другим людям будет полезноbig_smile.gif

Автор: Nickolya 24.12.2010, 18:55

dimajak, сорри, ошибся немного) хотя для поиска в имени файла надо изменить было всего чуть и удалить ненужное... Теперь знай, какое ТЗ, такое и решение big_smile.gif А либсы отличаются тем, что выложенная для птоки собрана для нее же и работает только под ней, а с луафорджа работатет под обычным не измененным луа (в птоке луа изменен).

Автор: Setuper 25.12.2010, 11:21

Ну тут скорее не в изменённости lua дело.
1. Lua интерпретатор птохи находится в файле pxlua.dll, соответственно, библиотека lfs должна быть статически прилинкована к pxlua.dll.
Библиотеки, взятые с luaforge, линкуются к lua51.dll. Поэтому первый фактор - это разные имена либ с интерпретаторами lua.
2. Птоха собрана компиляором borland, а либы с luaforge компилятором vs (visual studio).
Либы borland не совместимы с либами vs, ибо либы borland имеют формат omf, а либы vs формат coff.

Автор: dimajak 28.12.2010, 1:00

Saymon, на Дельфи7 сваял.
Не думаю, что интересно решение, ведь у каждого своя задача.
А для реализации на D7 парсить файл таблицы совсем просто:
а) первой строчкой ищем наименование своей таблицы
б) потом ищем строку: символ табуляции + [" потом идет параметр + "] = значение
и т.д.
Пример для таблицы с никами юзеров:

Код
function TForm1.FindNick(nick: String; var nick_start, nick_end: Integer): Boolean;
var
  i: Integer;
  S: String;
begin
  Result := false;
  for i := 0 to tblMemo.Lines.Count - 1 do
  begin
    S := tblMemo.Lines[i];
    if Pos(#9+'["'+nick+'"] = {', S) > 0 then
    begin
      nick_start := i;
      break;
    end;
  end;
  if nick_start > 0 then
    for i := nick_start to tblMemo.Lines.Count - 1 do
    begin
      S := tblMemo.Lines[i];
      if Pos(#9+'}', S) > 0 then
      begin
        nick_end := i;
        Result := true;
        break;
      end;
  end;
end;
вызов функции:
Код
        nick_start := 0; nick_end := 0;
        if FindNick(nick, nick_start, nick_end) then
        begin
...
        end
        else
        begin
          tblMemo.Lines.Insert(tblMemo.Lines.Count-1, #9+'["'+nick+'"] = {');
          tblMemo.Lines.Insert(tblMemo.Lines.Count-1, #9#9+'["Nick"] = "'+nick+'"');
          tblMemo.Lines.Insert(tblMemo.Lines.Count-1, #9+'}');
        end;
после вызова ф-ции FindNick в nick_start и nick_end имеем номера строк начала и конца блока юзера, если юзер не найден, то в конце файла создаем блок для него. При нахождении юзера передавал nick_start и nick_end в другую функцию для поиска других значений. Я использовал TMemo, в него загружал файл таблицы и по окончании сохранял в файл.
Писал для переброски данных о юзерах из файлов созданных древним скриптом UserInfo под API1 (который для каждого юзера создавал 2 файла в одной директории и попутно два файла с айпи в другой) в формат http://mydc.ru/topic205.html?view=findpost&p=35069 скрипта. Если кому-нить нужно - выложу.