Solution 10-1
Here is a suggested solution for Étude 10-1.
phone_records.hrl
-
record
(
phone_call
,
{
phone_number
,
start_date
,
start_time
,
end_date
,
end_time
}).
phone_ets.erl
%% @author J D Eisenberg <jdavid.eisenberg@gmail.com>
%% @doc Read in a database of phone calls
%% @copyright 2013 J D Eisenberg
%% @version 0.1
-
module
(
phone_ets
).
-
export
([
setup
/
1
,
summary
/
0
,
summary
/
1
]).
-
include
(
"phone_records.hrl"
).
%% @doc Create an ets table of phone calls from the given file name.
-
spec
(
setup
(
string
())
->
atom
()).
setup
(
FileName
)
->
%% If the table exists, delete it
case
ets
:
info
(
call_table
)
of
undefined
->
false
;
_
->
ets
:
delete
(
call_table
)
end
,
%% and create it anew
ets
:
new
(
call_table
,
[
named_table
,
bag
,
{
keypos
,
#phone_call.phone_number
}]),
{
ResultCode
,
InputFile
}
=
file
:
open
(
FileName
,
[
read
]),
case
ResultCode
of
ok
->
read_item
(
InputFile
);
_
->
io
:
format
(
"Error opening file:
~p~n
"
,
[
InputFile
])
end
.
%% Read a line from the input file, and insert its contents into
%% the call_table. This function is called recursively until end of file
-
spec
(
read_item
(
file
:
io_device
())
->
atom
()).
read_item
(
InputFile
)
->
RawData
=
io
:
get_line
(
InputFile
,
""
),
if
is_list
(
RawData
)
->
Data
=
string
:
strip
(
RawData
,
right
,
$\n
),
[
Number
,
SDate
,
STime
,
EDate
,
ETime
]
=
re
:
split
(
Data
,
","
,
[{
return
,
list
}]),
ets
:
insert
(
call_table
,
#phone_call
{
phone_number
=
Number
,
start_date
=
to_date
(
SDate
),
start_time
=
to_time
(
STime
),
end_date
=
to_date
(
EDate
),
end_time
=
to_time
(
ETime
)}),
read_item
(
InputFile
);
RawData
==
eof ...
Get Études for Erlang now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.