gpt4 book ai didi

scala - 在 Scala 中读取包含多行字符串的 CSV 文件

转载 作者:行者123 更新时间:2023-12-04 05:41:34 25 4
gpt4 key购买 nike

我有一个 csv 文件,我想逐行读取它。问题是某些单元格值在包含换行符的引号中。

这是一个 CSV 示例:

Product,Description,Price
Product A,This is Product A,20
Product B,"This is much better
than Product A",200

标准的 getLines() 函数不处理这个问题。

Source.fromFile(inputFile).getLines()  // will split at every line break, regardless if quoted or not

getLines 得到类似的东西:

Array("Product", "Description", "Price")
Array("Product A", "this is Product A", "20")
Array("Product A", "\"This is much better")
Array("than Product A\"", "20")

但它应该是这样的:

Array("Product", "Description", "Price")
Array("Product A", "this is Product A", "20")
Array("Product A", "\"This is much better\nthan Product A\"", "20")

我尝试用它来完整读取文件,并使用类似于这篇文章 https://stackoverflow.com/a/31193505 的正则表达式进行拆分。

file.mkString.split("""\n(?=(?:[^"]*"[^"]*")*[^"]*$)""")

正则表达式工作正常,但我收到堆栈溢出异常,因为文件太大无法完全处理内存不足。我用较小版本的文件进行了尝试,结果成功了。

如帖子中所述,foldLeft() 可以帮助处理更大的文件。但我不确定它应该如何工作,当遍历字符串的每个 Char 时,一次传递所有......

  1. 当前迭代的 Char
  2. 你正在 build 的线路
  3. 和已创建行的列表

也许可以编写自己的 getLines 尾递归版本,但我不确定是否没有更实用的解决方案而不是逐个字符地处理它。

你看到这个问题的任何其他函数式解决方案吗?

坦克和问候,菲利克斯

最佳答案

最简单的答案是找到一个外部库来完成它!

如果它不是您的解决方案,foldLeft 解决方案是我认为最好的功能样式!这是一个简单的版本:

  val lines = Source.fromFile(inputFile).getLines()

lines.foldLeft[(Seq[String], String)](Nil, "") {
case ((accumulatedLines, accumulatedString), newLine) => {
val isInAnOpenString = accumulatedString.nonEmpty
val lineHasOddQuotes = newLine.count(_ == '"') % 2 == 1
(isInAnOpenString, lineHasOddQuotes) match {
case (true, true) => (accumulatedLines :+ (accumulatedString + newLine)) -> ""
case (true, false) => accumulatedLines -> (accumulatedString + newLine)
case (false, true) => accumulatedLines -> newLine
case (false, false) => (accumulatedLines :+ newLine) -> ""
}
}
}._1

请注意,此版本不会处理太多特殊情况,例如在包含多行的一行上有多个值,但它应该会给您一个好的开始。

主要思想是对几乎所有你需要保留在内存中的东西进行 foldLeft,然后逐渐改变你的状态。

如您所见,在 foldLeft 内部,您可以根据需要拥有尽可能多的逻辑。在这种情况下,我添加了额外的 bool 值和一个嵌套匹配案例以提高可读性。

所以我的建议是:向左折叠,不要 panic !

关于scala - 在 Scala 中读取包含多行字符串的 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57959648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com