1 Star 0 Fork 0

wuye / slg-csv

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

slg_csv提供csv文件到ets表的导入功能,你可以简单的指定配置关系来完成导入.

启动slg_csv

启动slg_csv使用以下代码:

slg_csv:start()

关闭slg_csv使用以下代码:

slg_csv:stop()

启动之后没有加载配置文件,你需要自定义你的data文件映射关系.

映射

使用以下代码指定你的csv文件存放的路径.

slg_csv:root("data/") %% 指定为项目路径下的`data/`文件夹

?csv_record

首先定义以下宏,下面会使用该宏

-define(csv_record(Name), {Name, record_info(fields, Name)}).

简单映射

定义record为:

%% vip经验配置,默认为0级.
-record(gd_vip_exp, {
      level,                    %% vip升级等级
      exp                       %% 升级到level需要的经验.
     }).

其中对应的csv文件内容为:

INT_level;INT_exp
0;0
1;500
2;1000

配置条件为:

add(gd_vip_exp, ?csv_record(gd_vip_exp), ["vip_exp.csv"]),

可以查看项目目录src/slg_csv.erl的test函数.

映射的record的字段需要和csv表的第一行字典一一对应。csv文件可以有其它字段,映射时会忽略;csv文件如果字段与record不够,启动时会报错 tuple not valid

字段类型

record里面不需要指定字段的类型,因为erlang是无类型的,但是csv文件里的第一行需要字典各列的类型,来帮助映射.

类型名与字段名通过下划线分割,比如:INT_level;INT_exp

在csv文件中不字段不区分大小写,现在支持以下类型:

  • int:数字,也是默认类型,也就是不制定类型则为int
  • str:字符串
  • term:erlang Term.

ets属性指定

默认ets属性为[public, set, named_table, {keypos, 2}], 你也可以自己制定类型属性,比如.

%% 指定`gd_vip_exp`为bag类型
add({gd_vip_exp, [bag]}, ?csv_record(gd_vip_exp), ["vip_exp.csv"]),

也就是每个ets表可以通过 atom | {atm, [attr|attr]} 指定。

多ets表指定

可以在add的第一个参数指定一个列表,已达到创建多个ets表的目的,但只有第一个ets表为csv文件的导入表,其余的用户自定义为辅助表或结果表.

add([gd_vip_exp, defined_but_not_use] , ?csv_record(gd_vip_exp), ["vip_exp.csv"]),

多csv文件

定义多csv文件将把多个csv文件导入一个相同的ets表:

add(gd_vip_exp, ?csv_record(gd_vip_exp), ["vip_exp.csv", "vip_exp2.csv"]),

注意重复的id会给出错误提示,你可以选择忽略。

inject函数.

大部分时候csv表到ets是可以直接映射过去,但是不有的时候也需要手工处理一下再导入到ets,这时候可以使用inject函数.

inject函数是一个普通函数,它接受一个record为参数,返回另一个处理之后的record,只有slg_csv会把这个record导入到ets.

比如,你可以把你的inject函数定义到一个单独的erlang模块:

-module(csv_inject).
-export([compile_all]).

inject_vip_exp(Vip) ->
    io:format("vip ~p~n", [Vip]).

然后通过以下参数指定:

add(gd_vip_exp, ?csv_record(gd_vip_exp), [ {fun csv_inject/inject_vip_exp/1, "vip_exp.csv"}]),

inject函数还可以定义一个参数,但是函数原型为:

inject_vip_exp(Vip, P) ->
    io:format("vip ~p ~p~n", [Vip, P]),
    Vip.

add(gd_vip_exp, ?csv_record(gd_vip_exp), [ {fun csv_inject/inject_vip_exp/2, "vip_exp.csv", 23}]),

可以slg_csv下代码:csv_inject2.erl

加载

slg_csv:load()  %% 加载csv配置到ets.

总结

整个使用流程为:

start(),
root("data/"),
add(gd_vip_exp, ?csv_record(gd_vip_exp), ["vip_exp.csv"]),
load(),
ok.

空文件

简介

暂无描述 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/wesleywoo/slg-csv.git
git@gitee.com:wesleywoo/slg-csv.git
wesleywoo
slg-csv
slg-csv
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891