CPF/CPF.ReoGrid/IO/CSVFormat.cs

108 lines
2.8 KiB
C#
Raw Normal View History

2024-06-24 10:15:59 +08:00
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<object>[] array2 = new List<object>[bufferLines];
for (int i = 0; i < array2.Length; i++)
{
array2[i] = new List<object>(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<object> 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*(\\\"(?<item>[^\\\"]*)\\\"|(?<item>[^,]*))\\s*,?", RegexOptions.Compiled);
}
}