问题:使用nestjs,读取csv文件数据,获取到的中文是乱码
原因:数据生成时是GBK编码,nodejs原生读取文件不支持GBK
解决:使用iconv-lite库
示例:
const fs = require('fs');
// filePath为文件路径
const filePath = 'D:/demo.csv';
const stream = fs.createReadStream(filePath, { encoding: 'binary' });
let data = '';
stream.on('error', err => {
console.error('读取行错误');
console.error(err);
});
stream.on('data', item => {
data += item;
});
stream.on('end', () => {
const buf = Buffer.from(data, 'binary');
// 获得正常的字符串,没有乱码
const str = iconv.decode(buf, 'GBK');
});
业务中使用:
import { Injectable } from '@nestjs/common';
const xlsx2json = require('node-xlsx');
const iconv = require('iconv-lite');
const fs = require('fs');
@Injectable()
export class FileService {
array = [];
fileAddress = 'D:/home/file;
async csvTojson(file: any): Promise<any> {
this.array = [];
try {
const list = xlsx2json.parse(file.path);
// list[0]为Sheet1
const data = [...list[0].data];
const arr = [];
for (let i = 1; i < data.length; i++) {
if (data[i][14] !== 0) {
const type = iconv.decode(data[i][6], 'GBK').split('\t')[0];
const param = {
id: data[i][1],
type: type,
value: data[i][14],
};
arr.push(param);
}
}
this.array = arr;
const dataJson = JSON.stringify(arr);
fs.writeFileSync(`${this.fileAddress}/dataJson.json`, `${dataJson}`);
return {
code: 200,
message: '上传成功',
};
} catch (err) {
return {
code: 503,
msg: `Service error: ${err}`,
};
}
}
}