世界を動かす技術を、日本語で。

CSVファイルを検索可能でフィルタリング可能な美しいHTMLテーブルとして表示する

概要

  • CSVファイル をHTMLテーブルとして美しく表示するJavaScriptツールの使い方を解説
  • 導入手順 ・カスタムフォーマット・デプロイ方法を簡潔に整理
  • Deno/deno-csv によるAPI連携例も紹介
  • トラブルシューティング や依存ライブラリの確認方法を明記
  • GitHub Pages やiframeでの埋め込み方法も説明

CSVファイルをHTMLテーブルとして表示する方法

基本手順

  • リポジトリのクローン

    git clone git@github.com:derekeder/csv-to-html-table.git
    cd csv-to-html-table
    

    クローン・移動すること

  • CSVファイルの配置 data/ フォルダに表示したいCSVファイルを追加すること

  • index.htmlの設定変更 CsvToHtmlTable.init() 関数のオプションを編集すること

    <script>
      CsvToHtmlTable.init({
        csv_path: 'data/Health Clinics in Chicago.csv',
        element: 'table-container',
        allow_download: true,
        csv_options: {separator: ',', delimiter: '"'},
        datatables_options: {"paging": false}
      });
    </script>
    

    設定値を確認・変更すること

オプション一覧

  • csv_path CSVファイルへのパスを指定すること

  • element テーブルを描画するHTML要素ID(デフォルト: table-container)を指定すること

  • allow_download trueでダウンロードリンクを表示すること(デフォルト: false)

  • csv_options jQuery CSVの設定(区切り文字やデリミタ)を指定すること

  • datatables_options DataTablesの設定を指定すること

  • custom_formatting 特定カラムにカスタムフォーマット関数を適用すること

カスタムフォーマット例

  • ハイパーリンクとして表示したい場合 例:4列目をリンク化
    <script>
      function format_link(link){
        if (link) return "<a href='" + link + "' target='_blank'>" + link + "</a>";
        else return "";
      }
      CsvToHtmlTable.init({
        csv_path: 'data/Health Clinics in Chicago.csv',
        element: 'table-container',
        allow_download: true,
        csv_options: {separator: ',', delimiter: '"'},
        datatables_options: {"paging": false},
        custom_formatting: [[4, format_link]]
      });
    </script>
    
    XSS対策としてHTMLエスケープを徹底すること

ローカルでの実行

  • Python2の場合
    python -m SimpleHTTPServer
    
  • Python3の場合
    python -m http.server
    
    ブラウザで http://localhost:8000/ へアクセスすること

デプロイ方法

  • GitHub Pages利用 masterブランチをgh-pagesへpushし、

    git push origin master:gh-pages
    

    http://your-github-username.github.io/csv-to-html-table/ へアクセスすること

  • 一般的なWebサーバ プロジェクト一式(css, data, fonts, js含む)をサーバへアップロードすること

iframeによる埋め込み

  • HTMLに以下を追加
    <iframe style="border-style: none;" src="http://derekeder.github.io/csv-to-html-table/" height="950" width="600"></iframe>
    
    他サイトやダッシュボードへの組み込みを実現すること

依存ライブラリ

  • Bootstrap 4 :レスポンシブ対応
  • jQuery :高速・多機能なJavaScriptライブラリ
  • jQuery CSV :CSVパース用
  • DataTables :高機能テーブル表示

トラブルシューティング

  • データが表示されない場合
    • ChromeデベロッパーツールやFirebugでJavaScriptエラーを確認すること
      • Mac: Option+Command+J
      • Windows: Control+Shift+J
    • エラー行を特定し、修正すること

バグ報告・貢献

  • バグ報告 https://github.com/derekeder/csv-to-html-table/issues で報告すること

  • コントリビューター Derek Eder(主な貢献者)、その他複数名

ライセンス

  • MITライセンス 商用・個人利用が自由なことを確認すること

Deno/deno-csvとAnsible連携によるAPI活用例

  • Deno/deno-csv でCSV更新APIを作成し、Ansible URIモジュールでCSVファイルを更新すること
  • /view でCSVテーブル表示、 /update でCSV更新機能を提供すること
  • 静的サイト機能 を追加し、CSV-to-html-tableで即座に可視化・ダウンロード可能にすること
  • APIとダッシュボードの組み合わせ で運用自動化・可視化を効率化すること
  • sysadminによる実践的な統合例 として参考にすること

この手法により、 CSV管理・可視化自動化連携 を手軽に実現できる提案。

Hackerたちの意見

これをシンプルなAPIと組み合わせて、Deno/deno-csvライブラリを使ってCSVファイルを更新するようにしたんだ。これでAnsibleジョブがAPIを通じて簡単にCSVファイルを更新できるようになって、同じCSVファイルをシンプルでダッシュボードっぽい方法で表示・ダウンロードできるようにしたよ(CSVをHTMLテーブルに変換して)。CopilotがDeno/deno-csvのCSV APIコードを作ってくれて、ちょっとやり取りしたら静的ウェブサイト機能(CSVテーブルを提供するため)を追加したんだ。/viewと/updateのルートも作ったよ。俺はただのシスadminだけど、こういうのを組み合わせるのが大好きなんだ。ありがとう、Derek!

