エクセルの影響で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!')
})
コメント