簡體   English   中英

Ruby在正則表達式中拆分管道

[英]Ruby split pipes in 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 |

我已經嘗試過使用正則表達式/\\|\\s+.*\\s+\\|/來打印幾行(它刪除了我關心的數據)。 我也嘗試過使用/\\|.*\\|/ ,它會將所有內容打印為空。 我已經搜索了split方法,並且知道發生這種情況是因為.*刪除了我關心的數據。 我也嘗試過使用正則表達式\\|\\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"] 

與strip一起拆分可能是最簡單的選擇。 你嘗試過這樣的事情嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM