sjisのCSVを1行ずつreadlineする。(nodejs)

JavaScript

エクセルの影響でsjisになっていることが多いcsvですが、これを1行ずつ読み込みつつ処理を加える方法をメモしておきます。

基本的にはnodeに標準のreadlineで1行ずつ読み出せばいいのですが、sjisをutfに変えるためocpmv-liteでdecodeします。

具体例はこちら。
今回はcsvの先頭2行が県コードになるデータを扱っていたため、先頭2文字で分岐してファイルを吐き変えています。

import * as fs from 'fs'
import * as readline from 'readline'

import { decodeStream } from 'iconv-lite'

const rs = fs.createReadStream('./input.csv')

const rl = readline.createInterface({
  input: rs.pipe(decodeStream('Shift_JIS')),
  crlfDelay: Infinity,
})

let prefCode: string | null = null
let writeStream: fs.WriteStream | null = null
rl.on('line', (line) => {
  const code = line.slice(0, 2)

  if (prefCode !== code) {
    prefCode = code
    writeStream = fs.createWriteStream(`./output/${code}.csv`)
  }
  writeStream!.write(line + '\n')
})
rl.on('close', () => {
  console.log('END!')
})

コメント