我已将文件中的数据放入数组中,然后我只是保留了我想要的数据,如下所示:
基本上我想要的是独立访问每一列。由于文件将不断变化,我不想要硬编码的东西,我本来已经做过:)。
Element0: | data | address | type | source | disable |
Element1: | 0x000001 | 0x123456 | in | D | yes |
Element2: | 0x0d0f00 | 0xffffff | out | M | yes |
Element3: | 0xe00ab4 | 0xaefbd1 | in | E | no |
我尝试使用regexp /\|\s+.*\s+\|/
只打印几行(它会删除我关注的数据)。我也试过了/\|.*\|/
并打印出所有空的。
我用Google搜索了分割方法,我知道发生这种情况是因为.*
删除了我关心的数据。我也试过了正则表达式\|\s*\|
,但它打印出整行。我尝试了许多正则表达式,但此刻我无法想出解决这个问题的方法。
有什么建议?
`line_ary = ary_element.split(/\|\s.*\|/)
unless line_ary.nil? puts line_ary`
答案 0 :(得分:5)
您应该使用csv class而不是尝试正则表达式解析它。这样的事情会做:
require 'csv'
data = CSV.read('data.csv', 'r', col_sep: '|')
您可以将行和列作为2维数组访问,例如访问第2行第4列:data[1][3]
。
例如,如果您只想打印所有行的地址列,则可以执行此操作:
CSV.foreach('data.csv', col_sep: '|') do |row|
puts row[2]
end
答案 1 :(得分:1)
我可能会使用CSV解析器但是如果您想使用正则表达式,并且您确定在其中一个列值中没有|
,那么你想说:
row = line.split(/\s*\|\s*/)
使管道两侧的空白成为分隔符的一部分。例如:
> 'Element0: | data | address | type | source | disable |'.split(/\s*\|\s*/)
=> ["Element0:", "data", "address", "type", "source", "disable"]
> 'Element1: | 0x000001 | 0x123456 | in | D | yes |'.split(/\s*\|\s*/)
=> ["Element1:", "0x000001", "0x123456", "in", "D", "yes"]
答案 2 :(得分:0)
与条带一起拆分可能是最简单的选择。你尝试过这样的事吗?
"Element3:...".split(/\|/).collect(&:strip)