LUA 对象转excel

1. 首先把LUA 转成JSON 对象

因为是excel, 所以第一层要是数组,否则没有什么意义,即lua对象要是一个数组比较合理。这里使用开源的json.lua, 但是开源的,对于数字作下标的,或者是一个数组里,不同类型的key混合的情况无法转换,所以我进行了一定的改进,先进行了扫描判断是不是混合的key,是的话,取消key,把key到结构里作为一个字段处理。源码如下:


local json = loadfile("json.lua/json.lua")()
t1 = new Test();
print(json.encode(t1))

库代码:

--
-- json.lua
--
-- Copyright (c) 2020 rxi
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy of
-- this software and associated documentation files (the "Software"), to deal in
-- the Software without restriction, including without limitation the rights to
-- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-- of the Software, and to permit persons to whom the Software is furnished to do
-- so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in all
-- copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-- SOFTWARE.
--local json = { _version = "0.1.2" }-------------------------------------------------------------------------------
-- Encode
-------------------------------------------------------------------------------local encodelocal escape_char_map = {[ "\\" ] = "\\",[ "\"" ] = "\"",[ "\b" ] = "b",[ "\f" ] = "f",[ "\n" ] = "n",[ "\r" ] = "r",[ "\t" ] = "t",
}local escape_char_map_inv = { [ "/" ] = "/" }
for k, v in pairs(escape_char_map) doescape_char_map_inv[v] = k
endlocal function escape_char(c)return "\\" .. (escape_char_map[c] or string.format("u%04x", c:byte()))
endlocal function encode_nil(val)return "null"
endlocal function encode_table(val, stack)local res = {}local mixedKeyType =falselocal tmpobj={}stack = stack or {}-- Circular reference?if stack[val] then error("circular reference") endstack[val] = trueif rawget(val, 1) ~= nil or next(val) == nil then-- Treat as array -- check keys are valid and it is not sparselocal n = 0for k in pairs(val) doif type(k) ~= "number" then--error("invalid table: mixed or invalid key types")mixedKeyType=true;endn = n + 1end-- if n ~= #val then--   error("invalid table: sparse array")-- end-- Encodefor i, v in ipairs(val) doif mixedKeyType then if type(v) == "table" thenrawset(v, "vv__objid",tostring(k))elsetmpobj={}tmpobj.k = i;tmpobj.v = v;v = tmpobj;endendtable.insert(res, encode(v, stack))endstack[val] = nilreturn "[" .. table.concat(res, ",") .. "]"else-- Treat as an objectfor k, v in pairs(val) doif type(k) ~= "string" then-- error("invalid table: mixed or invalid key types : "..type(k) .. "value:"..tostring(k))mixedKeyType = true;break;endendfor k, v in pairs(val) doif  mixedKeyType thenif type(v) == "table" thenrawset(v, "vv__objid",tostring(k))elsetmpobj={}tmpobj.k = k;tmpobj.v = v;v = tmpobj;endtable.insert(res,  encode(v, stack))elsetable.insert(res, encode(k, stack) .. ":" .. encode(v, stack))endendstack[val] = nilif  mixedKeyType thenreturn "[" .. table.concat(res, ",\n") .. "]"elsereturn "{" .. table.concat(res, ",") .. "}"endend
endlocal function encode_string(val)return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"'
endlocal function encode_number(val)-- Check for NaN, -inf and infif val ~= val or val <= -math.huge or val >= math.huge thenerror("unexpected number value '" .. tostring(val) .. "'")endreturn string.format("%.14g", val)
endlocal type_func_map = {[ "nil"     ] = encode_nil,[ "table"   ] = encode_table,[ "string"  ] = encode_string,[ "number"  ] = encode_number,[ "boolean" ] = tostring,
}encode = function(val, stack)local t = type(val)local f = type_func_map[t]if f thenreturn f(val, stack)enderror("unexpected type '" .. t .. "'")
endfunction json.encode(val)return ( encode(val) )
end-------------------------------------------------------------------------------
-- Decode
-------------------------------------------------------------------------------local parselocal function create_set(...)local res = {}for i = 1, select("#", ...) dores[ select(i, ...) ] = trueendreturn res
endlocal space_chars   = create_set(" ", "\t", "\r", "\n")
local delim_chars   = create_set(" ", "\t", "\r", "\n", "]", "}", ",")
local escape_chars  = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u")
local literals      = create_set("true", "false", "null")local literal_map = {[ "true"  ] = true,[ "false" ] = false,[ "null"  ] = nil,
}local function next_char(str, idx, set, negate)for i = idx, #str doif set[str:sub(i, i)] ~= negate thenreturn iendendreturn #str + 1
endlocal function decode_error(str, idx, msg)local line_count = 1local col_count = 1for i = 1, idx - 1 docol_count = col_count + 1if str:sub(i, i) == "\n" thenline_count = line_count + 1col_count = 1endenderror( string.format("%s at line %d col %d", msg, line_count, col_count) )
endlocal function codepoint_to_utf8(n)-- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixalocal f = math.floorif n <= 0x7f thenreturn string.char(n)elseif n <= 0x7ff thenreturn string.char(f(n / 64) + 192, n % 64 + 128)elseif n <= 0xffff thenreturn string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128)elseif n <= 0x10ffff thenreturn string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128,f(n % 4096 / 64) + 128, n % 64 + 128)enderror( string.format("invalid unicode codepoint '%x'", n) )
endlocal function parse_unicode_escape(s)local n1 = tonumber( s:sub(1, 4),  16 )local n2 = tonumber( s:sub(7, 10), 16 )-- Surrogate pair?if n2 thenreturn codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000)elsereturn codepoint_to_utf8(n1)end
endlocal function parse_string(str, i)local res = ""local j = i + 1local k = jwhile j <= #str dolocal x = str:byte(j)if x < 32 thendecode_error(str, j, "control character in string")elseif x == 92 then -- `\`: Escaperes = res .. str:sub(k, j - 1)j = j + 1local c = str:sub(j, j)if c == "u" thenlocal hex = str:match("^[dD][89aAbB]%x%x\\u%x%x%x%x", j + 1)or str:match("^%x%x%x%x", j + 1)or decode_error(str, j - 1, "invalid unicode escape in string")res = res .. parse_unicode_escape(hex)j = j + #hexelseif not escape_chars[c] thendecode_error(str, j - 1, "invalid escape char '" .. c .. "' in string")endres = res .. escape_char_map_inv[c]endk = j + 1elseif x == 34 then -- `"`: End of stringres = res .. str:sub(k, j - 1)return res, j + 1endj = j + 1enddecode_error(str, i, "expected closing quote for string")
endlocal function parse_number(str, i)local x = next_char(str, i, delim_chars)local s = str:sub(i, x - 1)local n = tonumber(s)if not n thendecode_error(str, i, "invalid number '" .. s .. "'")endreturn n, x
endlocal function parse_literal(str, i)local x = next_char(str, i, delim_chars)local word = str:sub(i, x - 1)if not literals[word] thendecode_error(str, i, "invalid literal '" .. word .. "'")endreturn literal_map[word], x
endlocal function parse_array(str, i)local res = {}local n = 1i = i + 1while 1 dolocal xi = next_char(str, i, space_chars, true)-- Empty / end of array?if str:sub(i, i) == "]" theni = i + 1breakend-- Read tokenx, i = parse(str, i)res[n] = xn = n + 1-- Next tokeni = next_char(str, i, space_chars, true)local chr = str:sub(i, i)i = i + 1if chr == "]" then break endif chr ~= "," then decode_error(str, i, "expected ']' or ','") endendreturn res, i
endlocal function parse_object(str, i)local res = {}i = i + 1while 1 dolocal key, vali = next_char(str, i, space_chars, true)-- Empty / end of object?if str:sub(i, i) == "}" theni = i + 1breakend-- Read keyif str:sub(i, i) ~= '"' thendecode_error(str, i, "expected string for key")endkey, i = parse(str, i)-- Read ':' delimiteri = next_char(str, i, space_chars, true)if str:sub(i, i) ~= ":" thendecode_error(str, i, "expected ':' after key")endi = next_char(str, i + 1, space_chars, true)-- Read valueval, i = parse(str, i)-- Setres[key] = val-- Next tokeni = next_char(str, i, space_chars, true)local chr = str:sub(i, i)i = i + 1if chr == "}" then break endif chr ~= "," then decode_error(str, i, "expected '}' or ','") endendreturn res, i
endlocal char_func_map = {[ '"' ] = parse_string,[ "0" ] = parse_number,[ "1" ] = parse_number,[ "2" ] = parse_number,[ "3" ] = parse_number,[ "4" ] = parse_number,[ "5" ] = parse_number,[ "6" ] = parse_number,[ "7" ] = parse_number,[ "8" ] = parse_number,[ "9" ] = parse_number,[ "-" ] = parse_number,[ "t" ] = parse_literal,[ "f" ] = parse_literal,[ "n" ] = parse_literal,[ "[" ] = parse_array,[ "{" ] = parse_object,
}parse = function(str, idx)local chr = str:sub(idx, idx)local f = char_func_map[chr]if f thenreturn f(str, idx)enddecode_error(str, idx, "unexpected character '" .. chr .. "'")
endfunction json.decode(str)if type(str) ~= "string" thenerror("expected argument of type string, got " .. type(str))endlocal res, idx = parse(str, next_char(str, 1, space_chars, true))idx = next_char(str, idx, space_chars, true)if idx <= #str thendecode_error(str, idx, "trailing garbage")endreturn res
endreturn json

