使用Ruby解析文本
我的以下文本将始终遵循相同的格式:使用Ruby解析文本,ruby,Ruby,我的以下文本将始终遵循相同的格式: 1 "13" "241" "Rabun" "06" "County" 2 "13" "281" "Towns" "06" "County" 我想将每个部分分配给如下哈希: locality= {:id => "", :fips1 => "", :fips2 => "", :county => "", :stateid => "", :type => ""} 我该如何用Ruby做这件事?非常感谢您
1
"13"
"241"
"Rabun"
"06"
"County"
2
"13"
"281"
"Towns"
"06"
"County"
我想将每个部分分配给如下哈希:
locality= {:id => "", :fips1 => "", :fips2 => "", :county => "", :stateid => "", :type => ""}
我该如何用Ruby做这件事?非常感谢您的帮助。对于每个节,请使用正则表达式,其中的组与节中的每个条目相对应,然后根据这些组中的描述创建哈希表。对于每个节,请使用正则表达式,其中的组与节中的每个条目相对应,然后,按照您在这些组中描述的那样简单地创建哈希表
fields = [:fips1,:fips2,:county,:stateid,:type]
arraywithhashes = yourtextdata.split("\n\n").map { |loc|
Hash[
[[:id,loc[/\d+/]]] +
fields.zip(loc.scan(/"([^"]+)"/).map &:first)
]
}
如果向文件中添加新字段,只需将其添加到字段中即可进行编辑
locality.each_key { |k| locality.store(k, "foo") }
如果向文件中添加新字段,只需将其添加到字段中即可进行编辑
locality.each_key { |k| locality.store(k, "foo") }
这里又是一个新手,但这可能是你的一个开始
这里另一个新手,但这可能是你的一个开始。
你可能想考虑使用一个Shutt而不是一个哈希。
Locality = Struct.new(:id, :fips1, :fips2, :county, :stateid, :type)
localities = []
DATA.each_slice(7) do |chunk|
chunk.pop if chunk.size == 7
localities << Locality.new(*chunk.map{|line| line.scan(/\w+/) })
end
p localities # => [#<struct Locality id=["1"], fips1=["13"], fips2=["241"], etc.
puts localities[1].fips2 # => 281
__END__
1
"13"
"241"
"Rabun"
"06"
"County"
2
"13"
"281"
"Towns"
"06"
"County"
Locality=Struct.new(:id,:fips1,:fips2,:country,:stateid,:type)
地点=[]
数据。每个|片(7)都有|块|
如果chunk.size==7,则chunk.pop
地点
__结束__
1.
"13"
"241"
“拉邦”
"06"
“县”
2.
"13"
"281"
“城镇”
"06"
“县”
- 每个_片(7)取7行数据
数据(在
\uuuu结束\uuu
之后的内容)
- 最后一行将被删除,除非
只有六行(最后一行)
“记录”)
- 剩余文件的已清理副本
行。使用这些值
将创建新的位置并将其添加到
阵列
您可能需要考虑使用结构而不是哈希。
Locality = Struct.new(:id, :fips1, :fips2, :county, :stateid, :type)
localities = []
DATA.each_slice(7) do |chunk|
chunk.pop if chunk.size == 7
localities << Locality.new(*chunk.map{|line| line.scan(/\w+/) })
end
p localities # => [#<struct Locality id=["1"], fips1=["13"], fips2=["241"], etc.
puts localities[1].fips2 # => 281
__END__
1
"13"
"241"
"Rabun"
"06"
"County"
2
"13"
"281"
"Towns"
"06"
"County"
Locality=Struct.new(:id,:fips1,:fips2,:country,:stateid,:type)
地点=[]
数据。每个|片(7)都有|块|
如果chunk.size==7,则chunk.pop
地点
__结束__
1.
"13"
"241"
“拉邦”
"06"
“县”
2.
"13"
"281"
“城镇”
"06"
“县”
- 每个_片(7)取7行数据
数据(在
\uuuu结束\uuu
之后的内容)
- 最后一行将被删除,除非
只有六行(最后一行)
“记录”)
- 剩余文件的已清理副本
行。使用这些值
将创建新的位置并将其添加到
阵列
@willcodejavaforfood:那就学吧!过一段时间,你宁愿饿死也不愿编写Java代码……数据来自文本文件,所以如果我使用textfile=file.open(“filename.dat”)数组,它的hashes=textfile.split(“\n\n”).map{| loc |我得到了一个命名错误。@Lars Haugseth-我正在尝试!甚至加入了一个开源项目:)@Mike,file=file.Open('filename.dat');textfile=file.read;file.close
或textfile=file.Open('filename.dat'){f | f.read
或textfile=file.read('filename.dat'))
这只是给了我文本文件的第一个文本块。它似乎没有在其余的文本块中循环。@willcodejavaforfood:那就学习它吧!过一段时间,你宁愿挨饿也不愿给Java编码……数据来自文本文件,所以如果我使用textfile=file.open(“filename.dat”)arraywithhashes=textfile.split(\n\n”).map{| loc |我得到了一个命名错误。@Lars Haugseth-我正在尝试!甚至加入了一个开源项目:)@Mike,file=file.Open('filename.dat');textfile=file.read;file.close
或textfile=file.Open('filename.dat'){f | f.read
或textfile=file.read('filename.dat'))
这只是给出了文本文件的第一个文本块。它似乎没有在其余的文本块中循环。