はじめに
社内ツールでCSVを読み込んだデータを整形し、別のCSVとして出力する処理を実装する機会がありました。
Node.jsでCSVデータを扱うには、csv-parseやcsv-stringifyなどのライブラリがありますが、今回はライブラリを使わずに自作の処理で実装しました。その内容について紹介します。
💡この記事でわかること
- ライブラリを使うか使わないかの判断ポイント
- 自作CSVデータ処理の実装と注意点
- (参考)ライブラリ選定時のチェックポイント
ライブラリを使うかどうかの判断ポイント
今回の開発で、ライブラリを使うかどうか判断する際に考えた観点をまとめました。
| 観点 | ライブラリ不要 | ライブラリ推奨 |
|---|---|---|
| 実装コスト | 数行〜数十行で書ける | 複雑で自作すると大変 |
| データ形式 | 固定フォーマット(自社システム出力など) | 形式が不明・不安定(外部サービスや顧客提供データなど) |
| データ内容 | 特殊文字なし | 特殊文字あり |
今回の要件と判断
今回のCSVには以下の特徴がありました。
- 社内で用意した固定のフォーマット
- フィールド内にカンマや改行などの特殊文字を含まない
ライブラリを導入すると、アップデート対応や脆弱性チェックなどの管理コストも発生するので、今回はそこまでする必要はないと判断しました。
自作処理の実装
実装したのは、変換処理と出力用処理の2つです。例として、書籍データを扱うことにします。
CSVデータ変換処理
/** CSVテキストを配列として返す */
export const parseCsvText = (csvText: string) => {
const csvData = csvText.split('\n').map((row) => row.split(','));
return csvData;
};
CSV出力用処理
/** 書籍データの型 */
interface BookType {
title: string;
author: string;
publishedYear: number;
}
/** CSVヘッダー */
const CSV_HEADERS = ['タイトル', '著者', '出版年'];
/** 書籍データをCSV形式の文字列に変換する */
export const convertToCsvRows = (items: BookType[]) => {
const header = CSV_HEADERS.join(',');
const rows = items.map((item) => {
return [item.title, item.author, item.publishedYear].join(',');
});
return [header, ...rows].join('\n');
};
自作処理の注意点
今回の自作CSV処理では、以下のケースには対応していません。
フィールド内にカンマがある場合
"入門書","山田, 太郎",2024
→ parseCsvTextでは山田, 太郎が分割されてしまう
フィールド内に改行がある場合
"入門書
改訂版","山田太郎",2024
→ 2行に分割されてしまう
もし外部から受け取るCSVを扱うなら、不明な形式を多くカバーできるライブラリを使った方が良さそうです。
参考:ライブラリを使う場合
ライブラリ選定時のチェックポイント
以下のサイトを参考に、ライブラリを選びました。
以下の観点を確認すると、ライブラリの選択に役立ちそうです。
| 観点 | 確認方法 | 判断基準 |
|---|---|---|
| ダウンロード数 | npm trends | 多いほど信頼性が高い傾向。ダウントレンドでないか |
| バージョン | npm trends | メジャーバージョン(1.x以上)かどうか |
| 最終更新日 | npm trends / GitHub | 直近でメンテナンスされているか |
| スター数 | GitHub | コミュニティの支持があるか |
npm trendsでCSVライブラリを調べる
npm trends で主なCSVライブラリを比較した結果です。
参考の記事にもありますが、グラフの右側が下がっているのは年末だからです。
まとめ
- 固定フォーマットで特殊文字なしなら自作でも十分
- 外部のデータや形式が不安定なデータや特殊文字を含む場合ライブラリが安全
参考

