Typescript環境でcsvを取り込みたい
管理画面系の開発をしていると、csvファイルを読み込みDBに保存するといった場面によく出会います。
私も最近 Nodejs を利用した開発でそのような機会があり、fast-csvというライブラリを用いたところ思ったより簡単に実装できたので、実際のコードと共に残しておきます。
typescriptの実行環境作成は以下記事などが参考になると思います。
実装
実行環境
yarn: v1.22.22
node: v20.10.0
ts-node: v10.9.2
fast-csvをインストール
parseを利用するので、devDependenciesにparseもインストールしました。
command
yarn add fast-csv
yarn add @fast-csv/parse
ディレクトリ構成
※ package.json等は省略
csv-sample
├─ test.ts
└─ test.csv
コード
test.csv
csvヘッダー項目1,csvヘッダー項目2,csvヘッダー項目3,csvヘッダー項目4
AAA,BBB,CCC,DDD
111,222,333,444
test.ts
import { parseString } from '@fast-csv/parse';
import fs from 'fs';
// csvをstringに変換
const CSV_STRING = fs.readFileSync('./test.csv', 'utf8');
// csvのヘッダー項目
type ColumnType = {
'csvヘッダー項目1': string,
'csvヘッダー項目2': string,
'csvヘッダー項目3': string,
'csvヘッダー項目4': string,
}
// 変換後のオブジェクトtype定義
type Row = {
db_1: string,
db_2: string,
db_3: string,
db_4: string,
}
export const parseCsv = async (csv: string): Promise<Row[]> => {
const rows: Row[] = [];
for await (const data of parseString<ColumnType, Row>(csv, {
headers: true,
}).transform(
(data: ColumnType): Row => ({
db_1: data['csvヘッダー項目1'],
db_2: data['csvヘッダー項目2'],
db_3: data['csvヘッダー項目3'],
db_4: data['csvヘッダー項目4']
}),
)) {
rows.push(data);
}
return rows;
};
// 呼び出し
parseCsv(CSV_STRING).then((data) => {
console.log(data);
})
実行結果
command
> npx ts-node test.ts
[
{ db_1: 'AAA', db_2: 'BBB', db_3: 'CCC', db_4: 'DDD' },
{ db_1: '111', db_2: '222', db_3: '333', db_4: '444' }
]
オブジェクトの配列に無事変換されました。
参考になれば幸いです。
参考
公式ドキュメント