Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ruby解析文本_Ruby - Fatal编程技术网

使用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'))
这只是给出了文本文件的第一个文本块。它似乎没有在其余的文本块中循环。