2013-03-01 87 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"