scala split 在为空时忽略最后一个值

标签 scala

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

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

最佳答案

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

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

关于scala split 在为空时忽略最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56564447/

相关文章:

scala - 游戏中的 mock !和斯卡拉

scala - 我如何混合打字和非打字 Actor ?

json - 根据其他字段指定的类型读取 JSON 字段

function - 带有 =(等号)的 Scala 方法

scala - 无法通过 Elasticsearch-hadoop 库在多个 spark 节点上的 RDD 上应用映射

scala - 同时在多台(集群)机器上运行 SBT (Scala)

api - Scala 标准库类型的摘要/引用文档

scala - 为什么我会在 scala 比赛中遇到不可能的情况?

scala - Scala 单例对象中值的 Java 序列化

scala:指定柯里化(Currying)的方法类型