🚈

Vue3+csvtojsonでCSVアップロードと表表示

2024/01/21に公開

やりたいこと

Vue3プロジェクトにCSVファイルをアップロードして表に表示するサイトを作ってみます。csvtojson パッケージを使用してCSVデータをJSONに変換し、Vue.jsコンポーネントで表示します。

csvtojsonインストール

npm install csvtojson

テンプレート

<template>
  <div>
    <!-- ファイルアップロード用のinput要素 -->
    <input type="file" @change="handleFileUpload" />

    <!-- CSVデータを表示する表 -->
    <table v-if="csvData.length > 0">
      <thead>
        <tr>
          <!-- ヘッダー行 -->
          <th v-for="(value, key) in csvData[0]" :key="key">{{ key }}</th>
        </tr>
      </thead>
      <tbody>
        <!-- データ行 -->
        <tr v-for="(row, index) in csvData" :key="index">
          <td v-for="(value, key) in row" :key="key">{{ value }}</td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

スクリプト

<script setup>
import { ref } from 'vue'
import * as csvtojson from 'csvtojson'

const csvData = ref([])

// ファイルアップロード時の処理
const handleFileUpload = (event) => {
  const file = event.target.files[0]

  if (file) {
    const reader = new FileReader()

    reader.onload = async (e) => {
      const content = e.target.result
      // CSVデータをJSONに変換
      csvData.value = await csvtojson().fromString(content)
    }

    reader.readAsText(file)
  }
}
</script>

ヘッダーのないCSVを読み込むとき

csvtojson({ noheader: true })とすればヘッダーなしで1行目からボディに変換されます。

カスタムヘッダー

{ noheader: true }と併せて使う場合が多いと思います。
好きなヘッダーを設定できます。

// カスタムヘッダーの定義
const customHeaders = ['name', 'age'];

// CSVデータをJSONに変換
csvData.value = await csvtojson({ headers: true, headers: customHeaders }).fromString(content)

日本語が文字化けするとき

CSVファイルがShift_JISで保存されていることが原因であることが多いです。その場合はreader.readAsText(file, 'Shift_JIS')として文字コードを指定することで文字化けを防げます。

Discussion