ich eine Mnesia Tisch bekommen haben, die aus folgendem Format besteht:Erlang: Schreiben Mnesia Tabelle einen Datensatz pro Zeile .csv
-record(state, {key, tuple, state, timestamp, fin_from}).
Die Einträge wie folgt aussehen (lesen mit ets:tab2list(Tab)
):
[{state,{80,43252,tcp,tcp_syn_received,{192,168,101,5},{192,168,101,89}},
{80,43252,tcp,{192,168,101,5},{192,168,101,89}},
tcp_syn_received,1463850419221,undefined},
{state,{80,41570,tcp,tcp_syn_received,{192,168,101,5},{192,168,101,89}},
{80,41570,tcp,{192,168,101,5},{192,168,101,89}},
tcp_syn_received,1463850403214,undefined},
...]
ich mag diese Daten in eine CSV-Datei pro Zeile mit einem Eintrag schreiben - mit folgendem Format bevorzugt:
state,80,43252,tcp,tcp_syn_received,192.168.101.5,192.168.101.89,80,43252,tcp,192.168.101.5,192.168.101.89,tcp_syn_received,1463850419221,undefined
state,80,41570,tcp,tcp_syn_received,192.168.101.5,192.168.101.89,80,41570,tcp,192.168.101.5,192.168.101.89,tcp_syn_received,1463850419221,undefined
Nach undefined
sollte ein Zeilenumbruch erfolgen. Ich habe versucht, den folgenden Code verwenden (während Content = ets:tab2list(states)
):
do_logging_async(File, Format, Content, Append)->
F = fun() ->
file:write_file(File, io_lib:fwrite(Format, [Content]), [Append])
end,
spawn(F).
Allerdings habe ich nichts Vergleichbares zu meiner Ausgabe bekommen. Die Daten sollten danach mit R.
UPDATE bewertet werden: Der Schlüssel war die Tabelle Zeile für Zeile zu lesen und es mit ~w
zu analysieren, aber nicht ~p
. I mit der folgenden Lösung endete (die eine etwas andere Ausgabe erzeugt, jedoch ist es weniger redundante Daten):
do_state_logging(File, EtsAsList) ->
% write header (columnnames)
file:write_file(File, io_lib:fwrite("~w,~w,~w,~w,~w,~w,~w,~w~n", [record,dstPort,srcPort,proto,dstIP,srcIP,state,timestamp]),[append]),
case EtsAsList of
[] ->
ok;
_ ->
F = fun({Record,_Key,
[P1, P2, Proto, {D_Ip_1,D_Ip_2,D_Ip_3,D_Ip_4}, {S_Ip_1,S_Ip_2,S_Ip_3,S_Ip_4}],
State, Timestamp, _}) ->
file:write_file(File, io_lib:fwrite("~w,", [Record]),[append]),
file:write_file(File, io_lib:fwrite("~w,~w,~w,", [P1,P2,Proto]),[append]),
file:write_file(File, io_lib:fwrite("~w.~w.~w.~w,", [D_Ip_1,D_Ip_2,D_Ip_3,D_Ip_4]), [append]),
file:write_file(File, io_lib:fwrite("~w.~w.~w.~w,", [S_Ip_1,S_Ip_2,S_Ip_3,S_Ip_4]), [append]),
file:write_file(File, io_lib:fwrite("~w,", [State]),[append]),
file:write_file(File, io_lib:fwrite("~w", [Timestamp]),[append]),
file:write_file(File, ["\n"],[append])
end,
lists:foreach(F, EtsAsList)
end,
io:format("Finished logging of statetable to file: ~p~n" , [File]).
Dank der Antwort, die mich auf diese Idee gestoßen.
Ist es möglich, dass Sie Ihre Ets-Werte als Listen und nicht als Tupel speichern? dh [80,43252, tcp, tcp_syn_received, [192,168,101,5], [192,168,101,89]], [80,43252, tcp, [192,168,101,5], [192,168,101,89]], tcp_syn_received, 1463850419221, undefiniert] '. Weil es dann einfacher ist, jeden abgeflachten Datensatz als eine Zeile flach zu schreiben und zu schreiben. –
Ja, ich könnte das tun. Aber wie parse ich die einzelnen Zeilen (und Listen) danach? – muehsi