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
Немного не то - нужны были файлы с определенным словом в имени файла, а не внутри самого файла. Подумал что с таким перебором да еще и с парсингом файлов завесит хаб часа на два Сделал на дельфе, всем спасибо!
А чем отличается http://mydc.ru/r/?http://luaforge.net/frs/?group_id=66 библиотека lfs от http://mydc.ru/topic1970.html ?
Автор: Saymon 24.12.2010, 14:27
ну раз сделал хорошо, но может стоит выложить решение? Авось и другим людям будет полезно
Автор: Nickolya 24.12.2010, 18:55
dimajak, сорри, ошибся немного) хотя для поиска в имени файла надо изменить было всего чуть и удалить ненужное... Теперь знай, какое ТЗ, такое и решение А либсы отличаются тем, что выложенная для птоки собрана для нее же и работает только под ней, а с луафорджа работатет под обычным не измененным луа (в птоке луа изменен).
Автор: 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 скрипта. Если кому-нить нужно - выложу.