Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Erlang] DETS-таблица, Проблема с использованием DETS-таблицы 
:(
    Опции темы
neon3
Дата 7.10.2015, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.10.2015

Репутация: нет
Всего: нет



Добрый день.

Извините, если вопрос уж совсем не корректный.
Только начал знакомиться с 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-таблице ?


Это сообщение отредактировал(а) neon3 - 7.10.2015, 18:27
PM MAIL   Вверх
tzirechnoy
Дата 8.10.2015, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



Цитата
- перебор всей таблицы (first/next)


first/next. ВНЕЗАПНО.
Ну, есть ещё foldl/foldr/match(my_file, '$1') -- всё это тожэ можно использовать.

Цитата
 - отбор (select ???)


match
PM MAIL   Вверх
neon3
Дата 8.10.2015, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.10.2015

Репутация: нет
Всего: нет



> to tzirechnoy  
Спасибо, конечно.
Я с документацией ознакомился: http://www.erlang.org/doc/man/dets.html
И понимаю, что это принципиально возможно.
Но все-таки не понял, как именно это использовать.
Если возможно, то приведите конкретный  пример (в контексте моего случая), pls.
Могу куда-ниб в личку файлик с DETS-таблице кинуть...


Это сообщение отредактировал(а) neon3 - 8.10.2015, 16:07
PM MAIL   Вверх
tzirechnoy
Дата 8.10.2015, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



А, то есть просто про erlang ничего не знаете. Вообще, тогда я бы советовал взять какой туториал и прорешать. Там времени один-два вечера займёт, зато потом очевидные для любителей старого функцыонального стиля концэпцыи вроде first/next, foldl и пр. для Вас тожэ станут очевидными.

Но можно и пример:
Цитата
-module(dets_test).

-export([start/0]).

-import(dets, []).
-import(lib, []).
-import(io, []).
-import(file, [] ).


start() ->
        open(myfile),
        fill(myfile, "test.txt"),
        walk(myfile),
        dets:close(myfile).

open(TBL) ->
        case dets:open_file(TBL, [{type, bag},
                                  {repair, true},
                                  {file, "test.dets"}] ) of
          {ok, TBL} -> {ok, TBL};
          {error, Reason} -> lib:error_message("Dets returned error: ~p", [Reason]),
                                {error, Reason};
          Else -> lib:error_message("Dets unknown result when opening ~s: ~p",
                                        ["test.dets", Else]),
                        {error, Else}
        end.

fill(TBL, Textfile) ->
        case file:open(Textfile, [read]) of
                {ok, FHandle} -> fill_loop(TBL, FHandle), file:close(FHandle);
                {error, Reason} -> lib:error_message("File ~s open error: ~p",
                                        [Textfile, Reason]),
                        {error, Reason};
                Else -> lib:error_message("File ~s unknown open result: ~p",
                                [Textfile, Else]),
                        {error, "Unknown result"}
        end.

fill_loop(TBL, FHandle) ->
        case file:read_line(FHandle) of
                {ok, String} -> case dets:insert(TBL, {String}) of
                                ok -> fill_loop(TBL, FHandle);
                                Else -> lib:error_message("Dets insertion error ~p",
                                                [Else]),
                                        fill_loop(TBL, FHandle)
                                end;
                eof -> ok;
                {error, Reason} -> lib:error_message("File read error ~p", [Reason]),
                        {error, Reason}
        end.

walk(TBL) ->
        case dets:first(TBL) of
                '$end_of_table' -> ok;
                Key -> io:format("First key is ~p~n", [Key]),
                        walk_loop(TBL, Key)
        end.
walk_loop(TBL, PrevKey) ->
        case dets:next(TBL, PrevKey) of
                '$end_of_table' -> ok;
                Key -> io:format("Next key is ~p~n", [Key]),
                        walk_loop(TBL, Key)
        end.


Компилировать erlc dets_test.erl, запускать erl -pa . -s dets_test
PM MAIL   Вверх
neon3
Дата 9.10.2015, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.10.2015

Репутация: нет
Всего: нет



Большое спасибо.
Буду пробовать.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума «Функциональные языки: общие вопросы»
Void
  • Пожалуйста, создавайте темы с содержательными названиями. Если у Вас вопрос по конкретному языку, укажите его в заголовке, например: «[Haskell] Как использовать монаду State».
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Функциональные языки: общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1057 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.