需求:读取一个csv文件,需要从指定字符串开始读取至指定字符串结束,由于csv文件可能使用不同环境打开编辑过,末尾包含很多多余的分隔逗号,去除这些逗号。
// 使用 Stream
const parse = require('csv-parse');
const path = require('path');
const fs = require('fs');
const fsPromises = fs.promises;
readAndParseCSV();
async function readAndParseCSV() {
try {
// STEP 1: 读取csv文件
const inputFilePath = path.resolve('./DATA/1.csv');
const input = fs.readFileSync(inputFilePath, {encoding: 'utf-8'} )
arr = input.split(/\r?\n/)
for (var i=0; i< arr.length; i++) {
if (arr[i].indexOf('Result ID') != -1) {
startLine = i + 1
} else if (arr[i].indexOf(' These records were obtained from') != -1)
{
endLine = i
}
}
console.log('文件读取起始行:', startLine);
console.log('文件读取结束行:',endLine);
//console.log(arr);
// STEP 2:CSV和 parser
var output = []
const parser = parse({
delimiter: ',',
relax_column_count: true,
trim: true,
from_line: startLine,
to_line: endLine,
skip_empty_lines: true,
});
// STEP 3:读取事件,读取内容存入output
parser.on('readable', function () {
let record;
while ((record = parser.read())) {
output.push(record)
}
});
// STEP 4:捕获错误
parser.on('error', function (err) {
console.error(err.message);
});
// STEP 5:取得 output 的結果
parser.on('end', function () {
//遍历二维数组去除空值
for (var i=0;i<output.length;i++) {
for (var j=0;j<output[i].length;j++) {
if (output[i][j]== 0) {
output[i].splice(j,1);
j=j-1
}
}
if (output[i]== 0) {
output.splice(i,1);
i=i-1
}
}
console.log(output);
});
// STEP 6:放入准备读取的内容
parser.write(input);
// STEP 7:关闭readable stream
parser.end();
} catch (error) {
console.log('error', error);
}
}