二、把JSON转成CSV

使用python,json_to_csv这个库 。 它会把树形展平

import sys
import json
import csv
import io##
# Convert to string keeping encoding in mind...
##
def to_string(s):try:return str(s)except:#Change the encoding type if neededreturn s.encode('utf-8')##
# This function converts an item like 
# {
#   "item_1":"value_11",
#   "item_2":"value_12",
#   "item_3":"value_13",
#   "item_4":["sub_value_14", "sub_value_15"],
#   "item_5":{
#       "sub_item_1":"sub_item_value_11",
#       "sub_item_2":["sub_item_value_12", "sub_item_value_13"]
#   }
# }
# To
# {
#   "node_item_1":"value_11",
#   "node_item_2":"value_12",
#   "node_item_3":"value_13",
#   "node_item_4_0":"sub_value_14", 
#   "node_item_4_1":"sub_value_15",
#   "node_item_5_sub_item_1":"sub_item_value_11",
#   "node_item_5_sub_item_2_0":"sub_item_value_12",
#   "node_item_5_sub_item_2_0":"sub_item_value_13"
# }
##
def reduce_item(key, value):global reduced_item#Reduction Condition 1if type(value) is list:i=0for sub_item in value:reduce_item(key+'_'+to_string(i), sub_item)i=i+1#Reduction Condition 2elif type(value) is dict:sub_keys = value.keys()for sub_key in sub_keys:reduce_item(key+'_'+to_string(sub_key), value[sub_key])#Base Conditionelse:reduced_item[to_string(key)] = to_string(value)if __name__ == "__main__":if len(sys.argv) != 4:print ("\nUsage: python json_to_csv.py <node> <json_in_file_path> <csv_out_file_path>\n")else:#Reading argumentsnode = sys.argv[1]json_file_path = sys.argv[2]csv_file_path = sys.argv[3]with io.open(json_file_path, 'r', encoding='utf-8-sig') as fp:json_value = fp.read()raw_data = json.loads(json_value)try:data_to_be_processed = raw_data[node]except:data_to_be_processed = raw_dataprocessed_data = []header = []for item in data_to_be_processed:reduced_item = {}reduce_item(node, item)header += reduced_item.keys()processed_data.append(reduced_item)header = list(set(header))header.sort()with open(csv_file_path, 'w+') as f:writer = csv.DictWriter(f, header, quoting=csv.QUOTE_ALL)writer.writeheader()for row in processed_data:writer.writerow(row)print ("Just completed writing csv file with %d columns" % len(header))

