查看: 923|回复: 0
打印 上一主题 下一主题

[其他] CSV转换Lua脚本方便热更新

[复制链接]

9903

主题

126

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
53488
精华
316

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2015-12-25 07:28:36 |只看该作者 |倒序浏览
数据表热更新---uLua(一)
http://www.manew.com/thread-42298-1-1.html

(出处: -U3D游戏开发者社区【游戏蛮牛】)

前面已经讲了的我就不多赘述,我主要把CSV转Lua的py脚本贴出来
# -*- coding: utf-8 -*-
#cunkai
import os
import shutil
import re
import csv
import platform
import sys
import codecs

reload(sys)
sys.setdefaultencoding("utf-8")

sysType = platform.system()
ESC = chr(27)
# 字体
a_default  = 0
a_bold     = 1
a_italic   = 3
a_underline= 4
# 前景颜色
fg_black   = 30
fg_red     = 31
fg_green   = 32
fg_yellow  = 33
fg_blue    = 34
fg_magenta = 35
fg_cyan    = 36
fg_white   = 37
# 后景颜色
bg_black   = 40
bg_red     = 41
bg_green   = 42
bg_yellow  = 43
bg_blue    = 44
bg_magenta = 45
bg_cyan    = 46
bg_white   = 47

def color_code(a):
    return ESC+"[%dm"%a

def color_str(s, *args):
    if(sysType =="Windows"):
        return s
    cs = ""
    for a in args:
        cs += color_code(a)
    cs += s
    cs += color_code(a_default)
    return cs



print("\n\n\n\n\n\n\n\n\n")

path = os.path.split(os.path.realpath(__file__))[0]
csvPath = path+"/csv_folder/"
csharp = path+"/lua_folder/"
csvDataParentName = "csvDataParent"
dataManageName = "dataManage"

defaultcs = path+"/default/defaultclass.lua"
defaultcsv = path+"/default/defaultcsv.csv"


print(color_str("SYS: "+sysType,bg_blue, bg_cyan, a_bold))
print "coding: "+sys.getdefaultencoding()  

classList = []

# 这个函数的作用就是把在 csv 表里读出来的数据 写成 "data1","data2","data3" 的形式
def toCsString(line):
    isItem = 0

    data = '\"'

    for i in range(len(line)):
        item = line
        if item != '':
            isItem = 1
            data += item
            if i<len(line)-1:
                data += '|'
        else:
                data += '-1'
                if i<len(line)-1:
                        data+='|'

    data+='\"'
    if isItem==0:
        return ''
    return data

def openFile(name,ftype):
    fp=None

    if(sysType =="Windows"):
        try:
            fp=open(name,ftype,encoding='utf-8')
        except:  
            fp=open(name,ftype)
    else:
        fp=open(name,ftype)

    return fp

def mkdir(path):

    path=path.strip()
    # 删除path字符串中结尾处,位于 "\\" 删除序列的字符
    path=path.rstrip("\\")

    isExists=os.path.exists(path)

    if not isExists:
        # print path+' OK'
        # 作用: 创建递归的目录树,可以是相对或者绝对路径,mode的默认模式也是0777。
        os.makedirs(path)
        return True
    else:
        # print path+'OK'
        return False

def toIfFromClass(name):
    code = "\t\t\tif(className==\""+name+"\")\n\t\t\t{"+"\n\t\t\t\t"+"return "+name+".Instance();"+"\n\t\t\t}"
    return code

# 从这个方法开始执行,rootDir = "/csv_folder/"
def start(rootDir):
    # 遍历 rootDir 目录,返回 rootDir 目录下的所有文件
    # list_dirs csv文件列表 接收了 os.walk 返回的 起始路径、起始路径下的文件夹、起始路径下的文件
    list_dirs = os.walk(rootDir)

    # remove old csharp  csharp = path+"/csharp_folder/"
    isExists=os.path.exists(csharp)
    if isExists:
        # shutil -- 是一种高层次的文件操作工具  remtree 删除整个目录  
        shutil.rmtree(csharp)

    for root, dirs, files in list_dirs:
        for f in files:
            # 连接文件名和父路径 生成文件路径
            filePath = os.path.join(root, f)
            # 分割文件名文本,取到文件名和文件扩展名
            fname, fextension = os.path.splitext(f)
            # 通过连接得到(创建)csv 对应的 cs 文件
            csharpFilePath = os.path.join(csharp, "data/"+fname)+".lua"
            # csharpFilePath = csharpFilePath.replace(csvPath,csharp)
            # 如果后缀名为 .csv
            if fextension==".csv":

                # print(f)
                print(color_str(" -- "+f,fg_cyan, bg_black, a_bold))
                # 创建文件夹
                mkdir(csharp+"data")
                # copy default.cs
                # 复制一个文件到一个文件或一个目录  把模版内容复制到新建的 cs 文件中
                shutil.copy(defaultcs,csharpFilePath)

                #add classList
                classList.append(fname)

                #;compatible
                fp = None

                # 打开 csv 文件  权限 只读
                fp=openFile(filePath,'r')
                # 读取所有行
                alllines=fp.readlines()
                # 读取完毕关闭所有行
                fp.close()
                # defaultcsv = path+"/default/defaultcsv.csv"
                fp=openFile(defaultcsv,'w')


                #write start
                for eachline in alllines:
                    #;compatible
                    # 第一个参数可用正则表达式, 把 eachline 里面的 逗号替换成分号
                    a=re.sub(';',',',eachline)
                    # 写到 defaultcsv.csv 中
                    fp.writelines(a)
                fp.close()

                if(sysType == "Windows"):
                    try:
                        reader = csv.reader(open(defaultcsv, 'rU',encoding='utf-8'), dialect='excel')
                    except:
                        reader = csv.reader(open(defaultcsv, 'rU'), dialect='excel')
                else:
                    reader = csv.reader(open(defaultcsv, 'rU'), dialect='excel')

                chinaKey = None
                key = None
                data = ''

                for line in reader:
                    if chinaKey is None:
                        chinaKey = toCsString(line)
                    else:
                        if key is None:
                            key = toCsString(line)
                        else:
                            item = toCsString(line)
                            if item!='':
                                data = data +'{'+item+'}'+ ',\n\t\t'
                #print(key)
                #print(data)
                # write *.cs
                # read lines
                fp = None

                # 打开新建的 cs 脚本文件
                fp=openFile(csharpFilePath,'r')
                # 当然还是读一下 读出每一行
                alllines=fp.readlines()
                fp.close()
                # 刚才给了读权限,现在给个写权限
                fp=openFile(csharpFilePath,'w')

                #write start
                for eachline in alllines:
                    # class name
                    # 替换类名
                    a=re.sub('defaultclass',fname,eachline)
                    # china key
                    # 添加中文键
                    a=re.sub('defaultChinakey',chinaKey,a)
                    # allkey
                    # 添加英文 也就是代码中用到的键
                    a=re.sub('--defaultkey',key,a)
                    # alldata
                    # 添加所有的键值
                    a=re.sub('--defaultdata',data,a)
                    # csvDataParent
                    # 替换继承类的类名
                    #a=re.sub('defaultCsvDataParent',csvDataParentName,a)
                    fp.writelines(a)
                fp.close()


#  Step 1  程序入口               
start(csvPath)
print(color_str("GOOD",fg_white, bg_green, a_italic))
#coding=utf-8
if(sysType =="Windows"):
    raw_input(unicode('按回车键退出...','utf-8').encode('gbk'))
else:
    raw_input(unicode('按回车键退出...','utf-8').encode('utf-8'))

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-8-16 12:16 , Processed in 0.072309 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部