ERLANG学习 Day15

本文介绍了如何在Erlang中使用ets和dets模块进行数据操作,包括创建、插入、读取以及在两者间转换数据。
摘要由CSDN通过智能技术生成

实现ets表数据放入dets,dets数据load进ets。

实现代码如下:

-module(ets_dets).
-author("chen").

%% API
-export([start/0, stop/0, new_dets/1, new_ets/1, write_ets/2, read_dets/2, read_ets/1, to_dets/2, to_ets/2]).

start() ->
  register(server, spawn(fun() -> loop([]) end)),
  io:format("server name is:~p~n", [server]).

stop() ->
  server ! stop.
write_ets(TableName, {K, V}) ->
  server ! {write, TableName, {K, V}}.
new_dets(TableName) ->
  server ! {new_dets, TableName}.
new_ets(TableName) ->
  server ! {new_ets, TableName}.
read_ets(TableName) ->
  server ! {read_ets, TableName}.
read_dets(TableName, K) ->
  server ! {read_dets, TableName, K}.
to_dets(Ets, Dets) ->
  server ! {to_dets, Ets, Dets}.
to_ets(Dets, Ets) ->
  server ! {to_ets, Dets, Ets}.
loop(List) ->
  receive
    {new_ets, TableName} ->
      E = ets:new(TableName, [named_table]),
      loop([E | List]);
    {new_dets, TableName} ->
      {_, E} = dets:open_file(TableName, []),
      loop([E | List]);

    {write, TableName, {K, V}} ->
      Reply = ets:insert(TableName, {K, V}),
      io:format("~p~n", [Reply]),
      loop(List);
    {read_ets, TableName} ->
      Reply=ets:tab2list(TableName),
      io:format("~p~n", [Reply]),
      loop(List);
    {read_dets, TableName, Key} ->
      case dets:lookup(TableName, Key) of
        [{K, V}] when K == Key ->
          io:format("the value is~p~n", [V]),
          loop(List);
        [] ->
          io:format("Not found~n", []),
          loop(List);
        Error ->
          io:format("Error: ~p~n", [Error]),
          loop(List)
      end;
    {to_dets, Ets, Dets}->
      ets:to_dets(Ets, Dets),
      loop(List);
    {to_ets, Dets, Ets}->
      dets:to_ets(Dets, Ets),
      loop(List);
      stop ->
      ok
  end.
创建并注册进程
start() ->
  register(server, spawn(fun() -> loop([]) end))。

停止
stop() ->
  server ! stop.

创建dets
new_dets(TableName) ->
  server ! {new_dets, TableName}.

创建ets
new_ets(TableName) ->
  server ! {new_ets, TableName}.

向ets插入数据
write_ets(TableName, {K, V}) -> server ! {write, TableName, {K, V}}.

读取ets
read_ets(TableName) ->
  server ! {read_ets, TableName}.
读取dets
read_dets(TableName, K) ->
  server ! {read_dets, TableName, K}.
将ets放入dets
to_dets(Ets, Dets) ->
  server ! {to_dets, Ets, Dets}.

将dets加载进ets
to_ets(Dets, Ets) ->
  server ! {to_ets, Dets, Ets}.

运行结果:

1.首先启动进程

2.成功创建一个名为ets1的Ets。

3.向ets1中插入{a,"hello"}数据。

4.创建一个名为dets1的Dets。

5.读取显示ets1和dets1中的数据,此时,ets1中含有刚才插入的数据,dets1中没有。

 6.执行to_dets方法,会把一个已打开的 ETS 表 Tab 里的对象数据插入到一个已创建或已打开的Dets。表 Dets 里的数据在对象数据插入前会被清空。

此时查看dets1的数据,发现有以上在ets1中插入的数据。

成功将ets中的数据放入dets。

7.创建并查看名为ets2的Ets,此时其中为空列表

8.这时将dets1中的数据通过to_ets方法加载到ets2中,

再次查看发现ets2中已拥有数据。

成功将dets中的数据导入到ets中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值