“\ t”上的Ruby字符串拆分丢失“\ n”

时间:2016-11-30 17:56:27

标签: arrays ruby split

\ t分享此制表符分隔数据集:

171 1000    21  
269 1000    25  
389 1000    40  
1020    1-03    30  1
1058    1-03    30  1
1074    1-03    30  1
200 300     500

(为清楚起见:)

171\t1000\t21\t\n   
269\t1000\t25\t\n   
389\t1000\t40\t\n
1020\t1-03\t30\t1\n
1058\t1-03\t30\t1\n
1074\t1-03\t30\t1\n
200\t300\t\t500\n

a = text.split(/\n/)
a.each do |i|
  u = i.split(/\t/)
  puts u.size
end

==>
3
3
3
4
4
4
4

\ t \ n组合似乎削掉了最后一个\ t,我需要进一步输入。我怎么能绕过这个?干杯

编辑:这是我所期待的:

4
4
4
4
4
4
4

1 个答案:

答案 0 :(得分:7)

如果这是用于制作,您应该使用CSV class作为评论中指出的@DmitryZ。 CSV处理有很多警告,你不应该手工完成。

但是,让我们通过它作为练习...

问题是拆分不保留分隔符,并且它不保留尾随空列。你已经遇到了这两个问题。

当您运行a = text.split(/\n/)时,a的元素没有换行符。

a = [
    171\t1000\t21\t   
    269\t1000\t25\t   
    389\t1000\t40\t
    1020\t1-03\t30\t1
    1058\t1-03\t30\t1
    1074\t1-03\t30\t1
    200\t300\t\t500
]

然后,as documented in String#split," 如果省略limit参数,则尾随空字段被抑制。",因此u = i.split(/\t/)将忽略最后一个字段 除非 您给它一个限制。

如果你知道它总是4个字段,你可以使用4。

u = i.split(/\t/, 4)

但是使用-1可能更灵活,因为" 如果[限制为]为负数,则返回的字段数没有限制,并且不会抑制尾随空字段"这样就可以保留空字段而不用硬编码CSV中的列数。

u = i.split(/\t/, -1)