一个前端,爱跑步、爱吉他、爱做饭、爱生活、爱编程、爱南芳姑娘,爱我所爱。世间最温暖又无价的是阳光、空气与爱,愿它们能带你去更远的地方。

  • 文章
  • 心情
  • 照片墙
  • 工具
  • 开发技术分享

    爬虫数据的json转为csv文件

    技术 201 2021-09-06 13:45

    需求:我们之前通过接口爬虫 爬取一些数据,

    这些数据都是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