PDA

View Full Version : CSV Data and Datagrid problems


greenarrowpro
09-20-2008, 04:39 AM
I am using a csv parser to parse some csv data and display it in a datagrid. I am also using the Flex DataGridExporter class available on the web to get the csv data out of the data grid and store it. I am running into some odd bugs.

1. when the data comes in ( from a recently exported to csv from a datagrid ) I am losing the last person in the list ( though they are really there in the data, just not displaying in the datagrid ).
2. I am also losing the letter in each person's email ( someone@email.co ) but in the actual data it DOES NOT look like that, it has the last letter...BUT, if i save the list ( to a database ), it does in-fact save that way ( with the letter cut off ) ...any ideas?
Attached is screenshots of the output, and the saved data, as well as the traced data.
Below is the csv parser and datagrid exporter.


trace("Parsing CSV Data...");
var properties:Array = new Array();
var headings:Boolean = false;
var carriage:Number = new Number();
var comma:Number = new Number();
var cursor:Number = new Number();
var sub:Number = new Number();
var item:Object = new Object();
var value:String = new String();
var line:String = new String();
var contacts:Array = new Array();

var result:String = csvData;

while( result.indexOf( "\n", cursor ) != -1 ) {
carriage = result.indexOf( "\n", cursor );
line = result.substring( cursor, carriage );

cursor = 0;
sub = 0;

item = new Object();

while( line.indexOf( ",", cursor ) != -1 ) {
comma = line.indexOf( ",", cursor );
value = line.substring( cursor, comma );

if( !headings ) {
properties.push( value );
} else {
item[properties[sub]] = value;
//trace("email:\n" + value.toString());
}

cursor = comma + 1;
sub++;
}

value = line.substring( cursor, line.length - 1 );

if( !headings ) {
properties.push( value );
headings = true;
//trace("headings:\n" + value.toString());
} else {
item[properties[sub]] = value;
contacts.push( item );
//trace("contact:\n" + item.Name.toString());
}
cursor = carriage + 1;
}

trace("Parsing Complete " + contacts.length + " contacts found: \n");

return contacts;


and the data exporter:


package com.abdulqabiz.utils
{
import mx.controls.DataGrid;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.collections.ArrayCollection;
import mx.collections.XMLListCollection;
import mx.collections.IList;
import mx.collections.IViewCursor;
import mx.collections.CursorBookmark;

public class DataGridDataExporter
{

public static function exportCSV(dg:DataGrid, csvSeparator:String=",", lineSeparator:String="\n"):String
{
var data:String = "";
var columns:Array = dg.columns;
var columnCount:int = columns.length;
var column:DataGridColumn;
var header:String = "";
var headerGenerated:Boolean = false;
var dataProvider:Object = dg.dataProvider;

var rowCount:int = dataProvider.length;
var dp:Object = null;


var cursor:IViewCursor = dataProvider.createCursor ();
var j:int = 0;

//loop through rows
while (!cursor.afterLast)
{
var obj:Object = null;
obj = cursor.current;

//loop through all columns for the row
for(var k:int = 0; k < columnCount; k++)
{
column = columns[k];

//Exclude column data which is invisible (hidden)
if(!column.visible)
{
continue;
}

data += column.itemToLabel(obj);

if(k < (columnCount -1))
{
data += csvSeparator;
trace(data);
}

//generate header of CSV, only if it's not genereted yet
if (!headerGenerated)
{
header += column.headerText;
if (k < columnCount - 1)
{
header += csvSeparator;
}
}


}

headerGenerated = true;

if (j < (rowCount - 1))
{
data += lineSeparator;
}

j++;
cursor.moveNext ();
}

//set references to null:
dataProvider = null;
columns = null;
column = null;

return (header + "\r\n" + data);
}
}

}