CsvReaderAdvanced 1.0.19
See the version list below for details.
dotnet add package CsvReaderAdvanced --version 1.0.19
NuGet\Install-Package CsvReaderAdvanced -Version 1.0.19
<PackageReference Include="CsvReaderAdvanced" Version="1.0.19" />
<PackageVersion Include="CsvReaderAdvanced" Version="1.0.19" />
<PackageReference Include="CsvReaderAdvanced" />
paket add CsvReaderAdvanced --version 1.0.19
#r "nuget: CsvReaderAdvanced, 1.0.19"
#:package CsvReaderAdvanced@1.0.19
#addin nuget:?package=CsvReaderAdvanced&version=1.0.19
#tool nuget:?package=CsvReaderAdvanced&version=1.0.19
CsvReaderAdvanced
The faster and most modern CSV reader adapted to DI principles.
How to use
First add the service to the ServiceCollection.
builder.ConfigureServices((context, services) =>
{
services.AddCsvReader(context.Configuration);
...
Csv schemas via appsettings.json
To understand exactly what the method does, it assumes that the current configuration file contains a csvSchemas section, typically in the appsettings.json file:
public static IServiceCollection AddCsvReader(this IServiceCollection services, IConfiguration configuration)
{
services.AddSingleton<ICsvReader,CsvReader>();
services.AddTransient<ICsvFile,CsvFile>();
//Microsoft.Extensions.Hosting must be referenced
services.Configure<CsvSchemaOptions>(configuration.GetSection(CsvSchemaOptions.CsvSchemasSection));
return services;
}
The schema in the appsettings.json file typically contains a property named csvSchemas:
"csvSchemas": {
"schemas": [
{
"name": "products",
"fields": [
{
"name": "ProductID",
"alternatives": [ "Product ID" ],
"required": true
},
{
"name": "Weight",
"unit": "t",
"alternativeFields": [ "Volume", "TEU" ],
"required": true
},
{
"name": "Volume",
"unit": "m^3",
"alternativeUnits": [ "m3", "m^3" ]
...
We assume that we get the options via DI like the following example:
public Importer(
IUnitOfWork context,
IMapper mapper,
IServiceProvider provider,
ILogger logger,
IOptions<CsvSchemaOptions> options)
{
_context = context;
_mapper = mapper;
_provider = provider;
_logger = logger;
_options = options.Value;
}
protected readonly IUnitOfWork _context;
protected readonly IMapper _mapper;
protected readonly IServiceProvider _provider;
protected readonly ILogger _logger;
protected readonly CsvSchemaOptions _options;
public CsvSchema? GetSchema(string name) =>
_options?.Schemas?.FirstOrDefault(s => s.Name == name);
public ValidationResult CheckForSchema(string name)
{
if (_options?.Schemas is null || !_options.Schemas.Any())
{
_logger.LogError("Could not retrieve csv schemas from settings");
return new ValidationResult(
new ValidationFailure[] { new ValidationFailure("CsvSchemas", "Cannot retrieve csv schemas from settings") });
}
var schema = GetSchema(name);
if (schema is null)
{
_logger.LogError("Could not retrieve '{schemaName}' schema from settings",name);
return new ValidationResult(
new ValidationFailure[] { new ValidationFailure(name, $"Cannot retrieve '{name}' schema from settings") });
}
return new ValidationResult();
}
Read the file
We instantiate a CsvFile in order to read the file. Note that the aforementioned CsvSchema is not needed if we do not have a header and/or do not want to validate the existence of fields.
For the example below, we assume that a CsvSchema is checked.
//We assume that _provider is an IServiceProvider which is injected via DI
var file = _provider.GetCsvFile();
file.ReadFromFile(path, Encoding.UTF8, withHeader:true);
//the line above is equivalent to the 2 commands:
file.ReadFromFile(path, Encoding.UTF8);
file.PopulateColumns();
The PopulateColumns() method updates the internal ExistingColumns dictionary. The ExistingColumns dictionary is case insensitive and stores the index location for each column. The index location is zero-based.
To check the existence of fields against a schema we should call the CheckAgainstSchema() method as shown below:
CsvScema schema = _options.Schemas.FirstOrDefault(s => s.Name == "products");
file.CheckAgainstSchema(schema);
The CheckAgainstSchema() method also calls the PopulateColumns() method if the ExistingColumns property is not populated. It then updates the ExistingFieldColumns dictionary, which is a dictionary of the column index location based on the field name.
Additional properties (Hashsets) are populated: MissingFields, MissingRequiredFields.
Lines and ParsedValue
The most important updated property after the ReadFromFile() call is the Lines property, whic is a List of TokenizedLine? objects.
The TokenizedLine struct contains the Tokens property which is a List of string objects. The power of this library is that each TokenizedLine may potentially span more than 1 lines. This can occur in the case of quoted strings which may span to the next line. In general all cases where quoted strings are met, are cases where a simple string.Split() cannot work.
That's why the properties FromLine to ToLine exist. The latter are important for debugging purposes.
The Get method returns a ParsedValue struct. The ParsedValue is a useful wrapper the contains a T? Value and a bool Parsed property.
var c = file.ExistingFieldColumns;
foreach (var line in file.Lines)
{
TokenizedLine l = line.Value;
var weightValue = l.Get<double>("Weight", c);
//var weightValue = l.GetDouble("Weight", c); //alternative call (slightly faster)
if (!weightValue.Parsed)
_logger.LogError("Cannot parse Weight {value} at line {line}.", weightValue.Value, l.FromLine);
else
{
double weight = weightValue.Value;
...
...
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net7.0
- Microsoft.Extensions.Hosting (>= 7.0.1)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on CsvReaderAdvanced:
| Package | Downloads |
|---|---|
|
EndpointProviders
A modern way to add Dependency Injection used for Minimal API apps. See README. |
|
|
SqlServerExplorerLib
The easiest way to perform SQL Server operations, such as viewing table fields, copying table data to a file, or transferring table data between databases. See the README for more information. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated | |
|---|---|---|---|
| 2.6.0 | 243 | 2/23/2025 | |
| 2.5.0 | 167 | 1/17/2025 | |
| 2.4.1 | 145 | 12/27/2024 | |
| 2.4.0 | 340 | 11/15/2024 | |
| 2.3.8 | 342 | 10/16/2024 | |
| 2.3.7 | 229 | 7/27/2024 | |
| 2.3.6 | 176 | 7/27/2024 | |
| 2.3.5 | 139 | 7/26/2024 | |
| 2.3.4 | 168 | 7/12/2024 | |
| 2.3.3 | 187 | 6/22/2024 | |
| 2.3.2 | 199 | 6/22/2024 | |
| 2.3.1 | 670 | 3/1/2024 | |
| 2.3.0 | 316 | 12/13/2023 | |
| 2.2.1 | 203 | 11/28/2023 | |
| 2.2.0 | 250 | 10/17/2023 | |
| 2.1.1 | 214 | 10/15/2023 | |
| 2.1.0 | 189 | 10/15/2023 | |
| 1.3.3 | 190 | 10/14/2023 | |
| 1.3.2 | 202 | 10/14/2023 | |
| 1.3.0 | 192 | 10/13/2023 | |
| 1.2.6 | 200 | 9/29/2023 | |
| 1.2.5 | 292 | 7/18/2023 | |
| 1.2.4 | 294 | 7/16/2023 | |
| 1.2.2 | 262 | 7/16/2023 | |
| 1.2.1 | 249 | 7/14/2023 | |
| 1.2.0 | 233 | 7/14/2023 | |
| 1.1.15 | 273 | 7/14/2023 | |
| 1.1.14 | 252 | 7/14/2023 | |
| 1.1.13 | 259 | 7/7/2023 | |
| 1.1.12 | 414 | 7/6/2023 | |
| 1.1.11 | 237 | 7/5/2023 | |
| 1.1.10 | 270 | 7/5/2023 | |
| 1.1.9 | 243 | 6/27/2023 | |
| 1.1.8 | 228 | 6/26/2023 | |
| 1.1.7 | 232 | 6/24/2023 | |
| 1.1.6 | 240 | 6/24/2023 | |
| 1.1.5 | 253 | 6/23/2023 | |
| 1.1.2 | 261 | 6/23/2023 | |
| 1.0.28 | 249 | 6/23/2023 | |
| 1.0.27 | 255 | 6/23/2023 | |
| 1.0.26 | 225 | 6/19/2023 | |
| 1.0.25 | 272 | 6/18/2023 | |
| 1.0.24 | 226 | 6/18/2023 | |
| 1.0.23 | 263 | 6/18/2023 | |
| 1.0.22 | 255 | 6/18/2023 | |
| 1.0.21 | 265 | 6/17/2023 | |
| 1.0.20 | 267 | 6/17/2023 | |
| 1.0.19 | 243 | 6/17/2023 | |
| 1.0.18 | 242 | 6/17/2023 | |
| 1.0.17 | 280 | 6/17/2023 | |
| 1.0.16 | 245 | 6/17/2023 | |
| 1.0.15 | 252 | 6/17/2023 | |
| 1.0.12 | 233 | 6/17/2023 | |
| 1.0.11 | 255 | 6/17/2023 | |
| 1.0.10 | 228 | 6/17/2023 | |
| 1.0.9 | 256 | 6/17/2023 | |
| 1.0.8 | 269 | 6/17/2023 | |
| 1.0.7 | 252 | 6/17/2023 | |
| 1.0.6 | 247 | 6/16/2023 | |
| 1.0.5 | 261 | 6/16/2023 | |
| 1.0.4 | 280 | 6/16/2023 | |
| 1.0.2 | 278 | 6/16/2023 |