0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【node.js】CSVファイル読込パッケージ「CSV Parser」・出力機能「CSV stringifier」の紹介およびコード例

Last updated at Posted at 2021-07-30

背景

掲題モジュールを使えば「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/

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?