【问题标题】:Convert List[String] to List[(String,String)] by splitting on delimiter [duplicate]通过分隔符将 List[String] 转换为 List[(String,String)] [重复]
【发布时间】:2020-04-29 08:03:53
【问题描述】:

我正在尝试在方法上从 CSV 中拆分字符串。有两个值,用一个逗号分隔。

我使用映射创建一个新的List[(String, String)],但是当我拆分时,它返回一个Array。如果我在split(",") 之后立即使用.toList,那么它将它们重新连接在一起,返回一个List(String),这使得拆分过时,如果我在地图之外使用.toList,那么它返回List[Array(String)]

当我使用splitAt(2) 时,它会返回正确的数据类型,但不会以逗号分隔。有没有办法让split函数分成两个Lists而不是Array

编辑:代码:

val getlines = some csv...

val splitList = getlines.map(_.split(",").toList) // returns List[List(String)]
val splitList = getlines.map(_.split(",")).toList // returns List[Array(String)]
val splitList = getlines.map(_.split(",")) // returns List[Array(String)]

【问题讨论】:

  • 不是很清楚,tbh...您可以尝试改写并添加示例以便我们可以帮助您吗?
  • 请显示导致问题的代码,以便我们更好地了解您的实际操作。
  • 改变了伙计们
  • 尝试使用 flatMap

标签: list scala split pattern-matching


【解决方案1】:

基于Convert a Scala list to a tuple?,假设你有List[String]这样

val lines =
  List(
    "a1,a2",
    "b1,b2",
    "c1,c3"
  )

然后

lines.map(_.split(",") match { case Array(a, b) => (a, b) })

输出

res1: List[(String, String)] = List((a1,a2), (b1,b2), (c1,c3))

但是,如果您有坏行,例如 "a1,",这可能会在运行时失败,在这种情况下,请考虑将其包装在 Try 中,或者像这样过滤掉坏行

lines.flatMap(_.split(",") match {
  case Array(a, b) => Some((a, b))
  case _ => None
})

【讨论】:

  • 这确实让方法在返回类型上被接受,但在检查新列表的大小时它返回“0”。我认为它会过滤掉所有内容
  • 我玩了一些,我修好了!非常感谢,我已经坚持了三天。
【解决方案2】:

假设你有一个带逗号的字符串:

scala> val csvLine = "something,another"
csvLine: String = something,another

scala> csvLine.split(",")
res3: Array[String] = Array(something, another)

scala> res3.toList
res4: List[String] = List(something, another)

这按预期工作

如果您确实有行列表,请使用 flatMap:

scala> val csv = List("line1,column2", "line2,column2")
csv: List[String] = List(line1,column2, line2,column2)

scala> csv.flatMap(line => line.split(","))
res5: List[String] = List(line1, column2, line2, column2)

【讨论】:

  • 感谢您的回复,但如果它不在 repo 中的多行上,它不会是 List[Array(String)] 吗?我正在尝试将其作为一个函数来执行,但它没有给我这个输出
  • @RonnieLightweightbabyColeman 您没有在问题中提及回购或多行。请改进问题并添加一些代码,以便我们了解实际问题。
  • 如果您有多行,请尝试使用 flatMap。我更新了我的答案
  • 不幸的是,这会为我返回 List[String]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多