我正在尝试使用Scala解析器组合器编写CSV解析器.语法基于RFC4180.我想出了以下代码.它几乎可以工作,但我不能让它正确地分隔不同的记录.我错过了什么?
object CSV extends RegexParsers {
def COMMA = ","
def DQUOTE = "\""
def DQUOTE2 = "\"\"" ^^ { case _ => "\"" }
def CR = "\r"
def LF = "\n"
def CRLF = "\r\n"
def TXT = "[^\",\r\n]".r
def file: Parser[List[List[String]]] = ((record~((CRLF~>record)*))<~(CRLF?)) ^^ {
case r~rs => r::rs
}
def record: Parser[List[String]] = (field~((COMMA~>field)*)) ^^ {
case f~fs => f::fs
}
def field: Parser[String] = escaped|nonescaped
def escaped: Parser[String] = (DQUOTE~>((TXT|COMMA|CR|LF|DQUOTE2)*)<~DQUOTE) ^^ { case …Run Code Online (Sandbox Code Playgroud) 我刚刚收到了一堆CSV(逗号分隔值)格式的杂乱数据文件.我需要对数据集进行一些正常的清理,验证和过滤工作.我将在Scala(2.11.7)中进行清理.
在我寻找两个方向的解决方案,输入解析和输出组合时,我发现大多数不明智的切线,包括来自" Scala Cookbook "的切线,在输入解析方面.而且大多数人专注于非常错误的解决方案"使用String.split(",")"以获得CSV线作为List[String].我在作曲输出方面几乎找不到任何东西.
什么样的漂亮的简单的Scala代码片段存在这很容易做到上述CSV往返? 我想避免导入整个库只是为了获取这两个函数(目前我的业务需求使用Java库不是一个可接受的选项).