Node.js 导出 CSV 文件

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 文件)