2013-03-01 2 views
-1

Я просто хочу сегментировать этот текстовый файл в строках и классифицировать строки. Если строка начинается с «Qty», то следующие строки - это элементы порядка, пока линия не начнет с «GST».Как я могу написать простую грамматику pegjs для этого текстового файла?

Если линия начинается с «Total Amount», тогда это общая сумма.

 
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

+0

Мне нужны строки только в массиве текста, и каждая строка сгруппирована по его классификации. Есть только 2 классификации. – Phil

ответ

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

0

Вы можете использовать XML, или вы могли бы сделать каждую строку, заканчивающуюся символом «/», а затем разделив его на них, используя функцию разделения.

mytext = mytext.split("/"); 

И затем работать с этим. Я не знаю, почему вы бы просто не использовали sql или что-то подобное.

+0

Я думаю, что очень вероятно, что формат данных не является чем-то, что можно изменить. – Pointy

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"