2013-03-11 2 views
-2

У меня есть пользователь таблицыэкспорт данных из Mnesia отличиться

-record(person, {id, firstname, lastname}). 

эта таблица содержит эти значения:

1 francoi  mocci  
    2 test  tes 

моя цель состоит в том, как я могу экспортировать эти данные из Mnesia отличиться

Я знаю обратный путь, означающий передачу данных от excel до mnesia

решение в этом случае е общаться с первенствует в csv.file затем использовать этот вид кода для разбора файла CSV:

%%% --- csv parser in Erlang. ------ 
%%% To help process large csv files without loading them into 
%%% memory. Similar to the xml parsing technique of SAX 

-module(csv). 
-compile(export_all). 

parse(FilePath,ForEachLine,Opaque)-> 
    case file:open(FilePath,[read]) of 
     {_,S} -> 
      start_parsing(S,ForEachLine,Opaque); 
     Error -> Error 
    end. 

start_parsing(S,ForEachLine,Opaque)-> 
    Line = io:get_line(S,''), 
    case Line of 
     eof -> {ok,Opaque}; 
     "\n" -> start_parsing(S,ForEachLine,Opaque); 
     "\r\n" -> start_parsing(S,ForEachLine,Opaque); 
     _ -> 
      NewOpaque = ForEachLine(scanner(clean(clean(Line,10),13)),Opaque), 
      start_parsing(S,ForEachLine,NewOpaque) 
    end. 

scan(InitString,Char,[Head|Buffer]) when Head == Char -> 
    {lists:reverse(InitString),Buffer}; 
scan(InitString,Char,[Head|Buffer]) when Head =/= Char -> 
    scan([Head|InitString],Char,Buffer); 
scan(X,_,Buffer) when Buffer == [] -> {done,lists:reverse(X)}. 
scanner(Text)-> lists:reverse(traverse_text(Text,[])). 

%%traverse_text(Text,Buff)-> 
    %% case scan("",$,,Text) of 
    %% {done,SomeText}-> [SomeText|Buff]; 
%%  {Value,Rem}-> traverse_text(Rem,[Value|Buff]) 
    %% end. 


traverse_text(Text,Buff)-> 
    case scan("",$;,Text) of 
     {done,SomeText}-> [SomeText|Buff]; 
     {Value,Rem}-> traverse_text(Rem,[Value|Buff]) 
    end. 


clean(Text,Char)-> 
    string:strip(string:strip(Text,right,Char),left,Char). 

и это пример функции для вставки данных из CSV-файла в Mnesia:

test()-> 

    ForEachLine = fun(Line,Buffer)-> 
    [Id, Firstname, Lastname] = Line, 

            %% here insert each line to the table mnesia 

            Buffer end, 


InitialBuffer = [], 




csv:parse("/home/test/Desktop/testt.csv",ForEachLine,InitialBuffer). 

и этот пример не имел никаких проблем

я стараюсь с этим кодом:

