Ever needed to split CVSs in Actionscript? Tried using String.split()
?
Using a CSV from Excel I had the problem that String.split()
does not support to use the delimiter inside of the value fields (Excel puts double quotes around fields that contain the delimiter).
After playing with some regular expressions I made a textSplit()
method that let’s you specify such a quoting character (I called it textDelimiter
). Here it is (helpers included):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
private static function substituteTextDelimiter(value:String, textDelimiter:*):String { if(value.charAt(0)==textDelimiter && value.charAt(value.length-1)==textDelimiter) { var valueWithOutDelimiters:String = value.substr(1, value.length-2); var returnValue:String = valueWithOutDelimiters.replace(textDelimiter+textDelimiter, textDelimiter); return returnValue; } else { return value; } } private static function removeDelimiter(value:String, delimiter:*):String { if(value.charAt(value.length-1)==delimiter) return value.substr(0, value.length-1); else return value; } public static function textSplit(str:String, delimiter:* = ",", textDelimiter:* = '"'):Array { var regex:String = '"([^"]|"{2,})*"(;|$)|[^;]*(;|$)'; regex.replace('"', textDelimiter); regex.replace(';', delimiter); var values:Array = str.match(new RegExp(regex, "g")); for(var i:int=0; i<values.length; i++) { values[i] = removeDelimiter(values[i], delimiter); values[i] = substituteTextDelimiter(values[i], textDelimiter); } return values; } |
And here you can find the test case I used:
1 2 |
var a:Array = textSplit('a;b;"c";"""";"a;b"""', ";"); // a has the value ['a', 'b', 'c', '"', 'a;b"'] |