Pirikara
Pirikara

Reputation: 353

Trying to convert CSV's charactor codes in Nodejs but not working well

I'm attempting to convert csv-file's charactor codes. For example, from "utf8" to "shift-jis" etc... But my code is not working well.

Can you give me advices about my code??

const fs = require("fs");
const iconv = require("iconv-lite");

convertCsvFile(filepath, encoding){
  return new Promise(resolve => {
    const streamReader = fs.createReadStream(filepath)
    const streamWriter = fs.createWriteStream(filepath)

    streamReader
      .pipe(iconv.decodeStream(encoding))
      .pipe(streamWriter)
    streamWriter.on('finish', () => {
      resolve(filepath)
    })
  }
}

await createCsvFile(path/to/csvfile, encoding)

return path/to/csvfile;

I expect this codes to receive csv-filepath and convert its encoding, and return the same csv-filepath. But it returns none.

Upvotes: 1

Views: 608

Answers (1)

Terry Lennox
Terry Lennox

Reputation: 30725

I think reading and writing from the same stream will cause you problems. You could try writing to a separate file, this should be more reliable.

For example:

const fs = require("fs");
const iconv = require("iconv-lite");

function convertCsvFile(filepath, encoding, outputFile) {
    return new Promise(resolve => {
        const streamReader = fs.createReadStream(filepath)
        const streamWriter = fs.createWriteStream(outputFile)

        streamReader
        .pipe(iconv.decodeStream(default encoding))
        .pipe(iconv.encodeStream(encoding))
        .pipe(streamWriter)
        streamWriter.on('finish', () => {
        resolve(filepath)
        })
    });
}

async function testConvertCsvFile(pathToCsvFile, encoding, outputFile) {
    let filePath = await convertCsvFile(pathToCsvFile, encoding, outputFile)
    console.log( { filePath });
    return filePath;
}

testConvertCsvFile("./csv-file-input.csv", "ascii", "./csv-file-output.csv");

Upvotes: 2

Related Questions