Last active
October 30, 2023 18:30
-
-
Save MarkPflug/14123a1eb62e3151c6d8b6bfc5b94b6f to your computer and use it in GitHub Desktop.
CSV Parser Validation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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