# coding:utf8import sysimport redef select(staff, field):
cmd = input(
"cmd>"
).strip()
cmd = cmd.replace(
'FROM'
,
'from'
)
cmd = cmd.replace(
'WHERE'
,
'where'
)
if
'*'
in cmd:
for
i in field.keys():
sys.stdout.write(str(i) +
' '
)
print
(
''
)
for
line in staff:
info_list = re.split(r
',+'
, line.strip(
'\n'
))
cmd_list = re.split(r
'[ ,;]+'
, cmd)
f_index = cmd_list.index(
'from'
)
search_field = cmd_list[1:f_index]
from_field = cmd_list[f_index + 1]
if
from_field !=
'staff_table'
:
print
(
'\033[31;1mplease select `staff_table`...\033[0m'
)breakif
'where'
not in cmd_list:# 不存在where条件,显示所有view_list = []
for
i in range(len(search_field)):
if
search_field[i] ==
'*'
:
view_list = info_list[:]
else
:
view_list.append(info_list[field.get(search_field[i])])
else
:
print
(
','
.join(view_list))
else
:# 存在where条件w_index = cmd_list.index(
'where'
)
where_str =
''
.join(cmd_list[w_index + 1:])
if
re.search(r
'like'
, where_str):
sizeof =
'like'
where_list = re.split(r
'like'
, where_str)
else
:
sizeof = re.search(r'[=><]+', where_str).group()
where_list = re.split(r'[=><]+', where_str)
where_field = where_list[0]
value = where_list[1]
if
re.search(r'[\'\
"]+', value): # 带'和"
的表示字符,处理掉'和"value = value.replace('\"', '')
value = value.replace('\'', '')
else
:
value = float(value)#
print
(where_str, where_field, sizeof, value)# 条件判断 >, <, =, likeif sizeof == '>':
v = info_list[field.get(where_field)]
if
float(v) > value:
view_list = []
for
i in range(len(search_field)):
if
search_field[i] ==
'*'
:
view_list = info_list[:]
else
:
view_list.append(info_list[field.get(search_field[i])])
else
:
print
(
','
.join(view_list))elif sizeof == '<':
v = info_list[field.get(where_field)]
if
float(v) < value:
view_list = []
for
i in range(len(search_field)):
if
search_field[i] == '*':
view_list = info_list[:]
else
:
view_list.append(info_list[field.get(search_field[i])])
else
:
print
(','.join(view_list))elif sizeof == '=':
v = info_list[field.get(where_field)]
if
field.get(where_field) == 2:
v = float(v)
if
v == value:
view_list = []
for
i in range(len(search_field)):
if
search_field[i] == '*':
view_list = info_list[:]
else
:
view_list.append(info_list[field.get(search_field[i])])
else
:
print
(','.join(view_list))elif sizeof == 'like':
v = info_list[field.get(where_field)]
if
value in v:
view_list = []
for
i in range(len(search_field)):
if
search_field[i] == '*':
view_list = info_list[:]
else
:
view_list.append(info_list[field.get(search_field[i])])
else
:
print
(','.join(view_list))
else
:passdef add(staff):
staff.sort()
num = int(re.split(r',', staff[-1])[0]) + 1phone = input(
"phone:"
).strip()
for
line in staff:
if
phone == line[3]:
print
(
"already exists..."
)
return
Falseif not re.match(r'^\d+$', phone)
or
len(phone) < 7:
print
(
"format error..."
)
return
False
name = input(
"name:"
).strip()
age = input(
"age:"
).strip()
dept = input(
"dept:"
).strip()
enroll_date = input(
"enroll_date:"
).strip()
for
s in (name, age, dept, enroll_date):
if
not len(s):
print
(
"input is null..."
)
return
Falseelse:
staff.append('%s,%s,%s,%s,%s,%s\n' % (num, name, age, phone, dept, enroll_date))
return
staffdef update(staff, field):
cmd = input(
"cmd>"
).strip()
up_list = []
cmd = cmd.replace(
'SET'
,
'set'
)
cmd = cmd.replace(
'WHERE'
,
'where'
)
for
line in staff:
info_list = re.split(r
',+'
, line.strip(
'\n'
))
cmd_list = re.split(r
'[ ,;]+'
, cmd)
if
cmd_list[1] !=
'staff_table'
:
print
(
'\033[31;1mplease update `staff_table`...\033[0m'
)breakset_index = cmd_list.index(
'set'
)
where_index = cmd_list.index(
'where'
)
set_list = re.split(r
'='
,
''
.join(cmd_list[set_index + 1:where_index]))
set_field = set_list[0]
set_value = set_list[1]
if
re.search(r
'[\'\"]+'
, set_value):
set_value = set_value.replace(
'\''
,
''
)
set_value = set_value.replace(
'\"'
,
''
)
where_list = re.split(r
'='
,
''
.join(cmd_list[where_index + 1:]))
where_field = where_list[0]
where_value = where_list[1]
if
re.search(r
'[\'\"]+'
, where_value):
where_value = where_value.replace(
'\''
,
''
)
where_value = where_value.replace(
'\"'
,
''
)
if
info_list[field.get(where_field)] == where_value:
info_list[field.get(set_field)] = set_valueprint(
','
.join(info_list))
up_list.append(
','
.join(info_list))
else
:
return
up_listdef
delete
(staff):
del_id = input(
"delete id:"
).strip()
for
i in range(len(staff)):
if
re.split(r
','
, staff[i])[0] == del_id:
staff.pop(i)
print
(
"id:%s delete success."
% del_id)
return
staffelse:
return
Falsedef main():
staff_table =
'staff_table.txt'
field = {
'staff_id'
: 0,
'name'
: 1,
'age'
: 2,
'phone'
: 3,
'dept'
: 4,
'enroll_date'
: 5}
menu =
''
'\033[33;1m-- staff_table --\033[0m\033[29;1m
S. 查询 h. 帮助
A. 新增 q. 退出
E. 修改
D. 删除\033[0m
''
'
print
(menu)
while
True:
try
:
with open(staff_table,
'r'
)
as
f:
staff = f.readlines()
choice = input(
">>"
).strip().lower()
if
choice ==
'h'
: # helpprint(menu)elif choice ==
'q'
:breakelif choice ==
's'
: # search select(staff, field)elif choice ==
'a'
: # addresult = add(staff)
if
not result:
print
(
'\033[31;1madd failed...\033[0m'
)continueelse:
with open(staff_table,
'w'
)
as
f:
f.writelines(result)elif choice ==
'e'
: # updateresult = update(staff, field)
if
not result:
print
(
'\033[31;1mupdate failed...\033[0m'
)continueelse:
with open(staff_table,
'w'
)
as
f:
for
line in result:
f.write(line +
'\n'
)elif choice ==
'd'
: # deleteresult =
delete
(staff)
if
not result:
print
(
'\033[31;1mdelete failed...\033[0m'
)continueelse:
with open(staff_table,
'w'
)
as
f:
f.writelines(result)
else
:continueexcept:
print
(
"\033[31;1minput error...\033[0m"
)continueif __name__ ==
'__main__'
:
main()