Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Unified Diff: tools/csvparser.js

Issue 548198: Rewrite CsvParser.parseLine to make it simpler and gain some performance improvement. (Closed)
Patch Set: Created 10 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/mjsunit/tools/csvparser.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/csvparser.js
diff --git a/tools/csvparser.js b/tools/csvparser.js
index 9e58deaea0f5f5710cbf219c19cb8c72fe85ce34..6e101e206b91fccbfaaaf7b3a002363441411857 100644
--- a/tools/csvparser.js
+++ b/tools/csvparser.js
@@ -39,17 +39,17 @@ devtools.profiler.CsvParser = function() {
/**
- * A regex for matching a trailing quote.
+ * A regex for matching a CSV field.
* @private
*/
-devtools.profiler.CsvParser.TRAILING_QUOTE_RE_ = /\"$/;
+devtools.profiler.CsvParser.CSV_FIELD_RE_ = /^"((?:[^"]|"")*)"|([^,]*)/;
/**
* A regex for matching a double quote.
* @private
*/
-devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_ = /\"\"/g;
+devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_ = /""/g;
/**
@@ -58,41 +58,26 @@ devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_ = /\"\"/g;
* @param {string} line Input line.
*/
devtools.profiler.CsvParser.prototype.parseLine = function(line) {
- var insideQuotes = false;
+ var fieldRe = devtools.profiler.CsvParser.CSV_FIELD_RE_;
+ var doubleQuoteRe = devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_;
+ var pos = 0;
+ var endPos = line.length;
var fields = [];
- var prevPos = 0;
- for (var i = 0, n = line.length; i < n; ++i) {
- switch (line.charAt(i)) {
- case ',':
- if (!insideQuotes) {
- fields.push(line.substring(prevPos, i));
- prevPos = i + 1;
- }
- break;
- case '"':
- if (!insideQuotes) {
- insideQuotes = true;
- // Skip the leading quote.
- prevPos++;
- } else {
- if (i + 1 < n && line.charAt(i + 1) != '"') {
- insideQuotes = false;
- } else {
- i++;
- }
- }
- break;
- }
- }
- if (n > 0) {
- fields.push(line.substring(prevPos));
- }
-
- for (i = 0; i < fields.length; ++i) {
- // Eliminate trailing quotes.
- fields[i] = fields[i].replace(devtools.profiler.CsvParser.TRAILING_QUOTE_RE_, '');
- // Convert quoted quotes into single ones.
- fields[i] = fields[i].replace(devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_, '"');
+ if (endPos > 0) {
+ do {
+ var fieldMatch = fieldRe.exec(line.substr(pos));
+ if (typeof fieldMatch[1] === "string") {
+ var field = fieldMatch[1];
+ pos += field.length + 3; // Skip comma and quotes.
+ fields.push(field.replace(doubleQuoteRe, '"'));
Søren Thygesen Gjesse 2010/01/29 13:21:34 Is this covered by any tests?
mnaganov (inactive) 2010/01/29 13:31:10 You mean double quotes? Lines 53--63 in test/mjsun
+ } else {
+ // The second field pattern will match anything, thus
+ // in the worst case the match will be an empty string.
+ var field = fieldMatch[2];
+ pos += field.length + 1; // Skip comma.
+ fields.push(field);
+ }
+ } while (pos <= endPos);
}
return fields;
};
« no previous file with comments | « test/mjsunit/tools/csvparser.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698