LoginSignup
0
0

CSVファイルをFileAPIで読み込む

Posted at

言わずと知れたCSVファイルを、EXCEL等で出力されるシフトJIS形式の状態で読み込めるJavaScriptコードを書いてみます。

実行条件

  • 入力対象となるCSVはソフトJIS形式である。例えば郵便局の郵便番号データを加工無しで読めるようにする。
  • フレームワークは用いずVanillaJSで書く。
  • なるべくシンプルなコードとし装飾も最低限にする。

対象コード

シフトJIS形式によるテキストファイルを読み込む場合、問題になるのは 実際のHTML上で使用されているキャラクターコードとの相違をどうするか? ということです。下記コードにおいては、encoding.jsにより解決しています。

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<script src="https://cdnjs.cloudflare.com/ajax/libs/encoding-japanese/2.0.0/encoding.min.js"></script>
</head>
<body>
	<style>
		table{
			border-left:1px solid #000000;
			border-top:1px solid #000000;
			border-spacing:0;
		}

		table td{
			border-right:1px solid #000000;
			border-bottom:1px solid #000000;
		}
	</style>

	<input type="file" id="csvfile"><br>	<!-- ファイル選択 -->
	<table id="output"></table>				<!-- 出力先 -->

	<script>
		"use strict";

		// ファイルが選択された時
		document.getElementById('csvfile').onchange = e=>{
			const reader = new FileReader();

			// 読込後の処理
			reader.onload = file=>{
				// Shift-JISで読まれたテキストをUNICODE文字列に変換
				const arr = new Uint8Array(file.target.result);
				const text = Encoding.convert(arr,{
					to:"UNICODE",
					from:Encoding.detect(arr),
					type:"string"
				});

				// table要素を取得
				const output = document.getElementById('output');

				// 文字列を1行ずつ処理
				const rows = text.split('\n');
				for(let i = 0;i < rows.length;i++){
					// tr要素作成
					const element = document.createElement("tr");

					// 1行をカンマ分割して1個ずつtd要素で追加
					const cells = rows[i].split(',');
					cells.forEach(cell=>{
						const td = document.createElement("td");
						td.textContent = cell.replaceAll('"','');	// "を除去して設定(手抜き)
						element.appendChild(td);
					});

					// tr要素をtableへ追加
					output.appendChild(element);
				}
			}

			// 選択されたファイルを読む
			reader.readAsArrayBuffer(e.target.files[0]);
		}
	</script>
</body>
</html>
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