Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/delimiter-separated-values' into…
Browse files Browse the repository at this point in the history
… 2.10.0
  • Loading branch information
mbostock committed Aug 9, 2012
2 parents 7c6a7fd + 66b439d commit 7ac1ae7
Show file tree
Hide file tree
Showing 14 changed files with 392 additions and 241 deletions.
10 changes: 5 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ all: \
d3.svg.js \
d3.behavior.js \
d3.layout.js \
d3.csv.js \
d3.dsv.js \
d3.geo.js \
d3.geom.js \
d3.time.js \
Expand Down Expand Up @@ -189,10 +189,10 @@ d3.geo.js: \
src/geo/greatArc.js \
src/geo/greatCircle.js

d3.csv.js: \
src/csv/csv.js \
src/csv/parse.js \
src/csv/format.js
d3.dsv.js: \
src/dsv/dsv.js \
src/dsv/csv.js \
src/dsv/tsv.js

d3.time.js: \
src/time/time.js \
Expand Down
140 changes: 73 additions & 67 deletions d3.v2.js
Original file line number Diff line number Diff line change
Expand Up @@ -4937,80 +4937,86 @@
dy: dy
};
}
d3.csv = function(url, callback) {
d3.text(url, "text/csv", function(text) {
callback(text && d3.csv.parse(text));
});
};
d3.csv.parse = function(text) {
var header;
return d3.csv.parseRows(text, function(row, i) {
if (i) {
var o = {}, j = -1, m = header.length;
while (++j < m) o[header[j]] = row[j];
return o;
} else {
header = row;
return null;
}
});
};
d3.csv.parseRows = function(text, f) {
var EOL = {}, EOF = {}, rows = [], re = /\r\n|[,\r\n]/g, n = 0, t, eol;
re.lastIndex = 0;
function token() {
if (re.lastIndex >= text.length) return EOF;
if (eol) {
eol = false;
return EOL;
}
var j = re.lastIndex;
if (text.charCodeAt(j) === 34) {
var i = j;
while (i++ < text.length) {
if (text.charCodeAt(i) === 34) {
if (text.charCodeAt(i + 1) !== 34) break;
i++;
function d3_dsv(delimiter, mimeType) {
var reParse = new RegExp("\r\n|[" + delimiter + "\r\n]", "g"), reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0);
function dsv(url, callback) {
d3.text(url, mimeType, function(text) {
callback(text && dsv.parse(text));
});
}
dsv.parse = function(text) {
var header;
return dsv.parseRows(text, function(row, i) {
if (i) {
var o = {}, j = -1, m = header.length;
while (++j < m) o[header[j]] = row[j];
return o;
} else {
header = row;
return null;
}
});
};
dsv.parseRows = function(text, f) {
var EOL = {}, EOF = {}, rows = [], n = 0, t, eol;
reParse.lastIndex = 0;
function token() {
if (reParse.lastIndex >= text.length) return EOF;
if (eol) {
eol = false;
return EOL;
}
var j = reParse.lastIndex;
if (text.charCodeAt(j) === 34) {
var i = j;
while (i++ < text.length) {
if (text.charCodeAt(i) === 34) {
if (text.charCodeAt(i + 1) !== 34) break;
i++;
}
}
reParse.lastIndex = i + 2;
var c = text.charCodeAt(i + 1);
if (c === 13) {
eol = true;
if (text.charCodeAt(i + 2) === 10) reParse.lastIndex++;
} else if (c === 10) {
eol = true;
}
return text.substring(j + 1, i).replace(/""/g, '"');
}
re.lastIndex = i + 2;
var c = text.charCodeAt(i + 1);
if (c === 13) {
eol = true;
if (text.charCodeAt(i + 2) === 10) re.lastIndex++;
} else if (c === 10) {
eol = true;
var m = reParse.exec(text);
if (m) {
eol = m[0].charCodeAt(0) !== delimiterCode;
return text.substring(j, m.index);
}
return text.substring(j + 1, i).replace(/""/g, '"');
}
var m = re.exec(text);
if (m) {
eol = m[0].charCodeAt(0) !== 44;
return text.substring(j, m.index);
reParse.lastIndex = text.length;
return text.substring(j);
}
while ((t = token()) !== EOF) {
var a = [];
while (t !== EOL && t !== EOF) {
a.push(t);
t = token();
}
if (f && !(a = f(a, n++))) continue;
rows.push(a);
}
re.lastIndex = text.length;
return text.substring(j);
return rows;
};
dsv.format = function(rows) {
return rows.map(formatRow).join("\n");
};
function formatRow(row) {
return row.map(formatValue).join(delimiter);
}
while ((t = token()) !== EOF) {
var a = [];
while (t !== EOL && t !== EOF) {
a.push(t);
t = token();
}
if (f && !(a = f(a, n++))) continue;
rows.push(a);
function formatValue(text) {
return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text;
}
return rows;
};
d3.csv.format = function(rows) {
return rows.map(d3_csv_formatRow).join("\n");
};
function d3_csv_formatRow(row) {
return row.map(d3_csv_formatValue).join(",");
}
function d3_csv_formatValue(text) {
return /[",\n]/.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text;
return dsv;
}
d3.csv = d3_dsv(",", "text/csv");
d3.tsv = d3_dsv("\t", "text/tab-separated-values");
d3.geo = {};
var d3_geo_radians = Math.PI / 180;
d3.geo.azimuthal = function() {
Expand Down
8 changes: 4 additions & 4 deletions d3.v2.min.js

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions examples/data/sample.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Hello World
42 """fish"""
5 changes: 0 additions & 5 deletions src/csv/csv.js

This file was deleted.

13 changes: 0 additions & 13 deletions src/csv/format.js

This file was deleted.

73 changes: 0 additions & 73 deletions src/csv/parse.js

This file was deleted.

1 change: 1 addition & 0 deletions src/dsv/csv.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
d3.csv = d3_dsv(",", "text/csv");
97 changes: 97 additions & 0 deletions src/dsv/dsv.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
function d3_dsv(delimiter, mimeType) {
var reParse = new RegExp("\r\n|[" + delimiter + "\r\n]", "g"), // field separator regex
reFormat = new RegExp("[\"" + delimiter + "\n]"),
delimiterCode = delimiter.charCodeAt(0);

function dsv(url, callback) {
d3.text(url, mimeType, function(text) {
callback(text && dsv.parse(text));
});
}

dsv.parse = function(text) {
var header;
return dsv.parseRows(text, function(row, i) {
if (i) {
var o = {}, j = -1, m = header.length;
while (++j < m) o[header[j]] = row[j];
return o;
} else {
header = row;
return null;
}
});
};

dsv.parseRows = function(text, f) {
var EOL = {}, // sentinel value for end-of-line
EOF = {}, // sentinel value for end-of-file
rows = [], // output rows
n = 0, // the current line number
t, // the current token
eol; // is the current token followed by EOL?

reParse.lastIndex = 0; // work-around bug in FF 3.6

function token() {
if (reParse.lastIndex >= text.length) return EOF; // special case: end of file
if (eol) { eol = false; return EOL; } // special case: end of line

// special case: quotes
var j = reParse.lastIndex;
if (text.charCodeAt(j) === 34) {
var i = j;
while (i++ < text.length) {
if (text.charCodeAt(i) === 34) {
if (text.charCodeAt(i + 1) !== 34) break;
i++;
}
}
reParse.lastIndex = i + 2;
var c = text.charCodeAt(i + 1);
if (c === 13) {
eol = true;
if (text.charCodeAt(i + 2) === 10) reParse.lastIndex++;
} else if (c === 10) {
eol = true;
}
return text.substring(j + 1, i).replace(/""/g, "\"");
}

// common case
var m = reParse.exec(text);
if (m) {
eol = m[0].charCodeAt(0) !== delimiterCode;
return text.substring(j, m.index);
}
reParse.lastIndex = text.length;
return text.substring(j);
}

while ((t = token()) !== EOF) {
var a = [];
while ((t !== EOL) && (t !== EOF)) {
a.push(t);
t = token();
}
if (f && !(a = f(a, n++))) continue;
rows.push(a);
}

return rows;
};

dsv.format = function(rows) {
return rows.map(formatRow).join("\n");
};

function formatRow(row) {
return row.map(formatValue).join(delimiter);
}

function formatValue(text) {
return reFormat.test(text) ? "\"" + text.replace(/\"/g, "\"\"") + "\"" : text;
}

return dsv;
}
1 change: 1 addition & 0 deletions src/dsv/tsv.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
d3.tsv = d3_dsv("\t", "text/tab-separated-values");
Loading

0 comments on commit 7ac1ae7

Please sign in to comment.