\ 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
答案 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)