それか、スプレッドシートファイル(CSV、XLS、何でも)をGoogleシートに突っ込んで、ファイル > ダウンロード > ウェブページ(.html)を選ぶといいよ。特にフォーマット(フォント、色、ボーダーなど)がたくさんあるときは…結果がめっちゃいい感じになるよ!

でも、これにはソートやフィルタリングのオプションも含まれてるの?

それか、ターミナルでvisidata(https://www.visidata.org/)を使うのもいいよ。xls/xlsxもサポートしてるし!ターミナルでデータを探るのにお気に入りのツールの一つだね(jq、fx、jetと一緒に)。

それって、Excelみたいに数字を指数に圧縮するやつ?

これ、昔書いたやつなんだ。見返すと、俺って本当にスパゲッティコーダーだな。 https://jsfiddle.net/ypfr98su/5/

スパゲッティコードは過小評価されてるよね。

PowerShellは賛否が分かれるけど、これがすごく役立つところの一つなんだ。Import-CsvとOut-GridViewを使うといい結果が得られるし、メモリから書いたら一行で済むこともあるよ。実際に使えるし、私たちの作業環境に組み込まれているのに、そこにないふりをしていることを思い出させてくれるね。

僕はWindowsを日常的に使ってないから、Import-Csvの存在を先週まで知らなかったんだ。Macで実行したシェルコマンドをペーストして、Windowsで動くように何か書いてくれって頼んだら、Powershellが昔のcmd.exeとどれだけ違うか理解してなかったよ。

PowerShellは、Linuxのワークステーションやジャンプホストに最初にインストールするものだよ。あのImport/Export/Converttoの機能が便利だからね。Import-ExcelモジュールもLinuxで動くし。Invoke-WebRequestが基本的なパースしか使えないのは残念だな。昔はJSで実際のDOMをパースしてたのに、セキュリティの問題だったのかな。

Pwshは実際かなりいいよ。俺の超個人的な意見だけど…Powershellは、3大OSで一貫したスクリプトを書くのに一番簡単な方法だと思う。

PowerShellの力と機能には同時に敬意を表しつつ、なぜかすごく嫌悪感も抱いてる。なんか直感的に嫌いなんだよね。多分、構文のせいかな…それとも、単に昔のWindows管理者としてのトラウマかも…

俺はただのシスadminだけど、こういうのを組み合わせるのが大好きなんだ。俺は開発者で、ものを組み合わせるのが仕事の中で一番好きな部分なんだ。デザインに喜びがあって、実際のコーディングは目的を達成するための手段に過ぎない。タブ形式のデータを扱うために似たようなブラウザツールを書いたことがあるよ。面白いことに、ExcelからHTMLのtextareaにコピー&ペーストすると、タブ区切りのテキストとしてデータが得られるんだ。textareapasteイベントハンドラを追加して、コードでデータを解析すればいいんだ。

ちょっとこれをフォークして、jQueryの依存関係を解決したいな。編集 新しいのを始めた方が簡単かもしれないし、PapaParseを使ってCSVを解析するのもいいかも。

僕も最初にそう思った。でも、属性を通じてCSVのパスを渡せるようにカスタム要素として書くつもり。これがあるとすごく便利そうだし、今はPDF用の似たようなものを作ってるところなんだ。カスタム要素のライブラリを作るのは「すべてが釘」って感じのフェーズだね。

このフォークは実際にはpapaparseを使ってると思う。ちょっと見た目が魅力的じゃないなと思ったし、CSVをダウンロードする機能もなかったんだよね:https://github.com/pavelsr/csv-to-tablesorter

いいね。http://csvbase.com に検索やフィルタリング機能がないのは面白いね。

僕も自分の使い方のためにそれを見たよ。すごくクールだったけど、最初にウェブUIを通じてアップロードしなくてもいいCSVを使いたかったし、ダウンロード可能なものが必要だったから、これがその条件に合ってたんだ。

これいいね。最近似たようなことをする必要があったんだけど、結局Grist CSV Viewer[1]を使ったよ。こっちの方が機能が充実してると思う。ChatGPTにHTMLファイルを作ってもらって、特定のファイルを読み込む代わりにCSVをペーストできるようにしたら、Google SheetsにCSVを読み込むよりも便利で結構うまくいったよ。[1] https://www.getgrist.com/csv-viewer/

これを共有してくれてありがとう!pivottable.jsを使ってるけど、同僚には時々理解しづらいって言われる。Gristも試してみるつもり。

この作業にはsqlite3を使ってる。テキスト専用ブラウザでHTMLを読むから、Javascriptエンジンがないんだ。sqlite3が生成するHTMLテーブルはJavascriptが不要なんだよね。

それが俺の考えだった。Sqlite3+データセットはこれにぴったりだよ。

みんな、こんにちは!このツールの作成者です。10年前に作ったプロジェクトが認識されるなんて、すごく嬉しい!jQueryについてはごめんね。プルリクエスト大歓迎!