【问题标题】:Ruby String Split on "\t" loses "\n""\t" 上的 Ruby 字符串拆分丢失 "\n"
【发布时间】:2017-04-15 04:09:22
【问题描述】:

\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

【问题讨论】:

  • 您期望的输出是什么?这似乎按预期运行。
  • 您应该尝试使用自定义分隔符的 CSV 模块。 CSV.read("文件路径.csv", col_sep: "\t")
  • 我无法理解这个问题。您说“尝试拆分此制表符分隔的数据集”,但您没有说要拆分的内容。另外,我无法调和“\t\n 组合似乎剃掉了最后一个 \t,...”与标题:“...在 "\t" 上拆分失去 "\n"。你先想在换行符上拆分,然后在制表符上拆分每个字符串,前三行的结果数组以空字符串结尾?如果您可以编辑问题以显示您想要的结果,这将特别有用。
  • 另外,我注意到前三行中的每一行在最后一个制表符和换行符之间都包含一个或多个空格。这是故意的吗?如果是这样,你想保留这些空间吗?
  • 前三个条目,\t\n 很重要,应该在记录的数组中作为 nil 导入,而不是 3 成员数组。

标签: arrays ruby split


【解决方案1】:

如果这是用于生产,您应该使用 @DmitryZ 在 cmets 中指出的 CSV class。 CSV 处理有大量的注意事项,您不应该手动进行。

但是让我们把它当作一个练习...


问题是 split 没有保留分隔符,也没有保留尾随空列。你已经遇到了这两个问题。

当您运行 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,“如果省略了限制参数,则会抑制尾随的空字段。”,所以u = i.split(/\t/) 将忽略最后一个字段除非 em> 你给它一个限制。

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

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

但使用 -1 可能更灵活,因为“如果 [限制为] 负数,则返回的字段数量没有限制,并且不会抑制尾随的空字段。”所以这将保留空字段,而无需对 CSV 中的列数进行硬编码。

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

【讨论】:

  • 我首先使用 /\n/ 进行拆分。每个问题都出现了这个问题。这个限制似乎是我一直在寻找的技巧。负限制扩展所有明显的项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多