【发布时间】:2019-09-16 15:05:00
【问题描述】:
我有一个 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 时,一次全部传递...
- 当前迭代的字符
- 你正在建设的线路
- 以及已创建的行列表
也许编写一个自己的 getLines 尾递归版本是可行的,但我不确定是否有更实用的解决方案,而不是逐个字符地处理它。
您是否看到任何其他函数式解决此问题的方法?
坦克和问候, 费利克斯
【问题讨论】:
标签: scala csv line-breaks