public class CsvReader { private Stream objStream; ///stream Object private StreamReader objReader; ///Reader Object ///add name space System.IO.Stream public CsvReader(Stream filestream) : this(filestream, null) { } public CsvReader(Stream filestream, Encoding enc) { this.objStream = filestream; ///check the pass stream whether it is readable or not if (!filestream.CanRead) { return; } objReader = (enc != null) ? new StreamReader(filestream, enc) : new StreamReader(filestream); } ///parse the line public string[] GetCSVLine() { string data = objReader.ReadLine(); if (data == null) return null; if (data.Length == 0) return new string[0]; ///System.Collection.Generic ArrayList result = new ArrayList(); ///parsing CSV data ParseCSVData(result, data); return (string[])result.ToArray(typeof(string)); } private void ParseCSVData(ArrayList result, string data) { int position = -1; while (position < data.Length) result.Add(ParseCSVField(ref data, ref position)); } private string ParseCSVField(ref string data, ref int StartSeperatorPos) { if (StartSeperatorPos == data.Length - 1) { StartSeperatorPos++; return ""; } int fromPos = StartSeperatorPos + 1; if (data[fromPos] == '"') { int nextSingleQuote = GetSingleQuote(data, fromPos + 1); int lines = 1; while (nextSingleQuote == -1) { data = data + "\n" + objReader.ReadLine(); nextSingleQuote = GetSingleQuote(data, fromPos + 1); lines++; if (lines > 20) throw new Exception("lines overflow: " + data); } StartSeperatorPos = nextSingleQuote + 1; string tempstring = data.Substring(fromPos + 1, nextSingleQuote - fromPos - 1); tempstring = tempstring.Replace("'", "''"); return tempstring.Replace("\"\"", "\""); } int nextComma = data.IndexOf(',', fromPos); if (nextComma == -1) { StartSeperatorPos = data.Length; return data.Substring(fromPos); } else { StartSeperatorPos = nextComma; return data.Substring(fromPos, nextComma - fromPos); } } private int GetSingleQuote(string data, int SFrom) { int i = SFrom - 1; while (++i < data.Length) if (data[i] == '"') { if (i < data.Length - 1 && data[i + 1] == '"') { i++; continue; } else return i; } return -1; } }
var
This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)