代码之家  ›  专栏  ›  技术社区  ›  Ged

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

  •  0
  • Ged  · 技术社区  · 7 年前

    我有一个字符串数组,如下所示:

    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程序获得的,而不是通过SCALA获得的SPARK:

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

    一、 e.如果管道|之间没有任何东西,则会发生故障。

    getOrElse没有帮助,在检索或保存时如何替换“null”?无法从文档中查看。这一定很简单!

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

    提前感谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   SCouto    7 年前

    嗯,这不是我所经历的行为。这是一个截图,我可能正在做一些不同的事情:

    enter image description here

    无论如何,如果要除去null,可以运行如下过滤器:

    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函数,如 API

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