【问题标题】:scala split ignore last values when emptyscala split 为空时忽略最后一个值
【发布时间】:2019-06-12 14:22:38
【问题描述】:
scala> val st1 = "|||||||000001|09/01/2014|V|174500,00|22||BD |2540|LEC|1000|BEB|
       01|53||AE|111 ||49|94,22|6||||||||2|2|App|80|2|||"
scala> st1.split('|').length
resXX: Int = 39

scala> val st2 = "|||||||000001|09/01/2014|V|174500,00|22||BD |2540|LEC|1000|BEB|
       01|53||AE|111 ||49|94,22|6||||||||2|2|App|80|2| | |"
scala> st2.split('|').length
resXX: Int = 41

即最后一个空字段被拆分忽略。 除了用"| |"替换所有"||"之外,还有其他解决方案吗

预期的输出是Int = 41

确实在真实文件中我可能有如下几行:

"|||||||000001|09/01/2014|V|174500,00|22||BD |2540|LEC|1000|BEB|
       01|53||AE|111 ||49|94,22|6||||||||2|2|App|80|2|||150"

这是包含数字的第 42 列。 (在这种情况下,结果是Int = 42

每一行都有相同数量的|,但根据列的内容,split('|').length 返回不同的结果! (31, 40, ...,42)。

我可以理解最后一个分隔符后面缺少列,但不能理解前面的缺少。

【问题讨论】:

  • 你能更准确一点吗?期望的输出是什么?
  • 你只忽略末尾的空字符串还是整个字符串?
  • @NirHedvat 我编辑了我的问题
  • 也许您正在寻找st1.count(_ == '|')

标签: scala


【解决方案1】:

这个问题来自 Java(因为这是定义 String#split 的地方)。 如您所见here,在默认情况下(即limit=0),尾随的空字符串被丢弃。

要使其按预期工作,您可以使用str.split('|', -1)

【讨论】:

  • 好的,但在这种情况下,'|' 失败。必须使用str.split("""\|""", -1)
猜你喜欢
  • 2016-06-12
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
  • 2014-09-11
  • 2021-10-25
  • 2017-09-25
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多