JavaScriptで簡単にBOMを取り除く

CSVファイルのセル内にカンマや改行が含まれるCSVファイルの場合はライブラリを使用したほうが良いのですが、簡単なデータの変更をしたい場合は、サクッとコードを書いてしまったほうが楽ですが、日本語が含まれていると文字化けしてしまいます。

今回は、ライブラリを使用しないでJavaScriptやNode.jsでCSVファイルを文字化けせずに読む方法の紹介です。

Excelは、「名前を付けて保存」から「CSV UTF-8(コンマ区切り)(.csv)」を選択して保存します。

そして、このファイルをJavaScriptで読み込むときにBOMを削除してJSONに変換するコードがこちらです。

const {readFileSync} = require("fs");
const listObject = ((list) => {
	list = list.replace(/^\ufeff/,"");   // この行でBOMを削除
	const rows = list.split(/\r\n|\n/);
	const cols = rows.shift().split(",");
	const result = [];
	for(const row of rows) {
		const rowArray = row.split(",");
		const d = {}
		cols.forEach((col,i) => {
			d[col] = rowArray[i];
		})
		result.push(d);
	}
	return result;

})(readFileSync("./remap.csv","utf-8"));

console.log(listObject);

ポイントは3行目です。この処理をせずにプログラムを実行すると、typeだけシングルクオテーションで囲われてしまいます。これはtypeの前に\ufeffという見えない文字がついているためでです。この\ufeffはBOMと呼ばれていて、ファイルの文字コードがUTF-8であることを示すためファイルの先頭に付与されているマークで、それのマークがtypeにくっついて処理されてしまった結果です。正規表現で簡単に取り除けるのでご活用ください。

  {
    'type': 'spec',
    key: 'key',
    category: '3-14',
    showCategory: 'false',
    title: 'User Group',
  },

このプログラムはCSVファイルのセル内に改行やカンマが含まれていると意図しない箇所でデータが切れてしまうので使用できませんのでご注意ください。