无法从节点中的 csv 文件流中读取重音字符

JSA*_*kis 6 javascript csv node.js

开始。我目前正在使用 npm fast-csv,这是一个很好的 CSV 读取器/写入器,非常简单明了。我试图做的是将它与 iconv 结合使用来处理“重音”字符和非 ASCII 字符,并将它们转换为 ASCII 等效字符或根据字符删除它们。

我当前使用 fast-csv 执行的过程是通过读取流引入一个块进行处理(作为一行),暂停读取流,处理数据,将数据通过管道传输到写入流,然后恢复读取流使用回调。Fast-csv 当前知道根据来自读取流的数据格式将数据块分隔到何处。

整个过程是这样的:

var stream = fs.createReadStream(inputFileName);
function csvPull(source) {
    csvWrite = csv.createWriteStream({ headers: true });
    writableStream = fs.createWriteStream(outputFileName);
    csvStream = csv()
        .on("data", function (data) {
            csvStream.pause();
            processRow(data, function () {
                csvStream.resume();
            });
        })
        .on("end", function () {
            console.log('END OF CSV FILE');
        });
    csvWrite.pipe(writableStream);
    source.pipe(csvStream);
}
csvPull(stream);
Run Code Online (Sandbox Code Playgroud)

我目前遇到的问题是,我注意到由于某种原因,当我的 javascript 编译时,它本身并不能识别非 ASCII 字符,所以我不得不使用 npm iconv-lite 来对数据流进行编码进入一些可用的东西。然而,这带来了一个更大的问题,因为由于现在编码的数据,fast-csv 将不再知道在哪里分割块(行)。由于我将使用的 CSV 的大小,这是一个问题;将整个 CSV 加载到缓冲区中然后进行解码将不是一个选项。

有没有关于如何在不将自己的 CSV 解析器写入代码的情况下解决这个问题的建议?

Sha*_*oor 6

binary尝试使用编码选项读取文件。我必须阅读一些带有一些重音字符的 csv,并且效果很好。

var stream = fs.createReadStream(inputFileName, { encoding: 'binary' });
Run Code Online (Sandbox Code Playgroud)


Mat*_*tis 0

除非我误解,否则您应该能够通过将流上的编码设置为utf-8文档)来解决此问题。

对于第一行:

var stream = fs.createReadStream(inputFileName, {encoding: 'utf8'});
Run Code Online (Sandbox Code Playgroud)

如果需要的话:

writableStream = fs.createWriteStream(outputFileName, {defaultEncoding: 'utf8'});
Run Code Online (Sandbox Code Playgroud)

  • 我还尝试直接执行:`fs.createReadStream(inputTestFileName, {encoding: 'utf8' }).pipe(fs.createWriteStream(outputTestFileName, { defaultEncoding: 'utf8' }))`。然而,我引入的字符:“é í ñ”在我的输出文件中被转换为“� � �”。我目前正在尝试使用直接的 .txt 文件。 (2认同)