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)
})