Scala:将 csv 字符串转换为数组

Scala: Convert a csv string to Array

我试图通过按 , 分割将 scala 字符串转换为数组。例如:

var string = "a,b,c,d,"
array =  string.split(",")
arr: Array[String] = Array(a, b, c, d)

但我得到的输出是 Array(a, b, c, d),而不是 Array(a, b, c, d, )。 split 方法忽略字符串中的最后一个逗号。还有其他方法可以解决这个问题吗?我认为这是微不足道的,但我是 scala 的新手。帮助!

使用带有 -1 参数的拆分。

string.split(",",-1)

要理解-1参数的含义,让我们看一下方法签名

public String[] split(String regex, int limit)

limit 参数控制应用模式的次数,因此会影响结果数组的长度。如果限制 n 大于零,则模式将最多应用 (n - 1) 次,数组的长度将不大于 n,并且数组的最后一个条目将包含超出最后一个匹配定界符的所有输入。

如果 n 为非正数,则该模式将被应用尽可能多的次数并且数组可以具有任意长度。如果 n 为零,那么该模式将被应用尽可能多的次数,数组可以有任何长度,并且尾随的空字符串将被丢弃。

示例:

scala> val myString = "a,b,c,d,,," 
scala> val stringSplit = myString.split(",")
scala> arr: Array[String] = Array(a, b, c, d)

如果这次我们指定limit

scala> val myString = "a,b,c,d,,," 
scala> val stringSplitWithLimit = myString.split(",", -1)
scala> arr: Array[String] = Array(a, b, c, d, "", "", "")

此行为来自 Java(因为 Scala 使用 Java 字符串)。 Here 是直接来自 Javadoc 的文档。

在一般情况下,csv 不仅仅是一个带逗号的字符串列表。例如:

 1,2,"3aa,bbb 
    cc\"c", 4
 5,6,7,8

是完全正确的 CSV 文件

所以最好使用一些外部解析器,比如这个:https://github.com/tototoshi/scala-csv