在使用Scala解析的csv文件中处理额外的换行符?

在使用Scala解析的csv文件中处理额外的换行符?,scala,csv,Scala,Csv,我对Scala完全陌生,正在尝试解析一个CSV文件,该文件在某些单元格(即双引号内)中包含回车符/换行符/和其他特殊字符,如逗号,例如: "A","B","C\n,FF\n","D"\n "Q","W","E","R\n\n"\n "1","2\n","2","2,2\n"\n val converted = Source.fromFile(sourceFileName).mkString.replaceAll("\n", "").replaceAll("\"\"", "\"\n\"") 我

我对Scala完全陌生,正在尝试解析一个CSV文件,该文件在某些单元格(即双引号内)中包含回车符/换行符/和其他特殊字符,如逗号,例如:

"A","B","C\n,FF\n","D"\n
"Q","W","E","R\n\n"\n
"1","2\n","2","2,2\n"\n
val converted = Source.fromFile(sourceFileName).mkString.replaceAll("\n", "").replaceAll("\"\"", "\"\n\"")
我想将其加载到Scala中的列表类型列表中,如下所示:

List(List("A","B","C,FF","D"),List("Q","W","E","R"),List("1","2","2","2,2"))
有什么建议吗

我在其他语言中找到了一些解决相同问题的方法。例如,这是Python中的一个很好的例子,我非常理解:

我的尝试:

val src2 = Source.fromFile("sourceFileName.csv")
val it =src2.getLines()
val data = for (i<-it) yield i.replace("\"","").split(",")
val src2=Source.fromFile(“sourceFileName.csv”)
val it=src2.getLines()

ValdDAT= =(i

)最简单的方法是将空白行过滤出来并修剪额外的空白:

val src2 = Source.fromFile(sourceFileName)
val it = src2.getLines()
val data = for (i<-it if !i.trim.isEmpty) yield i.trim.replace("\"","").split(",")
val src2=Source.fromFile(sourceFileName)
val it=src2.getLines()

val数据=用于(i在我看来,如果实际单元格包含换行符,那么在遍历
getLines
时需要保持一些状态。可以使用
foldLeft
或类似的操作符来实现这一点。如果文件足够小,还可以使用
mkString
将整个文件作为字符串存储在内存中,然后对其进行操作。Th以下简化版本假定每个单元格都用引号括起来。例如:

"A","B","C\n,FF\n","D"\n
"Q","W","E","R\n\n"\n
"1","2\n","2","2,2\n"\n
val converted = Source.fromFile(sourceFileName).mkString.replaceAll("\n", "").replaceAll("\"\"", "\"\n\"")
首先,我们删除所有新行。然后,真正的新行将显示为一行中的两个引号(因为否则引号之间会有一个逗号分隔),因此我们在引号之间添加新行。然后我们应该有一个文件的规范化版本,我们可以通过简单的操作进行处理:

converted.split("\n").map(_.split(",").map(_.replaceAll("\"", "")))

我找到了一个解决方案。它与Ben Reich的解决方案类似,但考虑了双引号中的任何其他特殊字符:

Source.fromFile(sourceFileName).mkString.split("\"\n\"").map(_.split("\",\""))

只有其中一些是空的(有两个或更多'\n'的)。这并不能解决问题。字符串中是否有新行,或者它们是否包含字符串文字“\n”(反斜杠后跟'n')?它应该是'\n'或'\r'(或其他一些新行字符,如ctrl M),但我可以看到的是src2.getLines()返回换行符(换行符为换行符的单元格)@BenReich:它们包含换行符。我想,我应该进行某种正则表达式分析,只删除双引号内的\n。例如,您的解决方案不适用于我在问题语句中给出的示例csv文件。模式为“\”*\\n.*”.r,但我不知道如何才能删除\n并保持模式的其余部分不变。我认为应该先找到它们,然后在原始文本中重复它们。但这看起来像是一个非常“非”-函数式方法。我正在尝试找到更好的解决方案。我不明白对于提供的示例,这怎么不起作用。如果我复制该文件(并在文件中有“\n”时使用换行符),然后这种方法对我有效。你得到了什么结果?如果你澄清文件的内容可能会有所帮助,因为根据我对文件内容的理解,它与这种方法有效。你是对的,它适用于我提供的示例,但我没有看到的一件事是,不仅单元格包含行中断,但也包含逗号。我提出了一个与您的解决方案非常相似的解决方案,现在效果很好。谢谢您的帮助。@Alt很高兴我能提供帮助。我不明白您为什么选中了另一个答案,您在评论中写的答案并不能解决您的问题。我还想知道您的新答案是否与我的答案有足够大的不同列出自己的答案(与这里的评论相反),特别是考虑到你的问题,你的答案中没有添加额外的细节,但当然这取决于你的判断。