2015-09-22 2 views
4

Как преобразовать эту строку "[{type,a},{to,room01023123},{body,hey what's up mister},{by,someone}]" в кортеж, как этот [{"type","a"},{"to","room01023123"},{"body","hey what's up mister"},{"by","someone"}]Преобразовать строковое представление кортежа реального кортежа

+0

Это не является допустимым Erlang кортеж, в частности, '{тело, эй, что случилось сеньор}' часть. Это только пример? –

+0

И вы хотите сделать это в Эрланге или в Эликсире? –

+1

Если вы исправите цитату в строке, чтобы сделать ее действительной, и добавьте период в конец строки, например: '" [{\ "type \", \ "a \"}, {\ "to \ ", \" room01023123 \ "}, {\" body \ ", \" hey what is up mister \ "}, {\" by \ ", \" someone \ "}].", тогда вы можете использовать 'erl_scan: string/1' и 'erl_parse: parse_term/1', как в [этот вопрос] (http://stackoverflow.com/q/28578482/409228). –

ответ

5

Если вам нужно прочитать из файла, просто используйте file:consult

-spec consult(Filename) -> {ok, Terms} | {error, Reason} 

В противном случае вам может использовать модуль erl_parse в сочетании с erl_scan. В простейшем случае, как этот

{ok, Tokens, _Line} = erl_scan:string("{hello, world}."), 
erl_parse:parse_term(Tokens). 

И не забывайте, что условия должны заканчиваться полной остановки.

+1

'file: consult/1' не будет работать в этом случае, потому что этот термин недействителен. И часть ответа «erl_scan» и «erl_parse» - это дубликат [этого ответа] (http://stackoverflow.com/a/28579217/409228). –

+0

@SteveVinoski, если термин недействителен, первым шагом является, чтобы, конечно, сделать срок действительным :) – Lol4t0

+0

Конечно, в этом случае этот вопрос является дубликатом [этого вопроса] (http://stackoverflow.com/q/28578482/409228). –

-1

Решение по лбу:

Str = "[{type,a},{to,room01023123},{body,hey what's up mister},{by,someone}]". 
Need = [{"type","a"},{"to","room01023123"},{"body","hey what's up mister"},{"by","someone"}]. 
L1 = string:tokens(tl(Str),","). 
R=[fun(El)->Add= case El==length(L1)-1 of true->2;false->1 end, 
Temp = lists:nth(X+1,L1), 
{tl(lists:nth(X,L1)),lists:sublist(Temp,1,length(Temp)-Add)} end(X) 
||X<-lists:seq(1,length(L1),2)]. 
+0

прокомментируйте причину downvote. –

+0

Это решение! спасибо – user1000622

+3

Даунвит не мой, но это значительно хуже, чем другой ответ в большинстве случаев: читаемость, производительность, обработка ошибок и т. д. –

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