首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将此文本拆分为散列红宝石

如何将此文本拆分为散列红宝石
EN

Stack Overflow用户
提问于 2014-12-08 17:18:18
回答 2查看 86关注 0票数 0

对不起,我英语不好,我是新来的。

我有这个document.txt

代码语言:javascript
复制
paul gordon,jin kazama,1277,1268,21-12,21-19
yoshimistu,the rock,2020,2092,21-9,21-23,25-27
... lot more

我的意思是,如何把每一行和逗号火花,变成像这样的散列。

代码语言:javascript
复制
result = { 
    line_num: { name1: "paula wood", name2: "sarah carnley", m1: 1277, m2: 1268, sc1: 21, sc2: 12, sc3: 21, sc4: 19  }
}

我试着用text2re为regex 这里编写这样的im代码

代码语言:javascript
复制
doc = File.read("doc.txt")
lines = doc.split("\n")
counts = 0
example = {}
player1 = '((?:[a-z][a-z]+))(.)((?:[a-z][a-z]+))'
player2 = '((?:[a-z][a-z]+))(.)((?:[a-z][a-z]+))'
re = (player1 + player2 )
m = Regexp.new(re, Regexp::IGNORECASE)
lines.each do |line|

re1='((?:[a-z][a-z]+))' # Word 1
re2='(.)'   # Any Single Character 1
re3='((?:[a-z][a-z]+))' # Word 2
re4='(.)'   # Any Single Character 2
re5='((?:[a-z][a-z]+))' # Word 3
re6='(.)'   # Any Single Character 3
re7='((?:[a-z][a-z]+))' # Word 4

re=(re1+re2+re3+re4+re5+re6+re7)
m=Regexp.new(re,Regexp::IGNORECASE);
if m.match(line)
    word1=m.match(line)[1];
    c1=m.match(line)[2];
    word2=m.match(line)[3];
    c2=m.match(line)[4];
    word3=m.match(line)[5];
    c3=m.match(line)[6];
    word4=m.match(line)[7];
    counts += 1
    example[counts] = word1+word2
    puts example
end
end
# (/[a-z].?/)

但是输出不符合我的预期。

1=>"", 2=>"indahdelika", 3=>"masam", ..more

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-08 18:28:23

您的数据是逗号分隔的,所以使用CSV类而不是尝试自己的解析器。如果你想简单地用逗号分裂,就会有龙在等你。

我会用:

代码语言:javascript
复制
require 'csv'

data = "paul gordon,jin kazama,1277,1268,21-12,21-19
yoshimistu,the rock,2020,2092,21-9,21-23,25-27
"

hash = {}
CSV.parse(data).each_with_index do |row, i|
  name1, name2, m1, m2, sc1_2, sc3_4 = row
  sc1, sc2 = sc1_2.split('-')
  sc3, sc4 = sc3_4.split('-')
  hash[i] = {
    name1: name1,
    name2: name2,
    m1: m1,
    m2: m2,
    sc1: sc1,
    sc2: sc2,
    sc3: sc3,
    sc4: sc4,
  }
end

其结果是:

代码语言:javascript
复制
hash
# => {0=>
#      {:name1=>"paul gordon",
#       :name2=>"jin kazama",
#       :m1=>"1277",
#       :m2=>"1268",
#       :sc1=>"21",
#       :sc2=>"12",
#       :sc3=>"21",
#       :sc4=>"19"},
#     1=>
#      {:name1=>"yoshimistu",
#       :name2=>"the rock",
#       :m1=>"2020",
#       :m2=>"2092",
#       :sc1=>"21",
#       :sc2=>"9",
#       :sc3=>"21",
#       :sc4=>"23"}}

因为您是从文件中读取的,所以请使用文档中的"一次从文件中读取一行“示例修改上面的内容。

如果数字需要为整数,则将散列定义调整为:

代码语言:javascript
复制
  hash[i] = {
    name1: name1,
    name2: name2,
    m1: m1.to_i,
    m2: m2.to_i,
    sc1: sc1.to_i,
    sc2: sc2.to_i,
    sc3: sc3.to_i,
    sc4: sc4.to_i,
  }

其结果是:

代码语言:javascript
复制
# => {0=>
#      {:name1=>"paul gordon",
#       :name2=>"jin kazama",
#       :m1=>1277,
#       :m2=>1268,
#       :sc1=>21,
#       :sc2=>12,
#       :sc3=>21,
#       :sc4=>19},
#     1=>
#      {:name1=>"yoshimistu",
#       :name2=>"the rock",
#       :m1=>2020,
#       :m2=>2092,
#       :sc1=>21,
#       :sc2=>9,
#       :sc3=>21,
#       :sc4=>23}}
#       :sc4=>"23"}}
票数 1
EN

Stack Overflow用户

发布于 2014-12-08 19:23:50

这是另一种你可以做的方法。对于每一行的项目数,即:namex:scx:mx的值或这些项目的顺序,我都没有作出任何假设。

代码语言:javascript
复制
def hashify(str)
  str.lines.each_with_index.with_object({}) { |(s,i),h| h[i] = inner_hash(s) }
end

def inner_hash(s)
  n = m = sc = 0
  s.split(',').each_with_object({}) do |f,g|
    case f
    when /[a-zA-Z].*/
      g["name#{n += 1}".to_sym] = f
    when /\-/
      g["sc#{sc += 1}".to_sym], g["sc#{sc += 1}".to_sym] = f.split('-').map(&:to_i)
    else
      g["m#{m += 1}".to_sym] = f.to_i
    end
  end
end

示例

代码语言:javascript
复制
str = "paul gordon,jin kazama,1277,1268,21-12,21-19
yoshimistu,the rock,2020,2092,21-9,21-23,25-27"

hashify(str)
  #=> {0=>{:name1=>"paul gordon", :name2=>"jin kazama",
  #        :m1=>1277, :m2=>1268,
  #        :sc1=>21, :sc2=>12, :sc3=>21, :sc4=>19},
  #    1=>{:name1=>"yoshimistu", :name2=>"the rock",
  #        :m1=>2020, :m2=>2092,
  #        :sc1=>21, :sc2=>9, :sc3=>21, :sc4=>23, :sc5=>25, :sc6=>27}
  #   }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27363312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档