背景
掲題モジュールを使えば「CSVを取得して読み込む時はカンマでsplitして…」といった面倒な処理から解放されたため、自身のメモ代わりに共有する。
二次元配列または連想配列の配列のように取得することができるため、肝心の実装に注力することができる。
公式ページ
CSV Parser for Node.js
CSV stringifier for Node.js
csv-parse実装例
■元データ
A列, B列, C列
1, 2, 3
といったCSVファイルがあるとする。
const csvParseSync = require('csv-parse/lib/sync') // requiring sync module
const fs = require('fs')
let path = '/any/'
let filename = 'test.csv'
// ファイル読込。パスやファイルネームはここでは仮。
let buffer = fs.readFileSync(path + filename )
// CSV変換
let csvResult = csvParseSync(text)
// 結果出力
console.log(csvResult )
■出てくるであろう結果
[
['A列', 'B列', 'C列'],
['1', '2', '3']
]
上記のように二次元配列として取得できる。
csv-stringify実装例
■元データ
[
['A列', 'B列', 'C列'],
['1', '2', '3']
]
上記のような二次元配列をCSV化したいとする。
const fs = require('fs')
const stringify = require('csv-stringify/lib/sync')
let outputArray =
[
['A列', 'B列', 'C列'],
['1', '2', '3']
]
// 二次元配列をCSV向けテキスト化
let resultCSV = stringify(inputArray)
let path = '/any/'
let filename = 'test.csv'
// ファイル書込。パスやファイルネームはここでは仮。
fs.writeFileSync(path + filename , resultCSV )
■期待されるであろう結果
A列, B列, C列
1, 2, 3
上記のようなCSVを出力することができる。
その他留意すべきこと
sync(同期的)モジュールとasync(非同期的)モジュールがあることを理解する
本記事にて紹介している2機能とも同期的・非同期的モジュールがそれぞれ用意されている。
上記例にて用いている例がsync(同期)であるように、単純で使いやすいのはsync(同期)である。
公式(+Google自動翻訳)では同期APIについて、以下のように書かれている。
レコードの完全なデータセットを受け入れ、完全な結果セットを返します。
これは、関数への通常の直接同期呼び出しを表します。レコードを渡すと、CSVテキストが返されます。単純であるため、スケーラビリティが不要で、データセットがメモリに収まる場合は、これが推奨されるアプローチです。
optionを活用
要件や実装によっては、初期設定にてマッチしないケースが考えられるだろう。
その時はoptionを見て解決できないかを判断しても良い。
以下は便利だなと思ったオプションを一部紹介する。
- csv-parseのオプション:endoding
https://csv.js.org/parse/options/encoding/
bufferとなっているデータについて、encodingにもとづいて出力してくれる。
bom付きなども判定できる。
- csv-parseのオプション:relax_column_count
https://csv.js.org/parse/options/relax_column_count/
レコード間でフィールド数が一貫していない場合、許容するかどうかを設定できる。デフォルトはfalse。
- csv-stringifyのオプション:quoted_empty
https://csv.js.org/stringify/options/quoted_empty/
nullやundefinedを空文字に変換してくれる。
- 双方のモジュールにあるオプション:columns
https://csv.js.org/parse/options/columns/
二次元配列ではなく、連想配列の配列のように変換してくれる。列変更が楽になりそう。
ただし1行目が日本語ヘッダーの場合、連想配列のキーとしてはよろしくない可能性がある。
キー名が何かを明示的に設定した後、オプションfrom_lineと併用することが望ましいと考えられる。
https://csv.js.org/parse/options/from_line/