Kevin's Data Analytics Blog

データサイエンティスト、AIエンジニアを目指す方に向けて情報発信していきます。

Webページ上でCSVデータを表示・検索するHTML/JavaScript

CSVファイルから読み込んだテーブルデータをWebページ上に表示して、テーブル内の文字を検索するための、HTML/JavaScriptを紹介します。
f:id:dskevin:20211128172158p:plain:h160

HTMLコード

以下の処理を行います。

  • 検索ボックスで文字列を受取る
  • JavaScriptを実行
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>NPB 投手成績一覧 2009年~2021年</title>
</head>
<body>
    <h1>NPB 投手成績一覧 2009年~2021年</h1>
    <!--検索入力-->
    <form action="#">
    <input type="text" name="search" value="" id="search" />
    </form>
    <!--テーブル表示-->
    <table border="1" id="result">
        <tbody id="data_csv"></tbody>
    </table>
    <!--JavaScript-->
    <script type="text/javascript" src='./table_data_search.js'></script><!--JavaScriptを指定-->
    <script>
        getCsvData('http://127.0.0.1:5500/npb_stats_pitcher_utf8.csv');<!--CSVデータを指定-->
    </script>
</body>
</html>

 

JavaScriptコード

以下の処理を行います。

  • CSVファイルの読み込み
  • HTMLのテーブル形式に変換
  • レコード検索機能
// レコード検索処理
window.addEventListener( "DOMContentLoaded", 
    function(){
        const search = document.forms[ 0 ].search;
        const table = document.querySelector( "table" );
        const nohit = table.parentNode.insertBefore(document.createElement( "div" ), table.nextNode);
        nohit.textContent = "該当なし";
        nohit.style.display = "none";
        search.oninput = function(){
            const key = search.value.replace( /([\\\*\+\.\?\{\}\(\)\[\]\^\$\-\|\/])/g, "\\$1" );
            let hit = 0;
            [].forEach.call( table.rows,
                function( row, index ){
                    if( index==0 ){ return false }
                    row.style.display = [].some.call( row.cells,
                        function( cell ){
                            return ( new RegExp( key ) ).test( cell.textContent );
                        }
                    ) ? "table-row" : "none" ;
                    row.style.display=="table-row" ? hit++ : hit ;
                }
            );
            nohit.style.display = hit ? "none" : "block" ;
        }
    },
    false
);

const outputElement = document.getElementById('data_csv');

// CSVデータの読み込み
function getCsvData(dataPath) {
    const request = new XMLHttpRequest();
    request.addEventListener('load',
        (event) => {
            const response = event.target.responseText;
            convertArray(response);
        }
    );
    request.open('GET', dataPath, true);
    request.send();
}

// CSVデータをHTMLのテーブル形式に変換
function convertArray(data) {
    const dataArray = [];
    const dataString = data.split('\n');
    for (let i = 0; i < dataString.length; i++) {
        dataArray[i] = dataString[i].split(',');
    }
    let insertElement = '';
    dataArray.forEach(
        (element) => { insertElement += '<tr>';
            element.forEach(
                (childElement) => { insertElement += `<td>${childElement}</td>` }
            );
            insertElement += '</tr>';
        }
    );
    outputElement.innerHTML = insertElement;
}

 

表示イメージ

検索ボックスに値を入れるとその文字列を含む行が表示されます。




チーム背番号選手名防御率試合勝利敗北セーブホールド勝率打者投球回被安打本塁打与四球死球奪三振失点自責点WHIPDIPS
2021巨人11平内 龍太14.4030100.000245.082205882.007.52
2021巨人12デラロサ2.8346107131.00017541.13831223415131.213.43
2021巨人15サンチェス4.68145500.50031773.082132335440381.445.02
2021巨人17大竹 寛3.8640001.000112.150000112.143.12
2021巨人18菅野 智之3.19196700.462465115.2901525710241410.993.85
2021巨人19山崎 伊織------------------
2021巨人20戸郷 翔征4.27269800.529639151.21301958613875721.244.16
2021巨人21井納 翔一14.4050100.000265.0113105882.409.52
2021巨人23野上 亮磨1.6590114.0006316.1816015330.863.00
2021巨人26今村 信貴2.71173400.42927463.06652235921191.403.47
2021巨人30鍵谷 陽平3.1959301151.00018242.13951803019151.354.51
2021巨人33太田 龍------------------
2021巨人35桜井 俊貴5.402910061.00014533.13571612020201.536.09
2021巨人41中川 皓太2.475843125.57122054.24721054917151.042.57
2021巨人42メルセデス3.77177500.58336986.09652257436361.373.06
2021巨人45畠 世周3.075243111.57139096.283132549737331.123.73
2021巨人46鍬原 拓也------------------
2021巨人47髙橋 優貴3.392711900.550598140.2125186127657531.325.00
2021巨人49ビエイラ2.935603191.00022855.13832616418181.162.98
2021巨人50戸根 千明4.822920101.00016137.12542433620201.314.75
2021巨人53高梨 雄平3.695522120.50017139.03422154717161.413.07
2021巨人54直江 大輔4.9140110.0005111.0151424661.735.21
2021巨人56伊藤 優輔------------------
2021巨人57高木 京介4.421510011.0008118.12217015991.583.34
2021巨人58山本 一輝------------------
2021巨人59田中 豊樹2.84390002.00015238.02252013713121.114.38
2021巨人62横川 凱3.3820100.000378.092209431.384.87
2021巨人63古川 侑利18.0010000.000112.031310443.0014.12
2021巨人64大江 竜聖4.094700013.00014533.02921722316151.394.15
2021巨人90戸田 懐生0.0030000.000123.030100001.334.12
2021巨人91井上 温大------------------
2021巨人92沼田 翔平7.7120000.000112.131103221.716.12
2021巨人95堀岡 隼人------------------
2021巨人99山口 俊3.56152800.20033778.16663738334311.313.49


 
なお、 上記のデータは、以下のサイトから取得しました。
読売ジャイアンツ投手成績 - プロ野球データFreak

まとめ

JavaScriptを使うことで、Webページ上の表示をユーザの操作に合わせて動的に変えられます。このとき、別のページに遷移する場合に比べて、動作が軽いのが特徴です。実際の業務において、社内の情報共有サイトにデータを載せる際に、このような検索機能を付けたところ好評でした。

また、これからHTML/JavaScriptを使ってみたいという方に向けて、環境の設定方法から実装までの様子を動画にまとめました。よければこちらもご確認ください。
youtu.be


本記事が皆様のお役に立てば幸いです。最後まで読んでいただき、ありがとうございました!