0
0

Typescript / Javascript:fast-csv で csvを取り込む

Last updated at Posted at 2024-08-09

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' }
]

オブジェクトの配列に無事変換されました。
参考になれば幸いです。

参考

公式ドキュメント

0
0
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
0