Python从安装到开发一个EDI 850文件解析程序
Pathon是一门简洁高效的语言,尤其在数据分析处理方面,下面我们就来体验一下。
我们从安装Python环境开始,并实际做一个实用的程序。
不是“Hello, World”哦,而是定期扫描一个目录下的EDI 850(PO)文本文件,
将需要的信息解析成字段Insert到Oracle表中。
首先准备开发及运行环境
一、下载Python安装文件
下载地址:https://www.python.org/downloads/
选择适合自己的版本,如果没有特别考虑,一般选最新的版本。
我选的是Windows 32bit Python 3.6.4。
二、安装Python
直接点击安装文件即可,在弹出的第一个选择界面,注意最后一个选项:
Add Python 3.6 to PATH 要勾上,不然安装完后要手工加Python执行路径到PATH环境变量中。
选择完,点Install now按钮即可。
三、检查安装是否成功
在CMD命令窗口下面,输入python,回车,正常会看到Python版本信息,并停留在>>>提示符下面,
在>>>后面输入 print("Hello, World"),系统回应"Hello, World"即表示安装成功了。
四、安装扩展库
Python最强大的地方在于有很多非常优秀的扩展库(目前已经有300多个),今天我们目标是将文本文件解析保存到Oracle数据库,所以需要安装如下两个。
1. cx_Oracle
cx_Oracle (注意大小写敏感)是Python用来连接Oracle DB,并执行SQL指令的,
在CMD窗口执行上面指令即可
python -m pip install cx_Oracle
安装好,是下面这样一个页面
2. redis
redis是一个键值数据库,简单的set, get 两条指令用来快速保存和读取数据,本次我们用来保存文件名,确保文件不重复读取,
在CMD窗口执行上面指令来安装
python -m pip install redis
安装成功是如下界面
下面正式进入开发
我们再来明确一下需求,
程序需要定期扫描一个文件夹下面的所有文件,将所需要的信息解析并保存到Oracle DB Table中。
我们需要扫描的文件存放位置为 "Z:\",需要扫描的是EDI 850文件,EDI 850是Ansi 标准的PO文件,
我们需要将PO的信息解析出来保存到Oracle Table: secom_silabs_850_po_rows 中。
edi 850文件内容如下:
ISA*00* *00* *ZZ*SECOMHK *01*165635394PRD *171219*1615*U*00401*000000081*0*P*+
GS*PO*SECOMHK*165635394PRD *20171219*1615*0000081*X*004010
ST*850*0000081
BEG*00*SA*42591*0*20171219
CUR*BY*USD
PER*BD****EM*@sekorm.com
FOB*DF*OR**01*FCA
ITD*05*3**********
PO1*1*200*EA*19.8600*PE*VP*530BC156M250DG
SCH*200*EA***010*20180201
DTM*002*20180201
PO1*2*100*EA*330.4600*PE*VP*533BC000753DG
SCH*100*EA***010*20180201
DTM*002*20180201
PO1*3*5000*EA*11.4400*PE*VP*SI1141-A11-GMR
SCH*5000*EA***010*20180308
DTM*002*20180308
文件中每行不同字段用“*”分隔,PO号码存放在以“BEG”开始行的第四个字段,
物料、单价、数量存放在以“PO1”开始的行中,PO需求日期存放在以“DTM”开始的行中。
我们直接用Python自带的IDLE来程序,具体源代码如下:
#------------------------------------------------------------------------------
# Process 850.py
# Scan Silabs 850 edi send history directory,
# save to file content to table secom_silabs_850_file, secom_silabs_850_rows
# Cory_Liu 2017/12/28
# EDI 850 columns mapping
##############################################
# BEG row[3] v_po_no
# BEG row[5] v_po_order_date(yyyymmdd)
# PO1 row[1] v_po_line
# PO1 row[2] v_qty
# PO1 row[4] v_price
# PO1 row[7] v_part_number
# SCH row[6] v_need_by_date(yyyymmdd)
# DTM end a line
##############################################
import os
import cx_Oracle
import redis
import glob
prod_partner_id = "165635394PRD "
connection = cx_Oracle.connect("user","password","erpprod")
cursor = connection.cursor()
####Connect to Redis Server to save file name
r = redis.Redis(host='1.1.0.199',port=6379,db=2,charset="utf-8", decode_responses=True)
edi_files = "Z:\\122*.txt"
# Read file by rows
for file_full_name in glob.glob(edi_files):
file_name = os.path.basename(file_full_name)
### Check file_name read or not
f_read = r.get(file_name)
if f_read == "1":
print(file_name,"have already been read")
else:
r.set(file_name,"1")
print("Begin read:",file_name)
### Insert rows
file = open(file_full_name)
line_num = 0
new_line_start = 0
for line_str in file:
line_num = line_num + 1
sql = "insert into secom_silabs_850_file(file_name,creation_date,line_str,line) values ('%s',sysdate,'%s',%d)" % (file_name,line_str,line_num)
cursor.execute(sql)
row = line_str.strip('\n').split('*')
if row[0] == "ST":
if row[1] != "850":
break
if row[0] == "GS":
if row[3] != prod_partner_id:
break
if row[0] == "BEG":
v_po_no = row[3]
v_order_date = row[5]
elif row[0] == "PO1":
v_po_line = row[1]
v_qty = row[2]
v_price = row[4]
v_part_number = row[7]
elif row[0] == "SCH":
v_need_by_date = row[6]
elif row[0] == "DTM":
new_line_start = 1
if new_line_start == 1:
new_line_start = 0
sql = "insert into secom_silabs_850_rows(file_name,creation_date,po_no,po_line,part_number,qty,price,need_by_date,order_date) \
values ('%s',sysdate,'%s',%s,'%s',%s,%s,to_date('%s','yyyymmdd'),to_date('%s','yyyymmdd'))" \
% (file_name,v_po_no,v_po_line,v_part_number,v_qty,v_price,v_need_by_date,v_order_date)
cursor.execute(sql)
print(sql)
cursor.close
按F5执行,测试没有问题后,将这个文件制作成一个可执行的bat文件,排定期任务执行即可。
Bat文件源代码
python "F:\Source Code\python\Process 850.py"
pause
是不是很简单?那赶紧学起来吧。