如何在Ruby中将字符串解析为哈希表

Emm*_*odu 2 ruby string parsing hashtable

我正在从远程设备获取字符串形式的数据。我需要解析数据。数据通常是这样的:

MO                SCGR  SC         RSITE           ALARM_SITUATION
RXOTG-59            59  0          EK0322          ABIS PATH FAULT
RXOCF-59                           EK0322          LOCAL MODE
RXOTRX-59-0         4              EK0322          LOCAL MODE
RXOTRX-59-1                        EK0322          LOCAL MODE
RXOTRX-59-4             0          EK0322          LOCAL MODE
RXOTRX-59-5         1   3          EK0322          LOCAL MODE
RXOTRX-59-8                        EK0322          LOCAL MODE
RXOTRX-59-9                        EK0322          LOCAL MODE
Run Code Online (Sandbox Code Playgroud)

我很乐意将数据作为数组的数组或任何其他程序上合理的结构。

我使用以下方法将数据拆分为一个数组:

str.split("\r\n")
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令删除数组中每个元素的多余空间:

tsgs.map! {|tsg| tsg.gsub(/\s+/, " ").split(" ") }
Run Code Online (Sandbox Code Playgroud)

但这有局限性,因为没有考虑空单元格。我希望数组包含五个元素,但它包含的元素少于五个。

情况1:在这种情况下,我得到了预期的结果:

RXOTG-59            59  0          EK0322          ABIS PATH FAULT
Run Code Online (Sandbox Code Playgroud)

转换为

["RXOTG-59", "59", "0", "EK0322", "ABIS PATH FAULT"]
Run Code Online (Sandbox Code Playgroud)

情况2:在这种情况下,我得到了意外的结果:

RXOTRX-59-9                        EK0322          LOCAL MODE
Run Code Online (Sandbox Code Playgroud)

转换为

["RXOTRX-59-9", "EK0322", "LOCAL MODE"]
Run Code Online (Sandbox Code Playgroud)
MO                SCGR  SC         RSITE           ALARM_SITUATION
RXOTG-59            59  0          EK0322          ABIS PATH FAULT
RXOCF-59                           EK0322          LOCAL MODE
RXOTRX-59-0         4              EK0322          LOCAL MODE
RXOTRX-59-1                        EK0322          LOCAL MODE
RXOTRX-59-4             0          EK0322          LOCAL MODE
RXOTRX-59-5         1   3          EK0322          LOCAL MODE
RXOTRX-59-8                        EK0322          LOCAL MODE
RXOTRX-59-9                        EK0322          LOCAL MODE
Run Code Online (Sandbox Code Playgroud)

ste*_*lag 5

带有指令“ A”的String.unpack非常适合固定宽度的字符串。

str = "RXOTRX-59-9                        EK0322          LOCAL MODE"
p str.unpack("A20A4A11A16A15" ) # => ["RXOTRX-59-9", "", "", "EK0322", "LOCAL MODE"]
Run Code Online (Sandbox Code Playgroud)