0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Redmine の CSV エクスポートデータを登録不要・ブラウザ完結で互換性診断するツールを作ってみた

0
Last updated at Posted at 2026-09-01

長年運用されてきた Redmine からのデータ移行や併走を検討する際、現場で最初に突き当たるのが 「手元の Redmine から吐き出した CSV が新しいツールでちゃんと読み込めるのか?」 という問題です。

特に以下のトラブルが頻発します:

  • 文字コードの不一致: Windows 版 Redmine や Excel 編集による Shift_JIS (CP932) と、Webツールの UTF-8 の違いによる文字化け
  • 必須カラムの欠落: カスタムビューで出力した際に「件名」や「担当者」が含まれていない
  • データセキュリティ: 機密情報を含む社内課題CSVを、見知らぬ外部Webサーバーにアップロードしたくない

そこで今回、社内CSVのテキストデータを外部サーバーに一切送信せず、ブラウザ(Client-side JS)上だけで完結して適合度と文字コードを1秒で無料診断するツールを個人開発して公開しました!


🛠 作ったツール


💡 技術的なこだわりと解決したポイント

1. サーバー送信ゼロの安心セキュリティ

ユーザーがドラッグ&ドロップした CSV ファイルは、File.arrayBuffer() を使用してユーザーのブラウザメモリ上でのみ解析されます。ネットワークリクエストは一切発生しないため、社内セキュリティ基準をクリアした状態で安心して使っていただけます。

2. UTF-8 vs Shift_JIS (CP932) の自律判別ロジック

単なる TextDecoder('utf-8') では、Shift_JIS のバイト配列が偶然 UTF-8 として部分的に合法に見えてしまい、化け文字が生成されてしまう問題がありました。

本ツールでは以下のように TextDecoder('utf-8', { fatal: true }) を使用しています:

let text = '';
let encoding = 'UTF-8';

try {
  // fatal: true を指定すると、UTF-8 構造に違反したバイトで即例外が投げられる
  const utf8Decoder = new TextDecoder('utf-8', { fatal: true });
  text = utf8Decoder.decode(buffer);
  encoding = 'UTF-8';
} catch (e) {
  // UTF-8 違反 ➔ Shift_JIS (CP932/Windows-31J) として安全デコード
  const sjisDecoder = new TextDecoder('shift-jis');
  text = sjisDecoder.decode(buffer);
  encoding = 'Shift_JIS (CP932)';
}

この判定により、Excel で保存された Shift_JIS CSV が 100% 正確に認識され、文字化けを未然に検出・防止します。

3. スコアリングと主要属性マッピング

取り込まれた CSV から「件名/題名」「担当者」「ステータス」「期日」「トラッカー」「優先度」などの必須ヘッダーを自動認識し、100点満点のスコアと改善アドバイスを出力します。


🚀 まとめ

Redmine からの移行や並行運用をお考えのチームは、ぜひお手元の CSV で試してみてください!

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?