如何以我的格式正确解析文本文件中的字符串

时间:2017-05-30 06:27:46

标签: ruby parsing

我正在尝试从文本文件逐行解析/组织字符串列表到Ruby中的数组。我希望我解释得对。

example.txt中

exampleuser:examplepassword
myusername:mypassword
askfjwaeir:dcqw38974q238ifj

我想如何在Ruby中存储example.txt -

$username = [ "exampleuser",
      "myusername",
      "askfjwaeir"
]

$password = [ "examplepassword",
      "mypassword",
      "dcqw38974q238ifj"

我一直在寻找几个小时,但似乎找不到我正在寻找的东西。我知道.strip,.split,从分号中切断,但我似乎无法做我在这里描述的内容。

2 个答案:

答案 0 :(得分:0)

username, password = File.readlines('example.txt')
                         .map { |s| s.chomp.split(':') }
                         .transpose

为什么你首先会有这样的演示?哈希将用户名作为键,密码作为值更具可读性:

users = File.readlines('example.txt')
            .map { |s| s.chomp.split(':') }
            .to_h
#⇒ {
#   "exampleuser" => "examplepassword",
#    "myusername" => "mypassword",
#    "askfjwaeir" => "dcqw38974q238ifj"
# }

此外,在任何情况下都不应使用全局变量。

答案 1 :(得分:0)

使用解构分配

处理您提出的问题的一种方法是在自动关闭IO#each_line块中使用File#open。然后,您可以使用String#split解构每一行,然后将结果附加到存储阵列。例如:

  s1.SetCustomProperty("someAttribute", "someValue");

使用哈希

上面的示例回答了您提出的问题,但它可能是X / Y问题的解决方案,因为您现在缺少用户名和密码之间的映射。你可以在两个数组之间进行索引,但这真的很麻烦。你真正想要的是像Hash一样的键/值数据结构。

根据前一个示例的输出,您可以使用Array#zipArray#to_h将数组数据转换为更有用的数据。例如:

# Create arrays outside the File block, which acts as a scope gate.
usernames = []
passwords = []

# Open your file, and split your lines. This solution avoids having to read
# all of example.txt in at once, which may matter on larger files.
File.open('example.txt') do |file|
  file.each_line do |line|
    user, pass = line.chomp.split ':'
    usernames << user
    passwords << pass
  end
end

usernames
#=> ["exampleuser", "myusername", "askfjwaeir"]

passwords
#=> ["examplepassword", "mypassword", "dcqw38974q238ifj"]

也许您有一个特定的用例,但一般情况下,您应该根据计划访问数据的方式选择数据结构。在大多数情况下,键/值对应该是Hash,Struct或OpenStruct,因为它们针对查找键进行了优化。您的里程可能会有所不同。