【问题标题】:How can I write a simple pegjs grammar for this text file?如何为这个文本文件编写一个简单的 pegjs 语法?
【发布时间】:2014-01-17 01:31:25
【问题描述】:

我只想将此文本文件分割成行并将行分类。如果该行以“Qty”开头,则下一行是订单商品,直到该行以“GST”开头。

如果该行以“总金额”开头,那么这是总金额行。

给我做生意。 'l 地址“rwqagePnnter Pro DemcRafilp 地址“mfgr Eva|uat|on Only 联络线 1 交易编号 10006 发行日期 27/02/201 时间 10:36:55 销售员 orsa orsa 数量 描述 单价 合计 1 次测试 $120.00 $120.00 消费税 $10.91 总金额 $120.00 现金 $120.00 请联系我们以获取更多关于 这张收据。 感谢您的业务。 d . 测试

请告诉我如何使用 PegJS http://pegjs.majda.cz/

【问题讨论】:

  • 这样一团糟的语法似乎很难,但用简单的正则表达式逐行检查似乎很容易。
  • 我只想要文本数组中的行,并且每行都按其分类分组。只有 2 个分类。

标签: javascript parsing peg pegjs


【解决方案1】:

这是一个快速而肮脏的示例解决方案

{
  var in_quantity = false // Track whether or not we are in a quantity block
  var quantity    = []
  var gst         = null
  var total       = null
}

start =
  // look for a quantity, then GST, then a total and finally anything else
  (quantity / gst / total / line)+
  {
    return {quantity: quantity, gst: gst, total: total}
  }

chr = [^\n]
eol = "\n"?

quantity   = "Qty" chr+ eol        { in_quantity = true; }
gst        = "GST" g:chr+ eol      { in_quantity = false; gst = g.join('').trim(); }
total      = "Total Amount" t:line { in_quantity = false; total = t.trim(); }

line =
  a:chr+ eol
  {
    if( in_quantity ){
      // break quantities into columns based on tabs
      quantity.push( a.join('').split(/[\t]/) );
    }
    return a.join('');
  }

【讨论】:

  • 我不确定哪个更好,对于这个我可以更轻松地阅读和理解它,这是我唯一的基础,因为它们都可以工作。谢谢!
【解决方案2】:

下面的代码作为另一种解决方案怎么样。

{
  var result = [];
}

start
  = (!QTY AnyLine /
      set:(Quantities TotalAmount)
        {result.push({orders:set[0], total:set[1]})}
    )+ (Chr+)?
  {return result;}

QTY = "Qty"
GST = "GST"

Quantities
  = QtyLine order:(OrderLine*) GSTLine {return order;}

QtyLine
  = QTY Chr* _

OrderLine
  = !GST ch:(Chr+) _ {return ch.join('');}

GSTLine
  = GST Chr* _

TotalAmount
  = "Total Amount" total:(Chr*) _ {return total.join('');}

AnyLine
  = ch:(Chr*) _ {return ch.join('');}

Chr
  = [^\n]
_
  = "\n"

【讨论】:

    【解决方案3】:

    您可以使用 XML,也可以使用“/”结尾的每一行,然后使用 split 函数将其拆分。

    mytext = mytext.split("/");
    

    然后使用它。我不知道你为什么不只使用 sql 或类似的东西。

    【讨论】:

    • 我觉得很有可能是数据格式不是可以修改的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多