SCALA中的空值,表示字符串数组 - ArrayIndexOutOfBoundsException

时间:2018-01-20 16:56:57

标签: scala indexoutofboundsexception

我有一个String数组,如下所示:

res17: Array[String] = Array(header - skip me, blk1|X|||||, a|b|c||||, d|e|f||||, x|y|z||||, blk2|X|||||, h|h|h|h|h|h|h, j|j|j|j|j|j|j, k|k|k|k|k|k|k, m|m|m|m|m|m|m, blk3|X|||||, 7|7|||||)

这是由SCALA程序获得的,而不是SPARK与SCALA:

for (line <- Source.fromFile(filename).getLines().drop(1).toVector) {
   val values = line.split("\\|").map(_.trim)
...

当我表演时:

...
   println(values(0), values(1), values(2))  // giving an error on 2 or indeed 1, if a null is found.
}

即。如果管道之间没有任何东西,它就会失败。

getOrElse无效,如何在检索或保存时替换“空值”?从文档中看不到。它一定很简单!

注意我只使用SCALA,而不是SPARK / SCALA。

提前致谢

1 个答案:

答案 0 :(得分:1)

嗯,这不是我遇到的行为。这是一个截图,我可能会做一些不同的事情:

enter image description here

无论如何,如果你想摆脱你的空值,你可以运行如下所示的过滤器:

val values = s.split("\\|").map(_.trim).filterNot(_.isEmpty)

如果你不想摆脱,但你可以运行其他东西:

val values = s.split("\\|").map{x => val trimmed = x.trim; if (trimmed.isEmpty) None else Some(trimmed)}

修改

val values = s.split("\\|").map{x => if (x == null) "" else x.trim}

编辑(再次):

我终于可以重现它,抱歉给我带来不便,我很想念一些东西。问题是split函数,它默认删除空值。您应该将第二个参数传递给split函数,如API

中所述
val values = line.split("\\|", -1).map(_.trim)