excelとかの重複データをカウントしたい

2011/01/28

やりたいことは下記。

りんご
みかん
りんご
きうい
りんご
みかん

↓↓↓

りんご 3
みかん 2
きうい 1

色々調べたけど途中で力尽きた。
だから、javascriptに力を借りることに。

流れとして、入力したデータをユニークにする。次にカウント。最後に出力。

とりあえずサンプル。
excelとかの重複データを含めてカウントする
※firefoxでしか動作チェックしていません。

入力したデータをユニークにする

ちょっと詳細にすると、重複していないユニーク値をキーに連想配列作成。値は全部数値で「0」。

  1. // カウントしたいデータ
  2. exlVal = new Array(‘りんご’,’みかん’,’りんご’,’きうい’);
  3.  
  4. unqAry = new Array();
  5. for( i=0; i<exlVal.length; i++ ){
  6.  if( exlVal[i] != “” ){
  7.   if( i == 0 ){
  8.    uKey = exlVal[i];
  9.    unqAry[uKey] = 0;
  10.   }else{
  11.    same = 0;
  12.    sLop:for( j=0; j<unqAry.length; j++ ){
  13.     if( exlVal[i] == unqAry[j] ){
  14.      same = 1;
  15.      break sLop;
  16.     }
  17.    }
  18.    if( same == 0 ){
  19.     uKey = exlVal[i];
  20.     unqAry[uKey] = 0;
  21.    }
  22.   }
  23.  }
  24. }

これで、下記のような連想配列ができる。

unqAry[‘りんご’] = 0
unqAry[‘みかん’] = 0
unqAry[‘きうい’] = 0

次にカウント

元データをキーに「+1」する。

  1. for( i=0; i<exlVal.length; i++ ){
  2.  if( exlVal[i] != “” ){
  3.   uKey = exlVal[i];
  4.   unqAry[uKey]++;
  5.  }
  6. }

これで、結果になる。

unqAry[‘りんご’] = 2
unqAry[‘みかん’] = 1
unqAry[‘きうい’] = 1

最後に出力

excelにコピペするようにタブ切りにしておく。
連想配列の値とキーを両方を出力したいから、「for in」を使う。

今回の場合、「unqAry」という配列のキーを「k」とする的な感じ(?)にすると下記のようになる。

  1. tmpVal = “”;
  2. for ( var k in unqAry ){
  3.  tmpVal += k + “\t” + unqAry[k] + “\n”;
  4. }

サンプルです
excelとかの重複データを含めてカウントする
※firefoxでしか動作チェックしていません。

オリジナルのソースは下記。

  1. <script type="text/javascript"><!–
  2.  function outputTEXT(){
  3.   tmpForm = document.getElementById('iptForm'); //<form id="xxxx">の読み込み
  4.   
  5.   // 値
  6.   if( tmpForm.exlDat.value != "" ){
  7.    exlVal = tmpForm.exlDat.value.split("\n");
  8.   }else{
  9.    alert("データがはいっていない");
  10.    return false;
  11.   }
  12.   
  13.   // ユニークのみ連想配列にし、値を0。
  14.   unqAry = new Array();
  15.   for( i=0; i<exlVal.length; i++ ){
  16.    if( exlVal[i] != "" ){
  17.     if( i == 0 ){
  18.      uKey = exlVal[i];
  19.      unqAry[uKey] = 0;
  20.     }else{
  21.      same = 0;
  22.      sLop:for( j=0; j<unqAry.length; j++ ){
  23.       if( exlVal[i] == unqAry[j] ){
  24.        same = 1;
  25.        break sLop;
  26.       }
  27.      }
  28.      if( same == 0 ){
  29.       uKey = exlVal[i];
  30.       unqAry[uKey] = 0;
  31.      }
  32.     }
  33.    }
  34.   }
  35.   
  36.   // カウントしていく。
  37.   for( i=0; i<exlVal.length; i++ ){
  38.    if( exlVal[i] != "" ){
  39.     uKey = exlVal[i];
  40.     unqAry[uKey]++;
  41.    }
  42.   }
  43.   
  44.   // キーと値を出力
  45.   tmpVal = "";
  46.   tblVal = "";
  47.   for ( var k in unqAry ){
  48.    tblVal += k + "\t" + unqAry[k] + "\n";
  49.   }
  50.   
  51.   rTAG = '';
  52.   
  53.   rTAG += '<hr>' + "\n";
  54.   rTAG += '<textarea>' + "\n";
  55.   rTAG += tblVal;
  56.   rTAG += '</textarea>' + "\n";
  57.   
  58.   document.getElementById("outBox").innerHTML = rTAG;
  59.   
  60.  }
  61.  
  62. </script>
  63.  
  64. <h2>データを記載</h2>
  65. <form name="iptForm" id="iptForm" action="#">
  66. ▼データをコピペして、「カウント」ボタンを押す<br>
  67. <textarea id="exlDat" style="width:99%;height:10em;"></textarea><br>
  68. <br>
  69. <input type="submit" name="submit" value="カウント" onClick="outputTEXT();return false;">
  70. <input type="reset"><br>
  71. </form>
  72.  
  73. <div id="outBox"></div>
  74.  
  75. <hr>
  76. <a href="https://tips.recatnap.info/">PCスキルの小技・忘却防止メモ</a>

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい