正则表达式中的Ruby拆分管道

时间:2015-04-20 22:21:04

标签: ruby regex

我已将文件中的数据放入数组中,然后我只是保留了我想要的数据,如下所示:

基本上我想要的是独立访问每一列。由于文件将不断变化,我不想要硬编码的东西,我本来已经做过:)。

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`

3 个答案:

答案 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)