【问题标题】:Scala: Convert a csv string to ArrayScala:将 csv 字符串转换为数组
【发布时间】:2023-03-18 20:52:01
【问题描述】:

我尝试通过将 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 的新手。帮助!

【问题讨论】:

    标签: arrays string scala split scala-collections


    【解决方案1】:

    将 split 与 -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)
    

    如果这次我们指定限制

    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 的文档。

    【讨论】:

    • 谢谢@marios。你能解释一下,第二个参数是做什么的吗?
    【解决方案2】:

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

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

    是完全正确的 CSV 文件

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

    【讨论】:

      猜你喜欢
      • 2013-05-05
      • 1970-01-01
      • 2013-04-27
      • 2018-06-08
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2018-03-29
      相关资源
      最近更新 更多