test()-> 
    F = fun(T) -> mensia:foldl(fun(X,Acc) -> [X|Acc] end, [],T), 
{atomic,L} = mnesia:transaction(F), 
file:write_file("filename.txt",[io_lib:format("~p\t~p\t~p~n",[F1,F2,F3]) || 
       #person{id = F1,firstname = F2,lastname = F3} <- L]). 

но я-я ошибка:

syntax error before : '.' 

эта ошибка связана с этой линии:

#person{id = F1,firstname = F2,lastname = F3} <- L]). 

Я пытаюсь исправить мой код:

test()-> 
    F = fun(T) -> mensia:foldl(fun(X,Acc) -> [X|Acc] end, [],T), 
{atomic,L} = mnesia:transaction(F), 
file:write_file("filename.txt",[io_lib:format("~p\t~p\t~p~n",[F1,F2,F3]) || 
       #person{id = F1,firstname = F2,lastname = F3} <- L])end. 

, но у меня сейчас эта ошибка:

variable 'F' is unbound 

эта ошибка связана с этой линии:

{atomic,L} = mnesia:transaction(F), 

Я решил эту проблему с:

test()-> 
     F = fun(T) -> mensia:foldl(fun(X,Acc) -> [X|Acc] end, [],T)end, 
{atomic,L} = mnesia:transaction(F), 
file:write_file("filename.txt",[io_lib:format("~p\t~p\t~p~n",[F1,F2,F3]) || 
       #person{id = F1,firstname = F2,lastname = F3} <- L]). 

но когда я запускаю свою функцию У меня есть эта ошибка:

** exception error: no match of right hand side value {aborted,{{badarity,{#Fun<model.20.69991685>,[]}}, 
                   [{mnesia_tm,apply_fun,3}, 
                   {mnesia_tm,execute_transaction,5}, 
                   {model,test,0}, 
                   {erl_eval,do_apply,5}, 
                   {shell,exprs,6}, 
                   {shell,eval_exprs,6}, 
                   {shell,eval_loop,3}]}} 
    in function model:test/0 

Я пробуюм с этим кодом:

test()-> 
     F = fun() -> mensia:foldl(fun(X,Acc) -> [X|Acc] end, [],person)end, 
{atomic,L} = mnesia:transaction(F), 
file:write_file("filename.txt",[io_lib:format("~p\t~p\t~p~n",[F1,F2,F3]) || 
       #person{id = F1,firstname = F2,lastname = F3} <- L]). 

, но у меня есть эта ошибка:

** exception error: no match of right hand side value {aborted,{undef,[{mensia,foldl, 
                       [#Fun<model.21.662230>,[],person]}, 
                     {mnesia_tm,apply_fun,3}, 
                     {mnesia_tm,execute_transaction,5}, 
                     {model,test,0}, 
                     {erl_eval,do_apply,5}, 
                     {shell,exprs,6}, 
                     {shell,eval_exprs,6}, 
                     {shell,eval_loop,3}]}} 
    in function model:test/0 
+0

честно, я знаю обратный путь смысла передавать данные из Excel в Mnesia, но я Жду» t найти решение для передачи данных от mnesia до excel –

+0

, если невозможно экспортировать данные от mnesia до excel, я хочу знать, можно ли экспортировать данные из mnesia в sql, если это возможно после данных экспорта из mnesia в sql, я могу экспортировать данные из sql в excel –

+1

ЕСЛИ вы можете экспортировать его в текстовый файл, вы может использовать [XML Excel Standards] (http://en.wikipedia.org/wiki/Microsoft_Office_2003_XML_formats) для создания листа Excel. –

ответ

1

Вы можете использовать функцию foldl, чтобы создать список, а затем записать этот список в файл, используя любой символ в качестве разделителя (пробел, запятая, табл. .. в зависимости от содержимого ваших записей) и в последний раз прочитали текстовый файл с Excel, у вас появится всплывающее меню, которое поможет вам контролировать способ интерпретации данных Excel. Я думаю, что лучше использовать промежуточный список, потому что запись в файл напрямую может быть длинной для транзакции базы данных.

EDIT: Извините, я не тестировал линию ... она должна работать сейчас.

... 
F = fun(T) -> mnesia:foldl(fun(X,Acc) -> [X|Acc] end, [],T) end, 
{atomic,L} = mnesia:transaction(F(mnesia_table)), 
file:write_file("filename.txt",[io_lib:format("~p\t~p~n",[F1,F2]) || 
       #table_record{field1 = F1,field2 = F2} <- L]), 
... 

enter image description here enter image description here enter image description here enter image description here

+0

спасибо за ваш ответ, но у меня есть ошибка, связанная с синтаксисом моей функции, я обновил свой вопрос –

+0

Я не настраивал базу данных mnesia, поэтому я не могу чтобы действительно проверить код, который я опубликовал. Я сделал некоторую коррекцию, и теперь она должна работать. – Pascal

+0

благодарим вас за ответ, но когда я тестирую свою функцию, у меня есть эта ошибка: Erlang R13B03 (erts-5.7.4) [источник] [rq: 1] [async-threads: 0] [hipe] [kernel-poll: false] Eshell V5.7.4 (прервать с^G) 1> модель: test(). ** ошибка исключения: неопределенная функция mensia: foldl/3 в функциональной модели: test/0 2> –

1

Вы забыли end в первой строке:

F = fun(T) -> mensia:foldl(fun(X,Acc) -> [X|Acc] end, [],T) end, 
+0

спасибо , но теперь у меня есть эта ошибка: переменная 'F' несвязана, я обновил свой код –

+0

Перепроверьте то, что я написал вам. 'end' в ПЕРВОЙ ЛИНИИ! Не в LAST ONE! –

+0

Прошу прощения, спасибо –

Смежные вопросы