myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
 
Ответить в данную темуНачать новую тему

> Перебор файлов в каталоге

Теги
Нет тегов для показа
dimajak
сообщение 21.12.2010, 22:11
Сообщение #1


Продвинутый участник
****

Группа: Пользователи
Сообщений: 157
Регистрация: 19.1.2010
Из: Волгоград
Пользователь №: 5 756
Спасибо сказали: 77 раз




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

Возможно ли такое?
Если возможно, то напишите пример скрипта.
Go to the top of the page
+Quote Post
Invisible
сообщение 21.12.2010, 22:32
Сообщение #2


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 248
Регистрация: 14.7.2008
Из: Хабаровск
Пользователь №: 193
Спасибо сказали: 40 раз




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

Код
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. Спасибо за тему. Сам нуждаюсь полного ответа по этой теме.
Go to the top of the page
+Quote Post
Setuper
сообщение 21.12.2010, 22:45
Сообщение #3


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




lfs в помощь
Go to the top of the page
+Quote Post
Nickolya
сообщение 22.12.2010, 1:23
Сообщение #4


Главный ра******й тут...
*********

Группа: Главные администраторы
Сообщений: 1 727
Регистрация: 18.5.2008
Из: RF, 2la
Пользователь №: 1
Спасибо сказали: 776 раз




Допустим как-то вот так:
Код
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/")


Лишь немного переделал функцию из примеров.


Спасибо сказали:
Go to the top of the page
+Quote Post
dimajak
сообщение 24.12.2010, 14:24
Сообщение #5


Продвинутый участник
****

Группа: Пользователи
Сообщений: 157
Регистрация: 19.1.2010
Из: Волгоград
Пользователь №: 5 756
Спасибо сказали: 77 раз




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

А чем отличается эта библиотека lfs от этой ?
Go to the top of the page
+Quote Post
Saymon21
сообщение 24.12.2010, 14:27
Сообщение #6


Site Reliability Engineer
*********

Группа: Модераторы
Сообщений: 1 772
Регистрация: 27.6.2009
Из: Чувашия, г. Чебоксары
Пользователь №: 3 719
Спасибо сказали: 479 раз




ну раз сделал хорошо, но может стоит выложить решение? big_smile.gif
Авось и другим людям будет полезноbig_smile.gif
Go to the top of the page
+Quote Post
Nickolya
сообщение 24.12.2010, 18:55
Сообщение #7


Главный ра******й тут...
*********

Группа: Главные администраторы
Сообщений: 1 727
Регистрация: 18.5.2008
Из: RF, 2la
Пользователь №: 1
Спасибо сказали: 776 раз




dimajak, сорри, ошибся немного) хотя для поиска в имени файла надо изменить было всего чуть и удалить ненужное... Теперь знай, какое ТЗ, такое и решение big_smile.gif А либсы отличаются тем, что выложенная для птоки собрана для нее же и работает только под ней, а с луафорджа работатет под обычным не измененным луа (в птоке луа изменен).
Go to the top of the page
+Quote Post
Setuper
сообщение 25.12.2010, 11:21
Сообщение #8


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




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


Спасибо сказали:
Go to the top of the page
+Quote Post
dimajak
сообщение 28.12.2010, 1:00
Сообщение #9


Продвинутый участник
****

Группа: Пользователи
Сообщений: 157
Регистрация: 19.1.2010
Из: Волгоград
Пользователь №: 5 756
Спасибо сказали: 77 раз




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 файла в одной директории и попутно два файла с айпи в другой) в формат этого скрипта. Если кому-нить нужно - выложу.
Go to the top of the page
+Quote Post

Ответить в данную темуНачать новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts Со стороны хаба возможно ли отследить скачку файлов у юзера?
У юзера скачивают файл, хаб об этом знает?
4 dimajak 9 434 26.10.2011, 13:03 Посл. сообщение: DEN 007
Closed Загрузка файлов
Загрузка файлов хабом
1 Asp 5 666 13.12.2009, 16:11 Посл. сообщение: Wariner
Closed Скрипт обновления списка файлов
1 li4nost 6 387 5.6.2009, 20:33 Посл. сообщение: ustas
No New Posts Топ Самых Часто Скачиваемых Файлов
API 2
10 NikseR 18 708 23.11.2008, 16:54 Посл. сообщение: Setuper

 



RSS Сейчас: 23.11.2024, 7:54