需求:我们之前通过接口爬虫 爬取一些数据,
这些数据都是Json格式的,为了方便我们的甲方使用
所以需要把这些数据转为csv 方便他们使用(例如在表单里面搜索,超链接跳转等等)
直接上代码吧:
在转换之前 我们需要对爬取的源数据进行一次过滤
用到我们的node的fs独写文件模块工具
const fs = require("fs");
const data = require("./cjdropshipping/data1.json");
//过滤一下
let newData = data.users.map((item) => {
return {
pk: item.pk,
username: item.username,
full_name: item.full_name,
is_private: item.is_private,
source_Url: `https://www.instagram.com/${item.username}`,
};
});
// console.log(newData);
// 过滤好用 重新写入一个新的文件中
fs.writeFile(
"./cjdropshipping/data1_ed.json",
JSON.stringify(newData),
(err) => {
if (err) console.log("写文件操作失败");
else console.log("写文件操作成功");
}
);
通过上面的操作,我们的数据已经做好转成csv的准备了
下面是我们转json转csv的代码:
代码有点多,下面的方法是直接从别人封装好的拿过来的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<h1>jsonToCsv</h1>
<hr />
<button id="btn">json To csv</button>
</body>
<script>
document.querySelector("#btn").onclick = () => {
fetch("cjdropshipping/data1_ed.json")
.then((res) => {
return res.json();
})
.then((csvJson) => {
console.log(csvJson);
var downName = "IG_cjdropshipping_followings";
var title = [
"pk",
"username",
"full_name",
"is_private",
"source_Url",
]; //csv表头
var key = ["pk", "username", "full_name", "is_private", "source_Url"]; // 数据key
clickDownload(csvJson, downName, title, key);
});
};
//csv下载文件名,用户拼接
//csv下载
function clickDownload(csvJson, downloadName, title, key) {
JSonToCSV.setDataConver({
data: csvJson,
fileName: downloadName,
columns: {
title, //csv表头
key,
// 过滤 n = key v = value
formatter: function (n, v) {
if (n === "xxxxx") {
return Number(v).toFixed(2);
}
if (v === undefined) {
return " ";
}
},
},
});
}
//csv下载
(function (global, factory) {
"use strict";
if (typeof module === "object" && typeof module.exports === "object") {
module.exports = global.document
? factory(global, true)
: function (w) {
return factory(w);
};
} else {
factory(global);
}
})(window, function () {
var JSonToCSV = {
/*
* obj是一个对象,其中包含有:
* ## data 是导出的具体数据
* ## fileName 是导出时保存的文件名称 是string格式
* ## showLabel 表示是否显示表头 默认显示 是布尔格式
* ## columns 是表头对象,且title和key必须一一对应,包含有
title:[], // 表头展示的文字
key:[], // 获取数据的Key
formatter: function() // 自定义设置当前数据的 传入(key, value)
*/
setDataConver: function (obj) {
var bw = this.browser();
if (bw["ie"] < 9) return; // IE9以下的
var data = obj["data"],
ShowLabel =
typeof obj["showLabel"] === "undefined" ? true : obj["showLabel"],
fileName = (obj["fileName"] || "UserExport") + ".csv",
columns = obj["columns"] || {
title: [],
key: [],
formatter: undefined,
};
var ShowLabel = typeof ShowLabel === "undefined" ? true : ShowLabel;
var row = "",
CSV = "",
key;
// 如果要现实表头文字
if (ShowLabel) {
// 如果有传入自定义的表头文字
if (columns.title.length) {
columns.title.map(function (n) {
row += n + ",";
});
} else {
// 如果没有,就直接取数据第一条的对象的属性
for (key in data[0]) row += key + ",";
}
row = row.slice(0, -1); // 删除最后一个,号,即a,b, => a,b
CSV += row + "\r\n"; // 添加换行符号
}
// 具体的数据处理
data.map(function (n) {
row = "";
// 如果存在自定义key值
if (columns.key.length) {
columns.key.map(function (m) {
row +=
'"' +
(typeof columns.formatter === "function"
? columns.formatter(m, n[m]) || n[m]
: n[m]) +
'",';
});
} else {
for (key in n) {
row +=
'"' +
(typeof columns.formatter === "function"
? columns.formatter(key, n[key]) || n[key]
: n[key]) +
'",';
}
}
row.slice(0, row.length - 1); // 删除最后一个,
CSV += row + "\r\n"; // 添加换行符号
});
if (!CSV) return;
this.SaveAs(fileName, CSV);
},
SaveAs: function (fileName, csvData) {
var bw = this.browser();
if (!bw["edge"] && !bw["ie"]) {
var alink = document.createElement("a");
alink.id = "linkDwnldLink";
alink.href = this.getDownloadUrl(csvData);
document.body.appendChild(alink);
var linkDom = document.getElementById("linkDwnldLink");
linkDom.setAttribute("download", fileName);
linkDom.click();
document.body.removeChild(linkDom);
} else if (bw["ie"] >= 10 || bw["edge"] == "edge") {
var _utf = "\uFEFF";
var _csvData = new Blob([_utf + csvData], {
type: "text/csv",
});
window.navigator.msSaveBlob(_csvData, fileName);
} else {
var oWin = window.top.open("about:blank", "_blank");
oWin.document.write("sep=,\r\n" + csvData);
oWin.document.close();
oWin.document.execCommand("SaveAs", true, fileName);
oWin.close();
}
},
getDownloadUrl: function (csvData) {
var _utf = "\uFEFF"; // 为了使Excel以utf-8的编码模式,同时也是解决中文乱码的问题
if (window.Blob && window.URL && window.URL.createObjectURL) {
var csvData = new Blob([_utf + csvData], {
type: "text/csv",
});
return URL.createObjectURL(csvData);
}
// return 'data:attachment/csv;charset=utf-8,' + _utf + encodeURIComponent(csvData);
},
browser: function () {
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
var s;
(s =
ua.indexOf("edge") !== -1
? (Sys.edge = "edge")
: ua.match(/rv:([\d.]+)\) like gecko/))
? (Sys.ie = s[1])
: (s = ua.match(/msie ([\d.]+)/))
? (Sys.ie = s[1])
: (s = ua.match(/firefox\/([\d.]+)/))
? (Sys.firefox = s[1])
: (s = ua.match(/chrome\/([\d.]+)/))
? (Sys.chrome = s[1])
: (s = ua.match(/opera.([\d.]+)/))
? (Sys.opera = s[1])
: (s = ua.match(/version\/([\d.]+).*safari/))
? (Sys.safari = s[1])
: 0;
return Sys;
},
};
window.JSonToCSV = JSonToCSV;
});
</script>
</html>
以上,记录一下
参考文档:https://blog.csdn.net/qq_39706128/article/details/80002366