2013-03-01 35 views
-1

我只是想将这个文本文件分割成几行并对这些行进行分类。如果行以“Qty”开头,那么下一行是订单项,直到行以“GST”开始。如何为此文本文件编写简单的pegjs语法?

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

 
Business me . ' l 
Address "rwqagePnnter Pro DemcRafifilp 
Address "mfgr Eva|uat|on Only 
Contact line 1 
Transaction Number 10006 
Issue Date 27/02/201 
Time 10:36:55 
Salesperson orsa orsa 
Qty Description Unit Price Total 
1 test $120.00 $120.00 
GST $10.91 
Total Amount $120.00 
Cash $120.00 
Please contact us for more information about 
this receipt. 
Thank you for your business. 
d 
. 
test 

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

+0

像这样的混乱的语法看起来很难,但简单地用简单的正则表达式逐行检查似乎很容易。 – Pointy 2013-03-01 15:02:36

+0

我只想要文本数组中的行,并且每行都按其分类分组。只有2个分类。 – Phil 2013-03-01 15:04:07

回答

4

这里有一个快速和肮脏的样品溶液

{ 
    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(''); 
    } 
+0

我不确定哪一个更好,因为这个我可以阅读并且更容易理解,这是我工作后的唯一基础。谢谢! – Phil 2013-03-06 04:57:21

0

你可以使用XML,或者你可以做一个“/”结尾,然后使用分割功能他们的分裂它的每一行。

mytext = mytext.split("/"); 

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

+0

我认为数据格式很可能不是可以修改的东西。 – Pointy 2013-03-01 15:39:19

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"