我在ubuntu上使用的是 node 18.7.我正在try 将一堆CSV文件解析为对象(使用csv-parse),最终加载到数据库中.因为有大量这样的文件,所以我决定try 一下流,并且我想使用异步等待方式.

基于Using async/await syntax with node stream,我已将我的代码更改为

   const { parse } = require('csv-parse');
const path = __dirname + '/file1.csv';
const opt = { columns: true, relax_column_count: true, skip_empty_lines: true, skip_records_with_error: true };
console.log(path);
const { pipeline } = require('node:stream/promises');

 async function readByLine(path, opt) {
    const readFileStream = fs.createReadStream(path);
    const writeFileStream = fs.createWriteStream(__dirname + '/file2');
    var csvParser = parse(opt, function (err, records) {
        if (err) throw err;
    });
   await pipeline(readFileStream, csvParser, writeFileStream);

}

readByLine(path, opt);

当我运行该文件时,我得到:

TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be of type string or an instance of Buffer or Uint8Array. Received an instance of Object
at new NodeError (node:internal/errors:387:5)
at _write (node:internal/streams/writable:315:13)
at Writable.write (node:internal/streams/writable:337:10)
at Parser.ondata (node:internal/streams/readable:766:22)
at Parser.emit (node:events:513:28)
at Readable.read (node:internal/streams/readable:539:10)
at Parser.<anonymous> (/home/gmail-username/node/maricopa/node_modules/csv-parse/dist/cjs/index.cjs:1357:28)
at Parser.emit (node:events:513:28)
at emitReadable_ (node:internal/streams/readable:590:12)
at process.processTicksAndRejections (node:internal/process/task_queues:81:21) {
code: 'ERR_INVALID_ARG_TYPE'
}

我怎么才能解决这个问题呢?

推荐答案

object mode里有Reads from the csvParser stream个.

fs.writeStream需要向其写入字符串/缓冲区.

通过设置writableObjectMode选项,可以实现一个简单的transform stream来将对象转换为JSON字符串:

class JsonTransform extends Transform {
    constructor(opt) {
        super(Object.assign({}, { writableObjectMode: true }, opt));
    }
    _transform(obj, enc, callback) {
        let ret = JSON.stringify(obj) + '\n'
        this.push(ret)
        callback()
    }
}

然后在解析+文件写入之间使用它.

const toJSON = new JsonTransform()
await pipeline(readFileStream, csvParser, toJSON, writeFileStream);

我相信CSV Stringify项目与编写CSV类似.

Javascript相关问答推荐

无法检测卡片重叠状态的问题

对网格项目进行垂直排序不起作用

将内容大小设置为剩余可用空间,但如果需要,可在div上显示滚动条

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

Use Location位置成员在HashRouter内为空

TypeError:无法读取未定义的属性(正在读取';宽度';)

一个实体一刀VS每个实体多刀S

当代码另有说明时,随机放置的圆圈有时会从画布上消失

背景动画让网站摇摇欲坠

P5JS-绘制不重叠的圆

ComponentWillReceiveProps仍在React 18.2.0中工作

P5play SecurityError:无法从';窗口';读取命名属性';Add';:阻止具有源的帧访问跨源帧

Promise.race()返回已解析的promise ,而不是第一个被拒绝的promise

使用jQuery每隔几秒钟突出显示列表中的不同单词

如果我将高度设置为其内容的100%,则在Java脚本中拖动以调整面板大小时会冻结

如何在preLoad()中自定义p5.js默认加载动画?

我在JS代码中收到超过最大调用堆栈大小的错误,但我找不到原因.有谁能帮我搬一下吗?

当触发AJAX POST请求时,绕过对PHP生成的表的加载函数

如何在Angular中分离桌面和移动页面并延迟加载每个页面?

如何在 map 中显示美国州/加拿大省的缩写-第1部分?