/**
* csv 转 json
*
* 支持字符类型,基本的数据类型 => string int bool float
*
* 格式 =>
* 第一列为数据类型
* 第二列为数据字段名称
* 第三列之后为具体数据
* 例:
int int string string
id pic name des
100 6 苹果 苹果
101 18 桃子 桃子
102 36 樱桃 樱桃
103 72 樱桃 樱桃
*/
let fs = require('fs');
let iconv = require('iconv-lite');
/** 目录 */
let dir = "./tcsv/";
// 获取文件列表
let files = fs.readdirSync(dir);
// 获取文件数据
for(let j = 0;j < files.length;j++){
// 文件
let f = files[j];
// 同步获取文件内容
let d = fs.readFileSync(dir + f);
// 处理中文乱码
d = iconv.decode(d, 'gbk')
// 内容分割
let datas = d.toString().split("\n");
// 列的数量
let collength = datas[0].split(",").length;
// 去除的行数
let wiperow = 2;
// 行的数量
let rowlength = 0;
for(let i = 0;i < datas.length;i++){
if(datas[i] && datas[i] != ""){
++rowlength;
}
}
rowlength -= wiperow
// json数据
let jsond = new Array(rowlength);
// 类型
let types = datas[0].split(",")
// 字段名
let names = datas[1].split(",")
// 循环列
for(let i = 0;i < collength;i++){
// 循环行
for(let j = wiperow;j < rowlength + wiperow;j++){
let ds = datas[j].split(",");
if(!jsond[j-wiperow]){
jsond[j-wiperow] = {};
}
// 去除 \r
types[i] = types[i].replace("\r","")
names[i] = names[i].replace("\r","")
ds[i] = ds[i].replace("\r","")
// 字段,类型重组
switch(types[i]){
case "int":
{
jsond[j-wiperow][names[i]] = parseInt(ds[i]);
break;
}
case "float":
{
jsond[j-wiperow][names[i]] = parseFloat(ds[i]);
break;
}
case "string":
{
jsond[j-wiperow][names[i]] = ds[i];
break;
}
case "bool":
{
jsond[j-wiperow][names[i]] = (ds[i] == "true" || ds[i] == "TRUE") ? true : false;
break;
}
default:
{
console.log("该类型不存在:",types[i]);
break;
}
}
}
}
// 获取文件名称
let filename = f.split(".")[0] + ".json";
// 覆盖写入文件
fs.writeFileSync("./json/" + filename,JSON.stringify(jsond));
}