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

Ric*_*h_F 4 ruby arrays split

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

Sch*_*ern 7

如果这是用于生产,您应该使用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)