python根据excel生成Hive ddl sql 和 MySQL 表语句

Excel:

中文表名称 企业基本信息
英文表名称 enterprise_base_info
备注说明        
接口单元文件命名 接口数据文件名      
校验文件名      
字段序号 逻辑名称 物理名称 字段类型 是否必填
1 企业名称 enterprise_name varchar(1000)  
2 营业执照类型 license_type varchar(20)
3 证照编号 license_no varchar(1000)  

 

 

 

 

 

 

 

 

 

 

生成的DDL:

hive :
CREATE TABLE IF NOT EXISTS enterprise_base_info(
enterprise_name                STRING    COMMENT'企业名称'
,license_type                  STRING    COMMENT'营业执照类型'
,license_no                    STRING    COMMENT'证照编号'

) 
 ROW FORMAT DELIMIETED 
 FIELDS TERMINATED BY '\t' 
 STORED AS TEXTFILE;

mysql :

CREATE TABLE IF NOT EXISTS td_yj_xx_enterprise_base_info_d(
id                             INT NOT NULL AUTO_INCREMENT   COMMENT'ID'
,license_type                  varchar(64)                        COMMENT'营业执照类型'
,license_no                    varchar(128)    NOT NULL           COMMENT'证照编号'
,industry                      varchar(256)                       COMMENT'所有行业'
,PRIMARY KEY (id) 
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='企业基本信息';

python代码:

   ps : 没有做过多的格式校验,所以对excel的中英文格式要求严格。

import os
import sys
import re
import xlrd
# 检验是否全是英文字符


def hiveddl(excel_name):
    # 打开excel
    data = xlrd.open_workbook(excel_name)
    # 列出所有sheet
    list_sheet = data.sheet_names()
    filename = 'HiveDDL.txt'
    with open(filename, 'w', encoding="utf-8") as f:  # 如果filename不存在会自动创建, 'w'表示写数据,写之前会清空文件中的原有数据!
        for sheet in list_sheet:
            # 因为表的字段信息都是放在01、02这种sheet的,所以正则匹配
            patten = "\d+"
            flag = re.match(patten, sheet)
            if flag:
                sheet_index = data.sheet_by_name(sheet)
                row_cnt = sheet_index.nrows
                # 中文表名
                table_ch_name = sheet_index.cell(0, 1).value
                # 英文表名
                table_eg_name = sheet_index.cell(1, 1).value
                # 中文字段
                ch_fields = sheet_index.col_values(1, 6)
                # print(ch_fields)
                # 字段行数
                field_count = len(ch_fields)

                sql = "CREATE TABLE IF NOT EXISTS " + table_eg_name + "(\n"
                str_colums = '{:<31}'.format(sheet_index.cell(6, 2).value) + '{:<10}'.format('STRING') \
                             + '{:<}'.format('COMMENT\'') + \
                             '{:<}'.format(sheet_index.cell(6, 1).value) + '\'\n'
                # print(str_colums)
                # 因为字段是从第7行开始,所以从第7行开始循环
                for i in range(6, field_count):

                    str_colums += ',' + '{:<30}'.format(sheet_index.cell(i + 1, 2).value) + '{:<10}'.format('STRING') \
                                  + '{:<}'.format('COMMENT\'') + \
                             '{:<}'.format(sheet_index.cell(i + 1, 1).value) + '\'\n'
                sql += str_colums

                sql += ') \n COMMENT \'' \
                       + table_ch_name \
                       + '\'\nPARTITIONED BY(pday STRING)' \
                         '\nROW FORMAT DELIMIETED ' \
                         '\n  FIELDS TERMINATED BY \'\\t\' ' \
                         '\nSTORED AS INPUTFORMAT' \
                         '\n \'org.apache.hadoop.mapred.TextInputFormat\'' \
                         '\nOUTPUTFORMAT' \
                         '\n \'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat\';\n'
                print(sql)

                f.write(sql)
    f.close()


def mysqlddl(excel_name):
    # 打开excel
    data = xlrd.open_workbook(excel_name)
    # 列出所有sheet
    list_sheet = data.sheet_names()
    filename = 'MysqlDDL.txt'
    with open(filename, 'w', encoding="utf-8") as f:  # 如果filename不存在会自动创建, 'w'表示写数据,写之前会清空文件中的原有数据!
        for sheet in list_sheet:
            # 因为表的字段信息都是放在01、02这种sheet的,所以正则匹配
            patten = "\d+"
            flag = re.match(patten, sheet)
            if flag:
                sheet_index = data.sheet_by_name(sheet)
                row_cnt = sheet_index.nrows

                # 英文表名
                table_eg_name = sheet_index.cell(1, 1).value
                # 中文字段
                ch_fields = sheet_index.col_values(1, 6)
                # print(ch_fields)
                # 字段行数
                field_count = len(ch_fields)

                sql = "CREATE TABLE IF NOT EXISTS " + table_eg_name + "(\n"
                str_colums = '{:<31}'.format('id') + '{:<30}'.format('INT NOT NULL AUTO_INCREMENT') \
                             + '{:<}'.format('COMMENT\'') + \
                             '{:<}'.format('ID') + '\'\n'
                # print(str_colums)
                # 因为字段是从第7行开始,所以从第7行开始循环
                for i in range(6, field_count):
                    is_blank_cell = sheet_index.cell(i + 1, 4).value
                    is_blank = lambda cell: 'NOT NULL' if is_blank_cell == '是' else ""
                    str_colums += ',' + '{:<30}'.format(sheet_index.cell(i + 1, 2).value) \
                                  + '{:<20}'.format(sheet_index.cell(i + 1, 3).value) \
                                  + '{:<15}'.format(is_blank(is_blank_cell)) \
                                  + '{:<}'.format('COMMENT\'') \
                                  + '{:<}'.format(sheet_index.cell(i + 1, 1).value) + '\'\n'
                sql += str_colums

                sql += ',PRIMARY KEY (id) \n ' \
                    ') ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT=\'' + format(sheet_index.cell(0, 1).value) + '\';\n'
                print(sql)

                f.write(sql)
    f.close()

if __name__ == '__main__':
    excel_name = "C:\\Users\\yangxiaofeng\\Desktop\\天津应急明细层v0.1_20200415.xls"
    hiveddl(excel_name)
    mysqlddl(excel_name)

 

你可能感兴趣的:(python)