\ tTrying以拆分此制表符分隔的数据集:
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
Run Code Online (Sandbox Code Playgroud)
(为清楚起见:)
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
Run Code Online (Sandbox Code Playgroud)
\ t \n组合似乎削掉了最后一个\ t,我需要进一步输入.我怎么能绕过这个?干杯
编辑:这是我所期待的:
4
4
4
4
4
4
4
Run Code Online (Sandbox Code Playgroud)
如果这是用于生产,您应该使用CSV类作为注释中指出的@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
]
Run Code Online (Sandbox Code Playgroud)
然后,如String#split中所述," 如果省略limit参数,则尾随空字段将被抑制. ",因此除非您给出限制,否则u = i.split(/\t/)将忽略该最后一个字段.
如果你知道它总是4个字段,你可以使用4个.
u = i.split(/\t/, 4)
Run Code Online (Sandbox Code Playgroud)
但是使用-1可能更灵活,因为" 如果[限制为]为负数,则返回的字段数没有限制,并且不会抑制尾随空字段. "这样可以保留空字段而无需硬编码CSV中的列数.
u = i.split(/\t/, -1)
Run Code Online (Sandbox Code Playgroud)