|
|
"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);
|