108 lines
2.8 KiB
C#
108 lines
2.8 KiB
C#
![]() |
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);
|
|||
|
}
|
|||
|
}
|