三、把csv转成xlsx文件

使用开源的xlsxwriter, pip先安装一下, 使用代码如下:

import sys
import json
import csv
import io
from xlsxwriter.workbook import Workbookif __name__ == "__main__":if len(sys.argv) != 3:print ("\nUsage: python csv_to_xlsx.py <csv_file> <xlsx_file>\n")else:#Reading argumentscsvfile = sys.argv[1]xlsxfile = sys.argv[2]workbook = Workbook(xlsxfile)worksheet = workbook.add_worksheet()f= open(csvfile, 'rt', encoding='utf8')reader = csv.reader(f)for r, row in enumerate(reader):for c, col in enumerate(row):worksheet.write(r, c, col)workbook.close()f.close()

三步走完,完成lua转excel的工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/631015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat启动后无法访问主页

1、确认JDK和Tomcat环境变量配置没有问题后&#xff0c;startup启动Tomcat 2、输入localhost:8080显示无法访问 3、找到Tomcat安装目录下的conf目录 4、修改下面两个地方&#xff0c;将port改成8081 <Connector port"8081" protocol"HTTP/1.1"connect…

vue3 实现简单计数器示例——一个html文件展示vue3的效果

目的&#xff1a;作为一个新手开发&#xff0c;我想使用 Vue 3 将代码封装在 HTML 文件中时&#xff0c;进行界面打开展示。 一、vue计数示例 学了一个简单计数器界面展示&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head&…

