2016-11-22 9 views
0

Ich versuche, verbrauchen eine LDAP-Datenbank von Benutzern, die ich habe, und ich habe schon einige vorherigen Textverarbeitung, so dass ich einen Text wie diesen:wie LDAP in Ruby-Daten zu analysieren?

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], 

Es enthält alle Daten, die ich haben will. Ich möchte es nur in etwas wie:

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

Was wäre der einfachste Weg?

+0

Bitte lesen Sie "[fragen]" und die verlinkten Seiten, "[mcve]" und http://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack -overflow-Benutzer. Wir würden gerne das minimale Beispiel von dem sehen, was Sie versucht haben, anstatt ein ganzes Skript von Grund auf neu zu schreiben, das zu dem, was Sie geschrieben haben, passt oder nicht passt. Wir könnten auch versehentlich Ihren Code duplizieren und damit unsere Zeit verschwenden. "Was wäre der einfachste Weg" hängt irgendwie davon ab, was du schon versucht hast, oder? –

Antwort

1

Es ist nicht schön, aber einige reguläre Ausdrücke tun, um die Arbeit schnell:

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 

Eine elegantere Lösung (wenn Sie den gesamten Text im Speicher auf einmal benötigen)

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]," 

Wenn Sie nicht möchten, dass das Komma am Ende des letzten Rückgabewerts steht, können Sie das problemlos erledigen.