|
4937 | 4937 | dy: dy |
4938 | 4938 | }; |
4939 | 4939 | } |
4940 | | - d3.csv = function(url, callback) { |
4941 | | - d3.text(url, "text/csv", function(text) { |
4942 | | - callback(text && d3.csv.parse(text)); |
4943 | | - }); |
4944 | | - }; |
4945 | | - d3.csv.parse = function(text) { |
4946 | | - var header; |
4947 | | - return d3.csv.parseRows(text, function(row, i) { |
4948 | | - if (i) { |
4949 | | - var o = {}, j = -1, m = header.length; |
4950 | | - while (++j < m) o[header[j]] = row[j]; |
4951 | | - return o; |
4952 | | - } else { |
4953 | | - header = row; |
4954 | | - return null; |
4955 | | - } |
4956 | | - }); |
4957 | | - }; |
4958 | | - d3.csv.parseRows = function(text, f) { |
4959 | | - var EOL = {}, EOF = {}, rows = [], re = /\r\n|[,\r\n]/g, n = 0, t, eol; |
4960 | | - re.lastIndex = 0; |
4961 | | - function token() { |
4962 | | - if (re.lastIndex >= text.length) return EOF; |
4963 | | - if (eol) { |
4964 | | - eol = false; |
4965 | | - return EOL; |
4966 | | - } |
4967 | | - var j = re.lastIndex; |
4968 | | - if (text.charCodeAt(j) === 34) { |
4969 | | - var i = j; |
4970 | | - while (i++ < text.length) { |
4971 | | - if (text.charCodeAt(i) === 34) { |
4972 | | - if (text.charCodeAt(i + 1) !== 34) break; |
4973 | | - i++; |
| 4940 | + function d3_dsv(delimiter, mimeType) { |
| 4941 | + var reParse = new RegExp("\r\n|[" + delimiter + "\r\n]", "g"), reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0); |
| 4942 | + function dsv(url, callback) { |
| 4943 | + d3.text(url, mimeType, function(text) { |
| 4944 | + callback(text && dsv.parse(text)); |
| 4945 | + }); |
| 4946 | + } |
| 4947 | + dsv.parse = function(text) { |
| 4948 | + var header; |
| 4949 | + return dsv.parseRows(text, function(row, i) { |
| 4950 | + if (i) { |
| 4951 | + var o = {}, j = -1, m = header.length; |
| 4952 | + while (++j < m) o[header[j]] = row[j]; |
| 4953 | + return o; |
| 4954 | + } else { |
| 4955 | + header = row; |
| 4956 | + return null; |
| 4957 | + } |
| 4958 | + }); |
| 4959 | + }; |
| 4960 | + dsv.parseRows = function(text, f) { |
| 4961 | + var EOL = {}, EOF = {}, rows = [], n = 0, t, eol; |
| 4962 | + reParse.lastIndex = 0; |
| 4963 | + function token() { |
| 4964 | + if (reParse.lastIndex >= text.length) return EOF; |
| 4965 | + if (eol) { |
| 4966 | + eol = false; |
| 4967 | + return EOL; |
| 4968 | + } |
| 4969 | + var j = reParse.lastIndex; |
| 4970 | + if (text.charCodeAt(j) === 34) { |
| 4971 | + var i = j; |
| 4972 | + while (i++ < text.length) { |
| 4973 | + if (text.charCodeAt(i) === 34) { |
| 4974 | + if (text.charCodeAt(i + 1) !== 34) break; |
| 4975 | + i++; |
| 4976 | + } |
4974 | 4977 | } |
| 4978 | + reParse.lastIndex = i + 2; |
| 4979 | + var c = text.charCodeAt(i + 1); |
| 4980 | + if (c === 13) { |
| 4981 | + eol = true; |
| 4982 | + if (text.charCodeAt(i + 2) === 10) reParse.lastIndex++; |
| 4983 | + } else if (c === 10) { |
| 4984 | + eol = true; |
| 4985 | + } |
| 4986 | + return text.substring(j + 1, i).replace(/""/g, '"'); |
4975 | 4987 | } |
4976 | | - re.lastIndex = i + 2; |
4977 | | - var c = text.charCodeAt(i + 1); |
4978 | | - if (c === 13) { |
4979 | | - eol = true; |
4980 | | - if (text.charCodeAt(i + 2) === 10) re.lastIndex++; |
4981 | | - } else if (c === 10) { |
4982 | | - eol = true; |
| 4988 | + var m = reParse.exec(text); |
| 4989 | + if (m) { |
| 4990 | + eol = m[0].charCodeAt(0) !== delimiterCode; |
| 4991 | + return text.substring(j, m.index); |
4983 | 4992 | } |
4984 | | - return text.substring(j + 1, i).replace(/""/g, '"'); |
4985 | | - } |
4986 | | - var m = re.exec(text); |
4987 | | - if (m) { |
4988 | | - eol = m[0].charCodeAt(0) !== 44; |
4989 | | - return text.substring(j, m.index); |
| 4993 | + reParse.lastIndex = text.length; |
| 4994 | + return text.substring(j); |
| 4995 | + } |
| 4996 | + while ((t = token()) !== EOF) { |
| 4997 | + var a = []; |
| 4998 | + while (t !== EOL && t !== EOF) { |
| 4999 | + a.push(t); |
| 5000 | + t = token(); |
| 5001 | + } |
| 5002 | + if (f && !(a = f(a, n++))) continue; |
| 5003 | + rows.push(a); |
4990 | 5004 | } |
4991 | | - re.lastIndex = text.length; |
4992 | | - return text.substring(j); |
| 5005 | + return rows; |
| 5006 | + }; |
| 5007 | + dsv.format = function(rows) { |
| 5008 | + return rows.map(formatRow).join("\n"); |
| 5009 | + }; |
| 5010 | + function formatRow(row) { |
| 5011 | + return row.map(formatValue).join(delimiter); |
4993 | 5012 | } |
4994 | | - while ((t = token()) !== EOF) { |
4995 | | - var a = []; |
4996 | | - while (t !== EOL && t !== EOF) { |
4997 | | - a.push(t); |
4998 | | - t = token(); |
4999 | | - } |
5000 | | - if (f && !(a = f(a, n++))) continue; |
5001 | | - rows.push(a); |
| 5013 | + function formatValue(text) { |
| 5014 | + return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text; |
5002 | 5015 | } |
5003 | | - return rows; |
5004 | | - }; |
5005 | | - d3.csv.format = function(rows) { |
5006 | | - return rows.map(d3_csv_formatRow).join("\n"); |
5007 | | - }; |
5008 | | - function d3_csv_formatRow(row) { |
5009 | | - return row.map(d3_csv_formatValue).join(","); |
5010 | | - } |
5011 | | - function d3_csv_formatValue(text) { |
5012 | | - return /[",\n]/.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text; |
| 5016 | + return dsv; |
5013 | 5017 | } |
| 5018 | + d3.csv = d3_dsv(",", "text/csv"); |
| 5019 | + d3.tsv = d3_dsv("\t", "text/tab-separated-values"); |
5014 | 5020 | d3.geo = {}; |
5015 | 5021 | var d3_geo_radians = Math.PI / 180; |
5016 | 5022 | d3.geo.azimuthal = function() { |
|
0 commit comments