package flare.data.converters { import flare.data.DataField; import flare.data.DataSchema; import flare.data.DataSet; import flare.data.DataTable; import flare.data.DataUtil; import flash.utils.ByteArray; import flash.utils.IDataInput; import flash.utils.IDataOutput; /** * Converts data between delimited text (e.g., tab delimited) and * flare DataSet instances. */ public class DelimitedTextConverter implements IDataConverter { private var _delim:String; public function get delimiter():String { return _delim; } public function set delimiter(d:String):void { _delim = d; } /** * Creates a new DelimitedTextConverter. * @param delim the delimiter string separating values (tab by default) */ public function DelimitedTextConverter(delim:String="\t") { _delim = delim; } /** * @inheritDoc */ public function read(input:IDataInput, schema:DataSchema=null):DataSet { return parse(input.readUTFBytes(input.bytesAvailable), schema); } /** * Converts data from a tab-delimited string into a DataSet object. * @param text the loaded input data * @param schema a data schema describing the structure of the data. * Schemas are optional in many but not all cases. * @return a DataSet of converted data objects. */ public function parse(text:String, schema:DataSchema=null):DataSet { var tuples:Vector. = new Vector.(); var lines:Array = text.split(/\r\n|\r|\n/); if (schema == null) { schema = inferSchema(lines); } var i:int = schema.hasHeader ? 1 : 0; for (; i = data.nodes.data; var schema:DataSchema = data.nodes.schema; for each (var tuple:Object in tuples) { var i:int = 0, s:String; if (schema == null) { for (var name:String in tuple) { if (i>0) output.writeUTFBytes(_delim); output.writeUTFBytes(String(tuple[name])); // TODO: proper string formatting ++i; } } else { for (;i0) output.writeUTFBytes(_delim); output.writeUTFBytes(String(tuple[f.name])); // TODO proper string formatting } } output.writeUTFBytes("\n"); } return output; } /** * Infers the data schema by checking values of the input data. * @param lines an array of lines of input text * @return the inferred schema */ // Not changing to Array as a common parameter is the output from // the String.split function, which returns an Array. protected function inferSchema(lines:Array):DataSchema { var header:Array = lines[0].split(_delim); var types:Array = new Array(header.length); // initialize data types var tok:Array = lines[1].split(_delim); for (var col:int=0; col