如何将LDAP解析为Ruby数据?
我正在尝试使用我拥有的LDAP用户数据库,并且我已经进行了一些以前的文本处理,因此我有如下文本:如何将LDAP解析为Ruby数据?,ruby,ldap,Ruby,Ldap,我正在尝试使用我拥有的LDAP用户数据库,并且我已经进行了一些以前的文本处理,因此我有如下文本: uid: angelica cn: Angelica Turaca homeDirectory: /home/exaluno/angelica mail: angelica@linux.ime.usp.br, uid: ljunior cn: Lourinaldo Anastacio da Silva Junior homeDirectory: /home/exaluno/ljunior mail
uid: angelica
cn: Angelica Turaca
homeDirectory: /home/exaluno/angelica
mail: angelica@linux.ime.usp.br,
uid: ljunior
cn: Lourinaldo Anastacio da Silva Junior
homeDirectory: /home/exaluno/ljunior
mail: ljunior@linux.ime.usp.br,
uid: acvm
cn: Ana Cristina Vieira de Melo
homeDirectory: /home/prof/acvm
mail: acvm@linux.ime.usp.br,
它包含我想要的所有数据。我只是想把它转换成:
users[0]['uid'] #angelica
users[1]['mail'] #ljunior@linux.ime.usp.br
最简单的方法是什么?这并不漂亮,但有些正则表达式可以很快完成这项工作:
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
这并不漂亮,但有些正则表达式可以很快完成这项工作:
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
从Ruby 1.9开始,我使用了在using definition中描述的解决方案
从Ruby 1.9开始,我使用了在using definition中描述的解决方案
str=“Angelica Turaca”,
#“homeDirectory”=>“/home/exaluno/angelica”,
#“邮件”=>“angelica@linux.ime.usp.br,"},
#{“uid”=>“ljunior”,“cn”=>“Lourinaldo Anastacio da Silva Junior”,
#“homeDirectory”=>“/home/exaluno/ljunior”,
#“邮件”=>“ljunior@linux.ime.usp.br,"},
#{“uid”=>“acvm”,“cn”=>“安娜·克里斯蒂娜·维埃拉·德梅洛”,
#“homeDirectory”=>“/home/prof/acvm”,“邮件”=>”acvm@linux.ime.usp.br,"}]
用户[0]['uid']#=>“angelica”
用户[1]['mail']#=>”ljunior@linux.ime.usp.br,"
如果您不想在最后一个返回值的末尾加逗号,这很容易处理。str=“Angelica Turaca”,
#“homeDirectory”=>“/home/exaluno/angelica”,
#“邮件”=>“angelica@linux.ime.usp.br,"},
#{“uid”=>“ljunior”,“cn”=>“Lourinaldo Anastacio da Silva Junior”,
#“homeDirectory”=>“/home/exaluno/ljunior”,
#“邮件”=>“ljunior@linux.ime.usp.br,"},
#{“uid”=>“acvm”,“cn”=>“安娜·克里斯蒂娜·维埃拉·德梅洛”,
#“homeDirectory”=>“/home/prof/acvm”,“邮件”=>”acvm@linux.ime.usp.br,"}]
用户[0]['uid']#=>“angelica”
用户[1]['mail']#=>”ljunior@linux.ime.usp.br,"
如果您不想在最后一个返回值的末尾加逗号,这很容易处理。请阅读“和链接页面”和。我们希望看到您尝试过的最简单的示例,而不是从头开始编写一个完整的脚本,该脚本可能适合您所编写的内容,也可能不适合您所编写的内容。我们也可能在不经意间复制您的代码,浪费我们的时间。“最简单的方法是什么”取决于你已经尝试了什么,对吗?请阅读“和链接页面”,以及。我们希望看到您尝试过的最简单的示例,而不是从头开始编写一个完整的脚本,该脚本可能适合您所编写的内容,也可能不适合您所编写的内容。我们也可能在不经意间复制您的代码,浪费我们的时间。“最简单的方法是什么”取决于你已经尝试了什么,对吗?
def to_hash(str)
Hash[
str.split(';').map do |pair|
k, v = pair.split('=', 2)
[k, v.to_i]
end
]
end
str =<<_
uid: angelica
cn: Angelica Turaca
homeDirectory: /home/exaluno/angelica
mail: angelica@linux.ime.usp.br,
uid: ljunior
cn: Lourinaldo Anastacio da Silva Junior
homeDirectory: /home/exaluno/ljunior
mail: ljunior@linux.ime.usp.br,
uid: acvm
cn: Ana Cristina Vieira de Melo
homeDirectory: /home/prof/acvm
mail: acvm@linux.ime.usp.br,
_
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"=>"angelica@linux.ime.usp.br,"},
# { "uid"=>"ljunior", "cn"=>"Lourinaldo Anastacio da Silva Junior",
# "homeDirectory"=>"/home/exaluno/ljunior",
# "mail"=>"ljunior@linux.ime.usp.br,"},
# { "uid"=>"acvm", "cn"=>"Ana Cristina Vieira de Melo",
# "homeDirectory"=>"/home/prof/acvm", "mail"=>"acvm@linux.ime.usp.br,"}]
users[0]['uid'] #=> "angelica"
users[1]['mail'] #=> "ljunior@linux.ime.usp.br,"