I'm using parsimonious
to parse some csv
. My problem is that the output generated is not coming out in the order expected. For example, if the input string is
Load,File,Sample
then I'd expect to get:
import database from Sample
What I get instead is:
from Sample import database
This is a consistent problem for every input I try: the first token is the last item in the entry OrderedDict but I can't figure out why.
Here's my code:
from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
from collections import OrderedDict
class EntryParser(NodeVisitor):
def __init__(self, grammar, text):
self.entry = OrderedDict()
ast = Grammar(grammar).parse(text)
self.visit(ast)
def visit_alt(self, n, vc):
self.entry['alt'] = "alter "
def visit_load(self, n, vc):
self.entry['load'] = "import database "
def visit_app(self, n, vc):
self.entry['app'] = "application "
def visit_db(self, n, vc):
self.entry['db'] = "database "
def visit_filter(self, n, vc):
self.entry['filter'] = "filter "
def visit_group(self, n, vc):
self.entry['group'] = "group "
def visit_obj(self, n, vc):
self.entry['obj'] = "object "
def visit_trigger(self, n, vc):
self.entry['trigger'] = "trigger "
def visit_user(self, n, vc):
self.entry['user'] = "user "
def visit_sql(self, n, vc):
self.entry['sql'] = "connect as "
def visit_file(self, n, vc):
self.entry['file'] = "from "
def visit_dbname(self, n, vc):
self.entry['dbname'] = n.text + " "
def generic_visit(self, n, vc):
pass
grammar = """\
ts0 = alt / load
sep = ","
alt = "Alt" sep altdomain
altdomain = app / db / filter / group / obj / trigger / user
load = "Load" sep loaddomain
loaddomain = (sql / file) sep dbname
sql = "SQL"
file = "File"
app = "App"
db = "DB"
filter = "Filter"
group = "Group"
obj = "Object"
trigger = "Trigger"
user = "User"
dbname = ~"[A-z]+"
"""
text = """\
Alt,Filter
Alt,App
Alt,DB
Alt,Group,
Alt,Object
Alt,Trigger
Alt,User
Load,SQL,Sample
Load,File,Sample
"""
for line in text.splitlines():
for v in EntryParser(grammar, line).entry.values():
print(v, end="")
print('\n')