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



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

基本上我想要的是独立访问每一列。由于文件会不断变化,我不想进行硬编码,我早就:)了。

Element0: | data | address | type | source | disable |

Element1: | 0x000001 | 0x123456 | in | D | yes |

Element2: | 0x0d0f00 | 0xffffff | out | M | yes |

Element3: | 0xe00ab4 | 0xaefbd1 | in | E | no |

我尝试过正则表达式/|s+.*s+|/它只打印几行(它会删除我关心的数据)。我也尝试了/|.*|/,它打印的所有内容都是空的。我已经用谷歌搜索了拆分方法,我知道这种情况正在发生,这是因为.*删除我关心的数据。我也尝试过正则表达式|s*|但它打印了整行。我已经尝试了许多正则表达式,但目前我想不出解决这个问题的方法。有什么建议吗?

`line_ary = ary_element.split(/|s.*|/)
    unless  line_ary.nil?  puts line_ary`

您应该使用 csv 类,而不是尝试正则表达式解析它。 像这样的事情可以:

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

我可能会为此使用 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"] 

与条带一起拆分可能是最简单的选择。你试过这样的事情吗?

"Element3:...".split(/|/).collect(&:strip)

最新更新