Skip to content

Instantly share code, notes, and snippets.

@tatsuyasusukida
Last active May 1, 2022 00:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tatsuyasusukida/fae31e4f59b31fc6bc5cb965ad06a875 to your computer and use it in GitHub Desktop.
Save tatsuyasusukida/fae31e4f59b31fc6bc5cb965ad06a875 to your computer and use it in GitHub Desktop.
📙 Node.jsでCSVファイルを読み込む方法

📙 Node.jsでCSVファイルを読み込む方法

この記事のGistページ

この記事について

この記事ではNode.jsで csv-parse を使ってCSVファイルを読み込む方法について紹介します。

おおまかな手順

おおまか手順を下記に示します。

  1. CSVファイルの準備
  2. コーディング
  3. 動作確認

Excelファイルの準備

下表の内容で動作確認用のCSVファイルを作成し、ファイル名をdata.csvとして保存します。なお、CSVファイルは data.csv からもダウンロード可能です。

Header 1,Header 2,Header 3
Row 1 Col 1,Row 1 Col 2,Row 1 Col 3
Row 2 Col 1,Row 2 Col 2,Row 2 Col 3
Row 3 Col 1,Row 3 Col 2,"He said \"Yes, I'm 髙橋.\""

コーディング

ターミナルで下記のコマンドを実行してコーディングの準備をします。

mkdir nodejs-csv-read
cd nodejs-csv-read
npm init -y
npm install --save csv-parse
touch main.js

main.js

エディタでmain.jsを開いて下記の内容を入力します。

クリックしてmain.jsへ移動

ポイントを下記に示します。

  1. CSV解析のオプションを指定するためのオブジェクトを作成します。
  2. csv-parseのparse関数にCSVデータとオプションを渡して呼び出してCSV解析を実行します。
  3. canParse関数ではCSV解析前にCSVが正しい形式になっているかどうかを事前確認するためにcsv-parseのparse関数を呼び出して例外が発生しないかをチェックします。フォームでバリデーションを行う場合に便利です。

動作確認

ターミナルで下記のコマンドを実行して正しく読み込めていることを確認します。特に3行3列目については入念に確認します。

node main.js

実行結果を下記に示します。

[
  [ 'Header 1', 'Header 2', 'Header 3' ],
  [ 'Row 1 Col 1', 'Row 1 Col 2', 'Row 1 Col 3' ],
  [ 'Row 2 Col 1', 'Row 2 Col 2', 'Row 2 Col 3' ],
  [ 'Row 3 Col 1', 'Row 3 Col 2', `He said "Yes, I'm 髙橋."` ]
]

おわりに

アプリの管理画面で何かとお世話になる機会の多いCSVですが書き込みは比較的簡単である一方、読み込みはエスケープなどを考える必要があるのでかなり複雑になります。CSV解析器を自前で実装するのも楽しいですが時間のない時は便利なライブラリを活用して他のもっと楽しいことに時間を費やしたい所です。csv-parseのように目立たないけれど必要とされるライブラリを開発/メンテしている方は本当に凄いと尊敬します。今はGitHubのスターくらいしか差し上げられないですがお金持ちになったらスポンサーしたいと思います。この記事をお読みの方で同じようなオープンソースをご存知の方がいましたらお気軽にコメントをいただければ幸いです。最後までお読みいただきありがとうございました!

関連記事

/node_modules/
/package-lock.json
# Do not ignore package-lock.json other than gist.
We can make this file beautiful and searchable if this error is corrected: Any value after quoted field isn't allowed in line 4.
Header 1,Header 2,Header 3
Row 1 Col 1,Row 1 Col 2,Row 1 Col 3
Row 2 Col 1,Row 2 Col 2,Row 2 Col 3
Row 3 Col 1,Row 3 Col 2,"He said \"Yes, I'm 髙橋.\""
const fs = require('fs')
const path = require('path')
const {parse} = require('csv-parse/sync')
if (require.main === module) {
main()
}
function main () {
const source = path.join(__dirname, 'data.csv')
const buffer = fs.readFileSync(source)
const options = {escape: '\\'} // <1>
const {ok, err} = canParse(buffer, options) // <2>
if (ok) {
const rows = parse(buffer, options) // <3>
console.info(rows)
} else {
console.error(err)
}
}
function canParse (data, options) {
let ok, message
try {
parse(data, options)
return {ok: true, err: null}
} catch (err) {
return {ok: false, err}
}
}
{
"name": "nodejs-csv-read",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"start": "node main.js"
},
"keywords": [],
"author": "tatsuyasusukida",
"license": "MIT",
"dependencies": {
"csv-parse": "^5.0.4"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment