sealed override protected List <MetaDataItem> doParseFile(TextAsset fileToParse)
    {
        this.lastFileParsed = fileToParse;
        List <MetaDataItem> result = new List <MetaDataItem>();

        //first open the file.
        string [,] csvData = CSVReader.SplitCsvGrid(fileToParse.text);
        Debug.Log(csvData[0, 0]);
        List <string> columns = new List <string>();
        int           rowIndex, colIndex;
        int           size = csvData.GetLength(1);

        /* Not sure why i have to subtract 2. Something to do with the CSVReader I guess? */
        for (rowIndex = 0; rowIndex < csvData.GetLength(1) - 2; rowIndex++)
        {
            if (rowIndex == 0)
            {
                for (colIndex = 0; colIndex < csvData.GetLength(0); colIndex++)
                {
                    columns.Add(csvData[colIndex, rowIndex]);
                }
            }
            else
            {
                var dataItem = new AutographerMetaDataItem();
                dataItem.id        = csvData[columns.IndexOf("id"), rowIndex];
                dataItem.dt        = csvData[columns.IndexOf("dt"), rowIndex];
                dataItem.latitude  = float.Parse(csvData[columns.IndexOf("lat_smooth"), rowIndex]);
                dataItem.longitude = float.Parse(csvData[columns.IndexOf("lon_smooth"), rowIndex]);
                dataItem.filename  = csvData[columns.IndexOf("imgFile"), rowIndex];
                dataItem.heading   = float.Parse(csvData[columns.IndexOf("heading"), rowIndex]);
                dataItem.priority  = int.Parse(csvData[columns.IndexOf("priority"), rowIndex]);
                dataItem.episode   = int.Parse(csvData[columns.IndexOf("episode"), rowIndex]);
                dataItem.height    = float.Parse(csvData[columns.IndexOf("unity_height"), rowIndex]);
                result.Add(dataItem);
                //Debug.Log ("added row " + rowIndex + " of " + size);
            }
        }

        int lastValueIndex = 0;

        //now go through again, finding the last index with non-zero longitude
        //first item is guaranteed to be non-zero.
        //a "value" index is an index with a non zero value.
        this.min = new MetaDataItem();
        this.max = new MetaDataItem();

        for (int i = 0; i < result.Count; i++)
        {
            if (i == 0)
            {
                this.min.longitude = result[i].longitude;

                this.min.latitude = result[i].latitude;
                this.min.altitude = result[i].altitude;

                this.max.longitude = result[i].longitude;
                this.max.latitude  = result[i].latitude;
                this.max.altitude  = result[i].altitude;
            }
            if (result[i].longitude != 0.0)
            {
                //interpolate between previous value index and this value index.

                int startTerpIndex = lastValueIndex;
                int endTerpIndex   = i;

                int numItems = i - (startTerpIndex + 1);

                for (int j = startTerpIndex + 1; j < i; j++)
                {
                    int   numerator   = j - startTerpIndex;                 // starts from 1.
                    int   denominator = numItems + 1;
                    float terpAmount  = numerator / (float)denominator;
                    result[j].latitude  = Mathf.Lerp(result[startTerpIndex].latitude, result[endTerpIndex].latitude, terpAmount);
                    result[j].longitude = Mathf.Lerp(result[startTerpIndex].longitude, result[endTerpIndex].longitude, terpAmount);
                    result[j].altitude  = Mathf.Lerp(result[startTerpIndex].altitude, result[endTerpIndex].altitude, terpAmount);
                }
                lastValueIndex = i;

                this.min.latitude  = result[i].latitude < this.min.latitude ? result[i].latitude : this.min.latitude;
                this.min.longitude = result[i].longitude < this.min.longitude ? result[i].longitude : this.min.longitude;
                this.min.altitude  = result[i].altitude < this.min.altitude ? result[i].altitude : this.min.altitude;

                this.max.latitude  = result[i].latitude > this.max.latitude ? result[i].latitude : this.max.latitude;
                this.max.longitude = result[i].longitude > this.max.longitude ? result[i].longitude : this.max.longitude;
                this.max.altitude  = result[i].altitude > this.max.altitude ? result[i].altitude : this.max.altitude;
            }
        }
        //now cull everything past the last index.
        while (result.Count > lastValueIndex + 1)
        {
            result.RemoveAt(result.Count - 1);
        }

        return(result);
    }
	sealed override protected List<MetaDataItem> doParseFile(TextAsset fileToParse) {
		this.lastFileParsed = fileToParse;
		List<MetaDataItem> result = new List<MetaDataItem>();
		//first open the file.
		string [,] csvData = CSVReader.SplitCsvGrid(fileToParse.text);
		Debug.Log (csvData[0, 0]);
		List<string> columns = new List<string>();
		int rowIndex, colIndex;
		int size = csvData.GetLength(1);
		/* Not sure why i have to subtract 2. Something to do with the CSVReader I guess? */
		for (rowIndex = 0; rowIndex < csvData.GetLength(1) - 2; rowIndex++)
		{
			if (rowIndex == 0)
			{
				for (colIndex = 0; colIndex < csvData.GetLength(0); colIndex++)
				{
					columns.Add(csvData[colIndex, rowIndex]);
				}
			}
			else
			{
				var dataItem = new AutographerMetaDataItem();
				dataItem.id = csvData[columns.IndexOf("id"), rowIndex];
				dataItem.dt = csvData[columns.IndexOf("dt"), rowIndex];
				dataItem.latitude = float.Parse(csvData[columns.IndexOf("lat_smooth"), rowIndex]);
				dataItem.longitude = float.Parse(csvData[columns.IndexOf("lon_smooth"), rowIndex]);
				dataItem.filename = csvData[columns.IndexOf("imgFile"), rowIndex];
				dataItem.heading = float.Parse(csvData[columns.IndexOf("heading"), rowIndex]);
				dataItem.priority = int.Parse(csvData[columns.IndexOf("priority"), rowIndex]);
				dataItem.episode = int.Parse(csvData[columns.IndexOf("episode"), rowIndex]);
				dataItem.height = float.Parse(csvData[columns.IndexOf("unity_height"), rowIndex]);
				result.Add (dataItem);
				//Debug.Log ("added row " + rowIndex + " of " + size);
			}
		}
		
		int lastValueIndex = 0;		
		//now go through again, finding the last index with non-zero longitude
		//first item is guaranteed to be non-zero.
		//a "value" index is an index with a non zero value.
		this.min = new MetaDataItem();
		this.max = new MetaDataItem();
		
		for (int i = 0; i < result.Count; i++) {

			if (i == 0) {
				this.min.longitude = result[i].longitude;

				this.min.latitude = result[i].latitude;
				this.min.altitude = result[i].altitude;

				this.max.longitude = result[i].longitude;
				this.max.latitude = result[i].latitude;
				this.max.altitude = result[i].altitude;
			}
			if (result[i].longitude != 0.0) {
				//interpolate between previous value index and this value index.
				
				int startTerpIndex = lastValueIndex;
				int endTerpIndex = i;
				
				int numItems = i - (startTerpIndex + 1);
				
				for (int j = startTerpIndex + 1; j < i; j++ ) {
					
					int numerator = j - startTerpIndex; // starts from 1.
					int denominator = numItems + 1;
					float terpAmount = numerator/(float)denominator;
					result[j].latitude = Mathf.Lerp(result[startTerpIndex].latitude,result[endTerpIndex].latitude,terpAmount);
					result[j].longitude = Mathf.Lerp(result[startTerpIndex].longitude,result[endTerpIndex].longitude,terpAmount);
					result[j].altitude = Mathf.Lerp(result[startTerpIndex].altitude,result[endTerpIndex].altitude,terpAmount);					
				}
				lastValueIndex = i;
				
				this.min.latitude = result[i].latitude < this.min.latitude ? result[i].latitude : this.min.latitude;
				this.min.longitude = result[i].longitude < this.min.longitude ? result[i].longitude : this.min.longitude;
				this.min.altitude = result[i].altitude < this.min.altitude ? result[i].altitude : this.min.altitude;
				
				this.max.latitude = result[i].latitude > this.max.latitude ? result[i].latitude : this.max.latitude;
				this.max.longitude = result[i].longitude > this.max.longitude ? result[i].longitude : this.max.longitude;
				this.max.altitude = result[i].altitude > this.max.altitude ? result[i].altitude : this.max.altitude;
								
			} 

		}
		//now cull everything past the last index.
		while (result.Count > lastValueIndex+1) {
			result.RemoveAt (result.Count - 1);
		}

		return result;
		
	}
    protected override sealed List<MetaDataItem> doParseFile(string fileToParse)
    {
        this.lastFileParsed = fileToParse;
        List<MetaDataItem> result = new List<MetaDataItem>();
        //first open the file.
        using (CsvFileReader reader = new CsvFileReader(fileToParse))
        {
            CsvRow row = new CsvRow();
            List<string> columns = new List<string>();
            int rowIndex = 0;

            while (reader.ReadRow(row))
            {
                //Use the first row to build column definition
                if(rowIndex == 0){
                    foreach(var field in row){
                        columns.Add(field);
                    }
                }else{
                    //Other rows to fill data
                    var dataItem = new AutographerMetaDataItem();
                    dataItem.id = row[columns.IndexOf("id")];
                    dataItem.dt = row[columns.IndexOf("dt")];
                    dataItem.latitude = float.Parse(row[columns.IndexOf("lat_smooth")]);
                    dataItem.longitude = float.Parse(row[columns.IndexOf("lon_smooth")]);
                    dataItem.filename = row[columns.IndexOf("imgFile")];
                    dataItem.heading = float.Parse(row[columns.IndexOf("heading")]);
                    dataItem.priority = int.Parse(row[columns.IndexOf("priority")]);

                    /*
                     * These fiels not used and not always present in CSV file ...
                    dataItem.AccuracyX = float.Parse(row[columns.IndexOf("accx")]);
                    dataItem.AccuracyY = float.Parse(row[columns.IndexOf("accy")]);
                    dataItem.AccuracyZ = float.Parse(row[columns.IndexOf("accz")]);
                    dataItem.MagnitudeX = float.Parse(row[columns.IndexOf("magx")]);
                    dataItem.MagnitudeY = float.Parse(row[columns.IndexOf("magy")]);
                    dataItem.MagnitudeZ = float.Parse(row[columns.IndexOf("magz")]);
                    dataItem.Red = int.Parse(row[columns.IndexOf("red")]);
                    dataItem.Blue = int.Parse(row[columns.IndexOf("blue")]);
                    dataItem.Green = int.Parse(row[columns.IndexOf("green")]);
                    dataItem.Luminance = float.Parse(row[columns.IndexOf("lum")]);
                    dataItem.Temperature = float.Parse(row[columns.IndexOf("tem")]);
                    dataItem.Gs = float.Parse(row[columns.IndexOf("g")]);
                    dataItem.xOrientation = float.Parse(row[columns.IndexOf("xor")]);
                    dataItem.yOrientation = float.Parse(row[columns.IndexOf("yor")]);
                    dataItem.zOrientation = float.Parse(row[columns.IndexOf("zor")]);
                    */

                    result.Add (dataItem);
                }
                rowIndex++;
            }
        }

        int lastValueIndex = 0;
        //now go through again, finding the last index with non-zero longitude
        //first item is guaranteed to be non-zero.
        //a "value" index is an index with a non zero value.
        this.min = new MetaDataItem();
        this.max = new MetaDataItem();

        for (int i = 0; i < result.Count; i++) {

            if (i == 0) {
                this.min.longitude = result[i].longitude;

                this.min.latitude = result[i].latitude;
                this.min.altitude = result[i].altitude;

                this.max.longitude = result[i].longitude;
                this.max.latitude = result[i].latitude;
                this.max.altitude = result[i].altitude;
            }
            if (result[i].longitude != 0.0) {
                //interpolate between previous value index and this value index.

                int startTerpIndex = lastValueIndex;
                int endTerpIndex = i;

                int numItems = i - (startTerpIndex + 1);

                for (int j = startTerpIndex + 1; j < i; j++ ) {

                    int numerator = j - startTerpIndex; // starts from 1.
                    int denominator = numItems + 1;
                    float terpAmount = numerator/(float)denominator;
                    result[j].latitude = Mathf.Lerp(result[startTerpIndex].latitude,result[endTerpIndex].latitude,terpAmount);
                    result[j].longitude = Mathf.Lerp(result[startTerpIndex].longitude,result[endTerpIndex].longitude,terpAmount);
                    result[j].altitude = Mathf.Lerp(result[startTerpIndex].altitude,result[endTerpIndex].altitude,terpAmount);
                }
                lastValueIndex = i;

                this.min.latitude = result[i].latitude < this.min.latitude ? result[i].latitude : this.min.latitude;
                this.min.longitude = result[i].longitude < this.min.longitude ? result[i].longitude : this.min.longitude;
                this.min.altitude = result[i].altitude < this.min.altitude ? result[i].altitude : this.min.altitude;

                this.max.latitude = result[i].latitude > this.max.latitude ? result[i].latitude : this.max.latitude;
                this.max.longitude = result[i].longitude > this.max.longitude ? result[i].longitude : this.max.longitude;
                this.max.altitude = result[i].altitude > this.max.altitude ? result[i].altitude : this.max.altitude;

            }

        }
        //now cull everything past the last index.
        while (result.Count > lastValueIndex+1) {
            result.RemoveAt (result.Count - 1);
        }

        return result;
    }