ローカルに保存してあるCSVを読込む

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ローカルに保存してあるCSVを読込む</title>
  6. <script type="text/javascript" src="jquery-1.5.1.min.js"></script>
  7. <script type="text/javascript" src="knockout-2.1.0beta.js"></script>
  8. <script type="text/javascript">
  9.   jQuery.extend({
  10.     csv: function(delim, quote, lined) {
  11.       delim = typeof delim == "string" ? new RegExp( "[" + (delim || ","   ) + "]" ) : typeof delim == "undefined" ? ","    : delim;
  12.       quote = typeof quote == "string" ? new RegExp("^[" + (quote || '"'   ) + "]" ) : typeof quote == "undefined" ? '"'    : quote;
  13.       lined = typeof lined == "string" ? new RegExp( "[" + (lined || "\r\n") + "]+") : typeof lined == "undefined" ? "\r\n" : lined;
  14.       function splitline (v) {
  15.         // Split the line using the delimitor
  16.         var arr  = v.split(delim), out = [], q;
  17.         for (var i=0, l=arr.length; i<l; i++) {
  18.           if (q = arr[i].match(quote)) {
  19.             for (j=i; j<l; j++) {
  20.               if (arr[j].charAt(arr[j].length-1) == q[0]) {
  21.                 break;
  22.               }
  23.             }
  24.             var s = arr.slice(i,j+1).join(delim);
  25.             out.push(s.substr(1,s.length-2));
  26.             i = j;
  27.           }
  28.           else {
  29.             out.push(arr[i]);
  30.           }
  31.         }
  32.         return out;
  33.       }
  34.       return function(text) {
  35.         var lines = text.split(lined);
  36.         for (var i=0, l=lines.length; i<l; i++) {
  37.           lines[i] = splitline(lines[i]);
  38.         }
  39.         
  40.         // 最後の行を削除
  41.         var last = lines.length - 1;
  42.         if (lines[last].length == 1 && lines[last][0] == "") {
  43.           lines.splice(last, 1);
  44.         }
  45.         
  46.         return lines;
  47.       };
  48.     }
  49.   });
  50.   function ViewModel() {
  51.     var self = this;
  52.     self.loadFile = ko.observable();
  53.     self.localFile = function(a, b) {
  54.       var fileList = b.target.files;
  55.       
  56.       var reader = new FileReader();
  57.       
  58.       // ファイル読み込み完了時
  59.       reader.onload = function(){
  60.         var obj = $.csv(",", "", "\n")(reader.result);
  61.         a.loadFile(obj);
  62.       }
  63.       
  64.       // ファイルの読み込み
  65.       reader.readAsText(fileList[0], "utf-8");
  66.       // reader.readAsText(fileList[0]); // 文字コードの指定がなくても大丈夫かも。
  67.     };
  68.   }
  69.   $(document).ready(function () {
  70.     ko.applyBindings(new ViewModel());
  71.   });
  72. </script>
  73. <style type="text/css"></style>
  74. </head>
  75. <body>
  76. <h1>ローカルに保存してあるCSVを読込む</h1>
  77. 適当なJSONファイルがなければ右のファイルを保存して試す「<a href="//tips.recatnap.info/sample/testdata/testdataB.txt">JSONファイルのサンプル</a>」
  78. <div style="padding:1em 0;">
  79. <input type="file" data-bind="event: {change: localFile}" />
  80. </div>
  81. ▼読込んだファイルを表示
  82. <div style="padding:0.5em;border:1px solid #ccc; background:#f5f5f5;" data-bind="foreach: loadFile">
  83. <p data-bind="text: $data[0]"></p>
  84. </div>
  85. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  86. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  87. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  88. </div>
  89. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  90. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  91. </div>
  92. </body>
  93. </html>