You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

181 lines
4.4 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"use strict";
var XLSX = require("xlsx");
var fs = require("fs");
var path = require("path");
var options = process.argv;
if (options.length < 4) {
console.log("需要2个参数(src out)");
process.exit();
}
var srcDir = options[2];
var outDir = options[3];
function mkdirs(dirname, callback) {
if (fs.existsSync(dirname)) {
if (callback != undefined) {
callback();
}
} else {
mkdirs(path.dirname(dirname), function () {
fs.mkdirSync(dirname);
if (callback != undefined) {
callback();
}
});
}
}
function insertStr(soure, start, newStr) {
return soure.slice(0, start) + newStr + soure.slice(start);
}
function encodeQuote(str) {
if (str[0] != '"' || str[str.length - 1] != '"') {
return str;
}
var i = 1;
var f;
while ((f = str.indexOf('"', i)) != -1 && f < str.length - 1) {
str = insertStr(str, f, "\\");
//console.log(f, str);
i = f + 2;
}
return str;
}
var countExport = 0;
function handleFile(fileDir) {
var content = fs.readFileSync(fileDir, "utf8");
var contents = content.split("\n");
var exportHead = contents[0];
var exportTail = contents[contents.length - 1];
var i = 1;
var numKeys = 0;
while (true) {
var re = contents[i + numKeys].match(/\[\d+\] *= *\{/g);
if (re == null) {
break;
}
numKeys++;
//console.log(re);
}
console.log("keys", numKeys);
var exportType = (numKeys > 0 ? "base" : "tiny");
var fileName = fileDir.replace(/^.*[\\\/]/, "");
var exportFile = outDir + "/" + fileName + ".xlsx";
mkdirs(path.dirname(exportFile));
var data = [];
data[0] = ["导出类型", exportType, "", "导出文件头", exportHead];
data[1] = ["导出文件", fileDir, "", "导出文件尾", exportTail];
data[2] = ["key数量", numKeys];
data[3] = [];
if (numKeys > 0) {
var numAttr = 0;
while (true) {
var re = contents[i + numKeys + numAttr].match(/ \}\,/g);
//console.log(re);
if (re != null) {
break;
}
numAttr++;
}
console.log("attr", numAttr);
data[4] = ["配置备注"];
data[5] = ["导出参数"];
data[6] = ["备注"];
for (var ai = 0; ai < numAttr; ai++) {
data[5][1 + ai] = "sc";
var re = contents[i + numKeys + ai].match(/\t(\w+) *=/);
if (re != null) {
//console.log(re[1]);
var attrName = re[1];
data[6][1 + ai] = attrName;
}
}
for (
var row = 7;
i + numKeys + numAttr < contents.length;
i += 2 * numKeys + numAttr
) {
//console.log(i);
data[row] = [];
for (var ai = 0; ai < numAttr; ai++) {
var re = contents[i + numKeys + ai].match(/ *= *([^\n]+),/);
if (re != null) {
//console.log(re[1]);
data[row][1 + ai] = re[1];
}
}
row++;
}
} else {
data[4] = ["配置备注", "导出参数", "字段名", "值", "备注"];
for (var row = 5; row - 4 < contents.length - 1; row++) {
var re = contents[row - 4].match(/\t(\w+) *= *([^\n]+),/);
if (re != null) {
//console.log(re);
data[row] = ["", "sc", re[1], re[2]];
}
}
}
var ws = XLSX.utils.aoa_to_sheet(data);
var wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, fileName);
console.log(fileDir, "->", exportFile);
XLSX.writeFile(wb, exportFile);
countExport++;
}
function handleDir(filePath) {
//根据文件路径读取文件,返回文件列表
var files = fs.readdirSync(filePath);
//遍历读取到的文件列表
files.forEach(function (filename) {
//获取当前文件的绝对路径
var filedir = path.join(filePath, filename);
//根据文件路径获取文件信息返回一个fs.Stats对象
var stats = fs.statSync(filedir);
var isFile = stats.isFile(); //是文件
var isDir = stats.isDirectory(); //是文件夹
if (isFile) {
//console.log(filedir);
handleFile(filedir);
}
if (isDir) {
handleDir(filedir); //递归,如果是文件夹,就继续遍历该文件夹下面的文件
}
});
}
function removeDir(p) {
if (!fs.existsSync(p)) {
return;
}
let statObj = fs.statSync(p); // fs.statSync同步读取文件状态判断是文件目录还是文件。
if (statObj.isDirectory()) { //如果是目录
let dirs = fs.readdirSync(p); //fs.readdirSync()同步的读取目标下的文件 返回一个不包括 '.' 和 '..' 的文件名的数组['b','a']
dirs = dirs.map((dir) => path.join(p, dir)); //拼上完整的路径
for (let i = 0; i < dirs.length; i++) {
// 深度 先将儿子移除掉 再删除掉自己
removeDir(dirs[i]);
}
fs.rmdirSync(p); //删除目录
} else {
fs.unlinkSync(p); //删除文件
}
}
removeDir(outDir);
handleDir(srcDir);