做网站搜索如何显示官网,微信群网站有哪些,淘宝关键词指数,网址大全域名解析1. 首先把LUA 转成JSON 对象
因为是excel, 所以第一层要是数组#xff0c;否则没有什么意义#xff0c;即lua对象要是一个数组比较合理。这里使用开源的json.lua#xff0c; 但是开源的#xff0c;对于数字作下标的#xff0c;或者是一个数组里#xff0c;不同类型的key…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)mixedKeyTypetrue;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_idnrsiidiws-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
使用pythonjson_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:i0for sub_item in value:reduce_item(key_to_string(i), sub_item)ii1#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, encodingutf-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, quotingcsv.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, encodingutf8)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的工作。