Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Функциональные языки: общие вопросы > [Erlang] DETS-таблица |
Автор: neon3 7.10.2015, 17:29 |
Добрый день. Извините, если вопрос уж совсем не корректный. Только начал знакомиться с Erlang. Так что... ============================ Проблема-вопрос: Из текстового файла (utf-8) в DETS-таблицу "залит" список слов. 1. Содержание текстового файла: абажур абак абака аббат аббатство аберрация и т.д. 2. DETS-таблица создана следующим образом: dets:open_file(myfile, [{type, bag}, {repair, true}, {file , FileName}]). 3. Список слов из текст. файла сначала прочитан в список (List2). А затем, List2 залит в DETS-таблицу: lists:foreach(fun(X) -> dets:insert(myfile, {X}) end, List2), Все, вроде бы, хорошо, lookup по таблице срабатывает корректно (S - входное слово): ... Ldets1 = dets:lookup(myfile,S), Но теперь остановился на том, что не понимаю, как с этой таблицей производить операции: - перебор всей таблицы (first/next) - отбор (select ???) Подскажите, pls. Вроде бы просматривается вариант выгрузки таблицы в список через ets (и там уже манипулировать даннвми), но это уж совсем шаманство... Хотелось бы "правильно" С уважением, neon3 ================= P.S. Да. В список читается быстро: list_words_lib_get(YesSort) -> Fn_db = filename_balda_lib_words_get(), dets:open_file(myfile, [{type, bag}, {repair, true}, {file , Fn_db}]), ets:new(libdb, [named_table, set]), dets:to_ets(myfile, libdb), dets:close(myfile), L = ets:tab2list(libdb), ets:delete(libdb), L1 = lists:map(fun(X) -> tuple_to_list(X) end, L), case YesSort of false -> L1; true -> lists:sort(L1) end. И фильтрация по списку тоже вроде понятна: list_words_selection_for_char1(Ch, L) -> lists:filter(fun(X) -> case lists:nth(1,(lists:nth(1,X))) of Ch -> true; _Other -> false end end, L). Но все-таки, как можно выполнить фильтрацию по DETS-таблице ? |
Автор: tzirechnoy 8.10.2015, 14:45 | ||||
first/next. ВНЕЗАПНО. Ну, есть ещё foldl/foldr/match(my_file, '$1') -- всё это тожэ можно использовать.
match |
Автор: neon3 8.10.2015, 16:07 |
> to tzirechnoy Спасибо, конечно. Я с документацией ознакомился: http://www.erlang.org/doc/man/dets.html И понимаю, что это принципиально возможно. Но все-таки не понял, как именно это использовать. Если возможно, то приведите конкретный пример (в контексте моего случая), pls. Могу куда-ниб в личку файлик с DETS-таблице кинуть... |
Автор: tzirechnoy 8.10.2015, 18:53 | ||
А, то есть просто про erlang ничего не знаете. Вообще, тогда я бы советовал взять какой туториал и прорешать. Там времени один-два вечера займёт, зато потом очевидные для любителей старого функцыонального стиля концэпцыи вроде first/next, foldl и пр. для Вас тожэ станут очевидными. Но можно и пример:
Компилировать erlc dets_test.erl, запускать erl -pa . -s dets_test |
Автор: neon3 9.10.2015, 15:54 |
Большое спасибо. Буду пробовать. |