Skip to content

Instantly share code, notes, and snippets.

@MarkPflug
Last active October 30, 2023 18:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MarkPflug/14123a1eb62e3151c6d8b6bfc5b94b6f to your computer and use it in GitHub Desktop.
Save MarkPflug/14123a1eb62e3151c6d8b6bfc5b94b6f to your computer and use it in GitHub Desktop.
CSV Parser Validation
using CsvHelper;
using nietras.SeparatedValues;
using RecordParser.Extensions;
using Sylvan.Data;
using Sylvan.Data.Csv;
using System.Globalization;
using System.Runtime.CompilerServices;
var tw = new StringWriter();
tw.WriteLine("A,B,C,D");
tw.WriteLine("\"x\ny\",2,3,4");
var str = tw.ToString();
Test(str, TestRecordParser);
Test(str, TestSep);
Test(str, TestSylvan);
Test(str, TestCsvHelper);
static void Test(string data, Func<TextReader, List<Record>> f, [CallerArgumentExpression(nameof(f))] string name = null)
{
var r = new StringReader(data);
bool pass = false;
try
{
var records = f(r);
if(records.Count != 1)
{
throw new Exception("Invalid record count");
}
pass = true;
Console.WriteLine($"{name,-16}: PASS");
}
catch (Exception e)
{
Console.WriteLine($"{name,-16}: FAIL {e.Message}");
}
}
static List<Record> TestRecordParser(TextReader reader)
{
var options = new VariableLengthReaderRawOptions
{
HasHeader = true,
ContainsQuotedFields = true,
ColumnCount = 4,
Separator = ",",
ParallelismOptions = new()
{
Enabled = true,
MaxDegreeOfParallelism = 2
},
};
var records = reader.ReadRecordsRaw(options, getField =>
{
var record = new Record
{
A = getField(0),
B = getField(1),
C = getField(2),
D = getField(3)
};
return record;
}).ToList();
return records;
}
static List<Record> TestSep(TextReader reader)
{
using var csv = Sep.Reader().From(reader);
var records = new List<Record>();
foreach (var row in csv)
{
var record = new Record()
{
A = row[0].ToString(),
B = row[1].ToString(),
C = row[2].ToString(),
D = row[3].ToString(),
};
records.Add(record);
}
return records;
}
List<Record> TestSylvan(TextReader reader)
{
var opt = new CsvDataReaderOptions { MaxBufferSize = int.MaxValue };
var csv = Sylvan.Data.Csv.CsvDataReader.Create(reader, opt);
return csv.GetRecords<Record>().ToList();
}
List<Record> TestCsvHelper(TextReader reader)
{
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
return csv.GetRecords<Record>().ToList();
}
public class Record
{
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
public string D { get; set; }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment