using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text; using System.Text.RegularExpressions; namespace CPF.ReoGrid.IO { internal static class CSVFormat { public static void Read(Stream stream, Worksheet sheet, RangePosition targetRange, Encoding encoding = null, int bufferLines = 512, bool autoSpread = true) { targetRange = sheet.FixRange(targetRange); string[] array = new string[bufferLines]; List[] array2 = new List[bufferLines]; for (int i = 0; i < array2.Length; i++) { array2[i] = new List(256); } Stopwatch stopwatch = Stopwatch.StartNew(); int num = targetRange.Row; int num2 = 0; using (StreamReader streamReader = new StreamReader(stream, encoding)) { sheet.SuspendDataChangedEvents(); int num3 = 0; try { bool flag = false; while (!flag) { int j; for (j = 0; j < array.Length; j++) { string text = streamReader.ReadLine(); bool flag2 = text == null; if (flag2) { flag = true; break; } array[j] = text; num2++; bool flag3 = !autoSpread && num2 > targetRange.Rows; if (flag3) { flag = true; break; } } bool flag4 = autoSpread && num + j > sheet.RowCount; if (flag4) { int num4 = bufferLines - sheet.RowCount % bufferLines; bool flag5 = num4 <= 0; if (flag5) { num4 = bufferLines; } sheet.AppendRows(num4); } for (int k = 0; k < j; k++) { string input = array[k]; List list = array2[k]; list.Clear(); foreach (object obj in CSVFormat.lineRegex.Matches(input)) { Match match = (Match)obj; list.Add(match.Groups["item"].Value); bool flag6 = list.Count >= targetRange.Cols; if (flag6) { break; } } bool flag7 = num3 < list.Count; if (flag7) { num3 = list.Count; } bool flag8 = autoSpread && num3 >= sheet.ColumnCount; if (flag8) { sheet.SetCols(num3 + 1); } } sheet.SetRangeData(num, targetRange.Col, j, num3, array2); num += j; } } finally { sheet.ResumeDataChangedEvents(); } sheet.RaiseRangeDataChangedEvent(new RangePosition(targetRange.Row, targetRange.Col, num3, num2)); } stopwatch.Stop(); Debug.WriteLine("load csv file: " + stopwatch.ElapsedMilliseconds.ToString() + " ms, rows: " + num.ToString()); } public const int DEFAULT_READ_BUFFER_LINES = 512; private static Regex lineRegex = new Regex("\\s*(\\\"(?[^\\\"]*)\\\"|(?[^,]*))\\s*,?", RegexOptions.Compiled); } }