首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用parboiled2解析多行而不是字符串

使用parboiled2解析多行而不是字符串
EN

Stack Overflow用户
提问于 2015-01-11 16:21:56
回答 2查看 953关注 0票数 2

我想使用parboiled2来解析多个CSV行,而不是单个CSV字符串。其结果可能是:

代码语言:javascript
复制
val parser = new CSVRecordParser(fieldSeparator)
io.Source.fromFile("my-file").getLines().map(line => parser.record.run(line))

其中CSVRecordParser是我的CSV记录的解析器。我遇到的问题是,对于我已经尝试过的内容,我不能这样做,因为煮熟的解析器需要构造函数中的输入,而不是run方法中的输入。因此,我可以为每一行创建一个新的解析器,这不是很好,也可以找到一种方法将输入传递给解析器,以处理我拥有的每个输入。我试图通过将输入设置为变量并将解析器包装在另一个对象中,对解析器进行了一些黑客攻击。

代码语言:javascript
复制
object CSVRecordParser {

  private object CSVRecordParserWrapper extends Parser with StringBuilding {

    val textBase = CharPredicate.Printable -- '"'
    val qTextData = textBase ++ "\r\n"

    var input: ParserInput = _
    var fieldDelimiter: Char = _

    def record = rule { zeroOrMore(field).separatedBy(fieldDelimiter) ~> (Seq[String] _) }
    def field = rule { quotedField | unquotedField }
    def quotedField = rule {
      '"' ~ clearSB() ~ zeroOrMore((qTextData | '"' ~ '"') ~ appendSB()) ~ '"' ~ ows ~ push(sb.toString)
    }
    def unquotedField = rule { capture(zeroOrMore(textData)) }
    def textData = textBase -- fieldDelimiter

    def ows = rule { zeroOrMore(' ') }
  }

  def parse(input: ParserInput, fieldDelimiter: Char): Result[Seq[String]] = {
    CSVRecordParserWrapper.input = input
    CSVRecordParserWrapper.fieldDelimiter = fieldDelimiter
    wrapTry(CSVRecordParserWrapper.record.run())
  }
}

然后,当我想解析一行时,只需调用CSVRecordParser.parse(input, separator)。除了这是可怕的事实,它不工作,我经常有奇怪的错误与以前使用的分析器。我知道这不是我应该用parboiled2编写解析器的方式,我想知道用这个库实现我想要做的事情的最好方法是什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-16 15:08:39

在一个需要高速度和低资源的项目中,我已经对超过100万条记录的CSV文件这样做了,我发现为每一行实例化一个新的解析器是很好的。

在注意到parboiled2自述文件提到解析器的重量非常轻之后,我尝试了这种方法。

我甚至不需要从它们的默认值中增加JVM内存或堆限制。每一行的解析器实例化工作得很好。

票数 1
EN

Stack Overflow用户

发布于 2016-10-20 19:59:26

为什么不在解析器中添加记录规则的结尾。

代码语言:javascript
复制
def EOR = rule { "\r\n" | "\n" }

def record = rule { zeroOrMore(field).separatedBy(fieldDelimiter) ~ EOR ~> (Seq[String] _) }

然后你可以通过多少行你想。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27889298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档