2016-11-22 41 views
0

我想消費,我有用戶的LDAP數據庫,我已經做了一些以前的文本處理,讓我有這樣的文字:如何將LDAP解析爲Ruby數據?

uid: angelica 
cn: Angelica Turaca 
homeDirectory: /home/exaluno/angelica 
mail: [email protected], 

uid: ljunior 
cn: Lourinaldo Anastacio da Silva Junior 
homeDirectory: /home/exaluno/ljunior 
mail: [email protected], 

uid: acvm 
cn: Ana Cristina Vieira de Melo 
homeDirectory: /home/prof/acvm 
mail: [email protected], 

它包含了我想要的所有數據。我只是想將其轉換成如下形式:

users[0]['uid'] #angelica 
users[1]['mail'] #[email protected] 

什麼是最簡單的方法?

+0

請閱讀 「[問]」 和鏈接的網頁, 「[MCVE]」 和http://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack -overflow用戶。我們希望看到的你試了一下最低例子,而不是從頭開始編寫一個整個腳本可能會或可能不適合你寫什麼。我們也可能無意中最終重複您的代碼,浪費我們的時間。 「最簡單的方法是什麼」有點取決於你已經嘗試過的,對吧? –

回答

1

這不是很漂亮,但一些正則表達式很快做的工作:

obj = {} 
users = [] 

ldap_file.each_line do |line| 
    if line =~ /([^:]+): (.*?),?$/ 
    obj[$1] = $2 
    if line =~ /,$/ 
     users << obj 
     obj = {} 
    end 
    else 
    warn "Failed to match: #{line}" 
    end 
end 

一個更優雅的解決方案(雖然你需要在內存中的整個文本一次)

users = ldap_text.split(/,\s*/m).map do |grp| 
    grp.each_line.map { |line| line.strip.split(/:\s*/) }.to_h 
end 
1
str =<<_ 
uid: angelica 
cn: Angelica Turaca 
homeDirectory: /home/exaluno/angelica 
mail: [email protected], 

uid: ljunior 
cn: Lourinaldo Anastacio da Silva Junior 
homeDirectory: /home/exaluno/ljunior 
mail: [email protected], 

uid: acvm 
cn: Ana Cristina Vieira de Melo 
homeDirectory: /home/prof/acvm 
mail: [email protected], 
_ 

users = str.split(/\n\n+/).each_with_object([]) do |s,a| 
    a << s.each_line.with_object({}) do |line,h| 
    k,v = line.strip.split(/:\s*/) 
    h[k] = v 
    end 
end 
    #=> [{ "uid"=>"angelica", "cn"=>"Angelica Turaca", 
    #  "homeDirectory"=>"/home/exaluno/angelica", 
    #  "mail"=>"[email protected],"}, 
    # { "uid"=>"ljunior", "cn"=>"Lourinaldo Anastacio da Silva Junior", 
    #  "homeDirectory"=>"/home/exaluno/ljunior", 
    #  "mail"=>"[email protected],"}, 
    # { "uid"=>"acvm", "cn"=>"Ana Cristina Vieira de Melo", 
    #  "homeDirectory"=>"/home/prof/acvm", "mail"=>"[email protected],"}] 

users[0]['uid'] #=> "angelica" 
users[1]['mail'] #=> "[email protected]," 

如果你不想在最後返回值的末尾逗號,這是很容易處理。