会话层协议

在OSI模型中&#xff0c;会话层&#xff08;Session Layer&#xff09;主要负责建立、管理和终止会话&#xff0c;提供数据交换的服务。然而&#xff0c;相对于物理层、数据链路层、网络层、运输层等层&#xff0c;会话层的协议并没有像其他层次那样具有明确的、广泛应用的协议…

PXE和kickstart无人值守安装

PXE高效批量网络装机 引言 1.系统装机的引导方式 启动 操作 系统 1.硬盘 2.光驱&#xff08;u盘&#xff09; 3.网络启动 pxe 重装系统&#xff1f; 在已有操作系统 新到货了一台服务器&#xff0c; 装操作系统 系统镜像 u盘 光盘 pe&#xff1a; 小型的 操作系统 在操…

SeaTunnel 、DataX 、Sqoop、Flume、Flink CDC 对比

对比 对比项Apache SeaTunnelDataXApache SqoopApache FlumeFlink CDC部署难度容易容易中等,依赖于 Hadoop 生态系统容易中等,依赖于 Hadoop 生态系统运行模式分布式,也支持单机单机本身不是分布式框架,依赖 Hadoop MR 实现分布式分布式,也支持单机分布式,也支持单机健壮…

rust跟我学七:获取外网IP地址

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎么获取到本机的外网IP地址。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:[…

渗透测试(13)- 费解的三次握手和四次挥手

上一篇文章通过wireshark抓包工具简单了解了TCP/IP协议的五层工作模型&#xff0c;其中传输层我们已经知道主要是用来增加端口信息的。传输层主要有两种协议&#xff0c;一种是面向连接的TCP协议&#xff0c;一种是无连接的UDP协议&#xff0c;无连接的UDP协议比较好理解&#…

智能小程序相关名词解释(汇总)

小程序 ID 小程序 ID 是智能小程序分配给开发者的应用 ID&#xff0c;是应用的唯一标示&#xff0c;只有应用创建后才可以获取。创建小程序应用后&#xff0c;您可获得小程序应用的小程序 ID。 小程序框架 小程序提供一套简单高效的开发框架&#xff0c;帮助您开发具有原生 …

QT上位机开发(MySql访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 网上介绍的关于QT和mysql部分的内容&#xff0c;都是利用Qt自带的mysql库来实现数据读写的。但是事实上来说&#xff0c;即使不用qt带的库&#xf…

利用 ChatGPT 高效搜索:举一反三的思考方式,高效查找解决方案

文章目录 基础思路举一反三Go 语言 Web 框架延伸思考思考结论 本文只是我的一些尝试&#xff0c;基于 ChatGPT 实现系统化快速搜索某编程语言的特定领域相关包或者基于其他语言类推荐落地方案的尝试。 这篇文章中描述的方式不一定是好方式&#xff0c;但应该会有一定的启示作用…

深入剖析 Git 对象底层原理

一、引言 在我们日常使用 Git 时&#xff0c;通常的操作是&#xff1a; 在写完一段代码后&#xff0c;执行 git add命令&#xff0c;将这段代码添加到暂存区中然后再执行 git commit和 git push 命令&#xff0c;将 本地 Git 版本库中的提交同步到服务器中的版本库中 Git 在…

vscode 格式化代码

在 Visual Studio Code 中&#xff0c;你可以使用以下步骤来格式化代码&#xff1a; 打开你的代码文件。选择你要格式化的代码部分或按 CtrlA 来全选。按下 ShiftAltF&#xff0c;这会触发 "格式化文档" 的命令。 如果你的键盘布局没有 "Alt" 键&#xf…

Three.js 学习笔记之模型(学习中1.17更新)

文章目录 模型 几何体 材质模型点模型Points - 用于显示点线模型Line | LineLoop | LineSegments网格模型mesh - 三角形 几何体BufferGeometry缓冲类型几何体BufferGeometry - 没有任何形状的空几何体创建几何体的方式BufferAttribute Types定义顶点法线 geometry.attributes…

Maven工程 — 继承与聚合 相关知识点详解

简介&#xff1a;这篇帖子主要讲解Maven工程中的继承与聚合的相关知识点&#xff0c;用简洁的语言和小编自己的理解&#xff0c;深入浅出的说明Maven工程的继承与聚合。 目录 1、继承 1.1 继承关系的实现 1.2 版本锁定 2、聚合 2.1 聚合方法 3、总结 1、继承 图 1-1 继承…

2018年认证杯SPSSPRO杯数学建模C题(第一阶段)机械零件加工过程中的位置识别全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 基于轮廓特征的机械零件位置识别研究 C题 机械零件加工过程中的位置识别 原题再现&#xff1a; 在工业制造自动生产线中&#xff0c;在装夹、包装等工序中需要根据图像处理利用计算机自动智能识别零件位置&#xff0c;并由机械手将零件自动搬…

[go语言]输入输出

目录 知识结构 输入 1.Scan ​编辑 2.Scanf 3.Scanln 4.os.Stdin --标准输入&#xff0c;从键盘输入 输出 1.Print 2.Printf 3.Println 知识结构 输入 为了展示集中输入的区别&#xff0c;将直接进行代码演示。 三者区别的结论&#xff1a;Scanf格式化输入&#x…

【Ubuntu】使用NFS共享挂载硬盘

在Ubuntu系统上使用NFS&#xff08;Network File System&#xff09;将某个硬盘挂载并在另一个Ubuntu系统上进行挂载的过程可以分为两个步骤&#xff1a;一是将硬盘挂载到服务器上&#xff0c;二是在客户端上挂载这个共享。 以下是详细步骤&#xff1a; 在服务器上挂载硬盘并…

Python中re模块search和findall函数的使用

1.search函数&#xff1a; re.search(pattern,string,flags0) 用于整个字符串中搜索第一个匹配的值&#xff0c;如果匹配成功&#xff0c;结果为Match对象&#xff0c;否则结果位None。 import re pattern\d\.\d sI study Python3.11 every day Python2.7 I love you matchr…

ElasticSearch(1):Elastic Stack简介

1 简介 ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;官网https://www.elastic.co/cn。包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际上ELK不仅仅适用于日志分析&#xff0c;它还可以支持其它任何数据搜索、分析和收集的场景&#xf…

MongoDB面试系列-02

1. MongoDB 中必须调用 getLastError 来确保写操作生效吗&#xff1f; MongoDB中不管有没有调用getLastError&#xff08;又称为Safe Mode&#xff09;&#xff0c;服务器执行的操作都会一样。 而调用getLastError只是为了确认写操作是否成功提交&#xff0c;但是写操作的安全…