-1

我只想将此文本文件分割成行并对行进行分类。如果该行以“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/

4

3 回答 3

6

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

{
  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('');
  }
于 2013-03-01T20:05:53.250 回答
3

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

{
  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"
于 2013-03-01T21:35:46.473 回答
0

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

mytext = mytext.split("/");

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

于 2013-03-01T15:08:40.313 回答