toolkit/javascript/d3/src/csv/parse.js
changeset 47 c0b4a8b5a012
equal deleted inserted replaced
46:efd9c589177a 47:c0b4a8b5a012
       
     1 d3.csv.parse = function(text) {
       
     2   var header;
       
     3   return d3.csv.parseRows(text, function(row, i) {
       
     4     if (i) {
       
     5       var o = {}, j = -1, m = header.length;
       
     6       while (++j < m) o[header[j]] = row[j];
       
     7       return o;
       
     8     } else {
       
     9       header = row;
       
    10       return null;
       
    11     }
       
    12   });
       
    13 };
       
    14 
       
    15 d3.csv.parseRows = function(text, f) {
       
    16   var EOL = {}, // sentinel value for end-of-line
       
    17       EOF = {}, // sentinel value for end-of-file
       
    18       rows = [], // output rows
       
    19       re = /\r\n|[,\r\n]/g, // field separator regex
       
    20       n = 0, // the current line number
       
    21       t, // the current token
       
    22       eol; // is the current token followed by EOL?
       
    23 
       
    24   re.lastIndex = 0; // work-around bug in FF 3.6
       
    25 
       
    26   /** @private Returns the next token. */
       
    27   function token() {
       
    28     if (re.lastIndex >= text.length) return EOF; // special case: end of file
       
    29     if (eol) { eol = false; return EOL; } // special case: end of line
       
    30 
       
    31     // special case: quotes
       
    32     var j = re.lastIndex;
       
    33     if (text.charCodeAt(j) === 34) {
       
    34       var i = j;
       
    35       while (i++ < text.length) {
       
    36         if (text.charCodeAt(i) === 34) {
       
    37           if (text.charCodeAt(i + 1) !== 34) break;
       
    38           i++;
       
    39         }
       
    40       }
       
    41       re.lastIndex = i + 2;
       
    42       var c = text.charCodeAt(i + 1);
       
    43       if (c === 13) {
       
    44         eol = true;
       
    45         if (text.charCodeAt(i + 2) === 10) re.lastIndex++;
       
    46       } else if (c === 10) {
       
    47         eol = true;
       
    48       }
       
    49       return text.substring(j + 1, i).replace(/""/g, "\"");
       
    50     }
       
    51 
       
    52     // common case
       
    53     var m = re.exec(text);
       
    54     if (m) {
       
    55       eol = m[0].charCodeAt(0) !== 44;
       
    56       return text.substring(j, m.index);
       
    57     }
       
    58     re.lastIndex = text.length;
       
    59     return text.substring(j);
       
    60   }
       
    61 
       
    62   while ((t = token()) !== EOF) {
       
    63     var a = [];
       
    64     while ((t !== EOL) && (t !== EOF)) {
       
    65       a.push(t);
       
    66       t = token();
       
    67     }
       
    68     if (f && !(a = f(a, n++))) continue;
       
    69     rows.push(a);
       
    70   }
       
    71 
       
    72   return rows;
       
    73 };