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; |
}; |