美文网首页
Node.js 导出 CSV 文件

Node.js 导出 CSV 文件

作者: nzjcnjzx | 来源:发表于2020-08-26 09:12 被阅读0次
    function csvToJson (file) {
      return new Promise((resolve, reject) => {
        fs.readFile(file, 'utf-8', (err, data) => {
          if (err) {
            reject(err)
          }
          // data 为我们所读取的文件内容,按照换行符进行分割
          var dataList = data.split('\r\n')
          // 数组的第一位一定是表头,因此我们单独取出第一行,并且用 ',' 分割
          var titleList = dataList.shift(0).split(',')
          // 如果源文件最后有换行符,则数组的最后一项为空。当为空时,我们舍去最后一行
          if (!dataList[dataList.length - 1]) {
            dataList.pop()
          }
          // 剩下为内容的数组
          var contentList = dataList
          // 使用 map 方法,对行内容与表头进行配对编辑,最终返回一个 JSON 的数组
          var jsonList = contentList.map((content) => {
            // 对内容同样用 ',' 分割
            var tmpList = content.split(',')
            var dataObj = {}
            tmpList.forEach((_data, index) => {
              dataObj[titleList[index]] = _data
            })
            return dataObj
          })
          console.log(jsonList)
          resolve(jsonList)
        })
      })
    }
    
    
    function jsonToCsv (jsonList, targetPath, fileName) {
      // 这样我们得到了一个第一个为表头,剩余为内容的数组了
      var csvDataList = jsonList.reduce((prev, current, index) => {
        // 因为每个 json 对象的 key 都是相同的,因此我们只需要取一个就行
        if (index === 0) {
          prev.push(Object.keys(current))
        }
        // 将每个值都存到一个数组中去
        var dataList = []
        for (var key in current) {
          dataList.push(current[key])
        }
        prev.push(dataList)
        return prev
      }, [])
      // 将上一步得到的数组转为字符串
      var writeData = csvDataList.map(data => {
        // 每个数组通过逗号连接 map 返回一个数组
        return data.join(',')
      }).join('\r\n') // 对返回的大数组再次用换行符拼接
      console.log(writeData)
      return new Promise((resolve, reject) => {
        // 在教程中为了与源文件区别,所以在头上特意加上一下生成的时间
        // 如果需要拿去做正式使用,下面这段可以去除
        // writeData = `${new Date().toLocaleString()}\r\n` + writeData
        // 为了对付 excel 打开乱码,在头上要加上 BOM 头
        // writeData = new Buffer('\xEF\xBB\xBF', 'binary') + writeData
        fs.writeFile(`${targetPath}/${fileName}`, writeData, 'utf-8', (err) => {
          if (err) {
            reject(err)
          }
          resolve()
        })
      })
    }
    

    使用工具库导入导出 CSV

    var fs = require('fs')
    var path = require('path')
    var convert = require('json-2-csv')
    var csvFile = path.join(__dirname, './user_role.csv')
    fs.readFile(csvFile, 'utf-8', (err, data) => {
      if (err) {
        throw new Error(err)
      }
      convert.csv2jsonPromisified(data).then(arr => {
        console.log(arr)
      }).catch(err => {
        throw new Error(err)
      })
    })
    
    convert.csv2jsonPromisified(data).then(arr => {
        // console.log(arr)
        convert.json2csvPromisified(arr).then(csv => {
          console.log(csv)
        })
      }).catch(err => {
        throw new Error(err)
      })
    

    相关文章

      网友评论

          本文标题:Node.js 导出 CSV 文件

          本文链接:https://www.haomeiwen.com/subject/sfcxsktx.html