从分割

时间:2015-09-01 19:58:52

标签: ruby

我需要解析CSV列中的一个字段:

TXDAT - SnpRespData_SC or SnpRespData_SC_PD (7)

我需要提取:

type_0 = SnpRespData
resp_0 = SC
pd_0 = 0
type_1 = SnpRespData
resp_1 = SC
pd_1 = 1

来自此字符串。我想将整个字符串传递给函数,并能够返回这六个值。

字符串可以是以下任何一种:
a)TXDAT - SnpRespData_SC_PD
b)TXRSP - SnpResp_SC
c)TXDAT - SnpRespData_SC或SnpRespData_SC_PD(7)
d)TXRSP - SnpResp_UC或TXDAT - SnpRespData_UC_PD(7)

所以我创建了一个函数来接收这个字符串并返回以下内容:
def map_rxsnp_transaction(rxsnp_transaction)
   tx_dat = []
   tx_rsp = []
   案例rxsnp_transaction
       when(/SnpRespData.*SnpRespData/)
           tx_dat = rxsnp_transaction.split(/或/)
           (tx_dat_0,dat_0_resp,dat_0_pd)= tx_dat [0] .split(/ _ /)
      (tx_dat_1,dat_1_resp,dat_1_pd)= tx_dat [1] .split(/ _ /)
      返回[tx_dat_0,dat_0_resp,dat_0_pd,tx_dat_1,dat_1_resp,dat_1_pd]
    何时(/SnpResp.*SnpRespData/)
      (tx_rsp,tx_dat)= rxsnp_transaction.split(/或/)
      (tx_rsp,rsp_resp,rsp_pd)= tx_rsp.split(/ _ /)
      (tx_dat,dat_resp,dat_pd)= tx_dat.split(/ _ /)
      return [tx_rsp,rsp_resp,rsp_pd,tx_dat,dat_resp,dat_pd]
    when(/ SnpRespData_ {1} /)
      return rxsnp_transaction.split(/ /)
    何时(/ SnpResp
{1} /)
      return rxsnp_transaction.split(/ _ /)
    结束
 结束

功能调用:
(tx_rsp [0],tx_rsp [1],tx_rsp [2],tx_rsp [3],tx_rsp [4],tx_rsp [5])= map_rxsnp_transaction table_col [5]

只是想知道我是否可以更好地优化这些代码......不喜欢它的方式

1 个答案:

答案 0 :(得分:0)

我假设你正在寻找一个特定的字符串,即"SnpRespData"。如果是这样,你可以这样做:

str = "TXDAT - SnpRespData_SC or SnpRespData_SC_PD (7)"

f, l = str.scan(/SnpRespData\w+/).sort
  #=> ["SnpRespData_SC", "SnpRespData_SC_PD"] 
type_0, resp_0, pd_0 = f.split('_') << 0
  #=> ["SnpRespData", "SC", 0] 
type_1, resp_1, pd_1 = f.split('_').first(2) << 1
  #=> ["SnpRespData", "SC", 1]

type_0 #=> "SnpRespData" 
resp_0 #=> "SC" 
pd_0   #=> 0 

type_1 #=> "SnpRespData" 
resp_1 #=> "SC" 
pd_1   #=> 1