FileRift 0.0.3
See the version list below for details.
dotnet add package FileRift --version 0.0.3
NuGet\Install-Package FileRift -Version 0.0.3
<PackageReference Include="FileRift" Version="0.0.3" />
paket add FileRift --version 0.0.3
#r "nuget: FileRift, 0.0.3"
// Install FileRift as a Cake Addin #addin nuget:?package=FileRift&version=0.0.3 // Install FileRift as a Cake Tool #tool nuget:?package=FileRift&version=0.0.3
FileRift
Description
FileRift is a versatile NuGet package designed for reading and soon writing tabular data from files. It supports various delimited formats such as comma-separated, pipe-separated, and tab-separated files and also supports fixed width files.
Installation
FileRift can be easily installed using Nuget using the following command
dotnet add FileRift
Features
Typed Reader
FileRift provides a simple way to read CSV files and map them into a class using a fluent interface. Example usage:
var classMap = new ClassMap<Person>();
classMap.AddColumnMap("FirstName", x => x.FirstName)
.AddColumnMap("LastName", x => x.LastName)
.AddColumnMap("Age", x => x.Age)
.AddColumnMap("IsStudent", x => x.IsStudent)
.AddColumnMap("Id", x => x.Id);
// Building the file reader
var fileReader = FileReaderBuilder.BuildDelimitedReader(pathToFile)
.HasHeaders()
.AutoConfigure()
.Build(classMap);
// Reading the file
IEnumerable<Person> results = fileReader.Read()
Note that we are configuring the delimters or escape characters. FileRift automatically reads the first 20 lines of the file and tries to detect the delimiters and separators.
Manual configuration
You can also choose to configure the reader manually. You can do that as described below.
// Setting up the class mapping
var classMap = new ClassMap<Person>();
classMap.AddColumnMap("FirstName", x => x.FirstName)
.AddColumnMap("LastName", x => x.LastName)
.AddColumnMap("Age", x => x.Age)
.AddColumnMap("IsStudent", x => x.IsStudent)
.AddColumnMap("Id", x => x.Id);
// Building the file reader
var fileReader = FileReaderBuilder.BuildDelimitedReader(pathToFile)
.HasHeaders()
.WithDelimiter(',')
.WithEscapeCharacter('\"')
.WithTrimmedData()
.Build(classMap);
// Reading the file
IEnumerable<Person> results = fileReader.Read()
// Process results here.
Access DataReader
FileRift also allows direct access to the underlying DataReader for more flexibility:
using var reader = FileRiftBuilder
.BuildDelimitedReader(pathToFile)
.WithHeaders()
.AutoConfigure()
.BuildDataReader():
while(reader.Read())
{
var name = reader.GetString("First Name");
var age = reader.GetInt32("Age");
var id = reader.GetGuid("Id");
var dateOfBirth = reader.GetDateTime("Date Of Birth");
// Process data here
}
Support Date Format per file
FileRift supports specifying valid date formats to read dates. If formats are not provided, FileRift parses dates using the standard DateTime.Parse method.
var classMap = new ClassMap<Person>();
classMap.AddColumnMap("FirstName", x => x.FirstName)
.AddColumnMap("LastName", x => x.LastName)
.AddColumnMap("Age", x => x.Age)
.AddColumnMap("IsStudent", x => x.IsStudent)
.AddColumnMap("Id", x => x.Id);
var fileReader = FileRiftBuilder.BuildDelimitedReader(pathToFile)
.HasHeaders()
.WithDelimiter('|')
.WithDateFormats("MM/dd/yyyy", "yyyy-MM-dd")
.WithTrimmedData()
.Build(classMap);
The key line there is .WithDateFormats("MM/dd/yyyy", "yyyy-MM-dd")
.
The formatting tokens are available in Microsoft's Documentation
Fixed Length File Reader
FileRift also supports reading FixedWidth files. If you're not sure what a fixed width file here, take a look at the file below
cd0cf662-9983-4152-8230-2a6f225ad985John Doe 25true
b3436c0e-7eb4-4620-b9eb-7890c3462fbeJane Mary Doe 22false
The first 36 characters of this file has the "Id" field. The second 20 characters has the first name. The next 20 characters contains the last name. The last 5 characters contains whether they are a student.
Fixed width files do not have headers embedded in the file.
FileRift also supports reading Fixed Width Files similarly.
var pathToFile = Path.Join(_basePath, "Files", "FixedWidthFile.txt");
var classMap = new ClassMap<Person>();
classMap
.AddColumnMap("Id", x => x.Id)
.AddColumnMap("FirstName", x => x.FirstName)
.AddColumnMap("LastName", x => x.LastName)
.AddColumnMap("Age", x => x.Age)
.AddColumnMap("IsStudent", x => x.IsStudent);
// var fileReader = new DelimitedFileReader<Person>(pathToFile, true, ',', '\"', classMap, true);
var columns = new List<FixedWidthColumnInfo>()
{
new(1, 36, "Id"),
new(2, 20, "FirstName"),
new(3, 20, "LastName"),
new(4, 2, "Age"),
new(5, 5, "IsStudent"),
};
// var fileReader = new FixedWidthFileReader<Person>(pathToFile, columns, classMap);
var fileReader = FileRiftBuilder.BuildFixedWidthReader(pathToFile)
.WithColumns(columns)
.Build(classMap);
var results = fileReader.Read().ToList();
The code above allows us to provide a configuration for the fixed width file. The file can then be mapped into a class or read with a DataReader.
Configuring ClassMaps
It becomes tedious to configure ClassMaps every time you need to parse a file. So FileRift supports pre-configuring ClassMaps for reuse.
var classMap = new ClassMap<Person>();
// ... (as before)
var classMaps = new ClassMaps();
classMaps.RegisterClassMap(classMap);
Now, you can read a file at any time without reconfiguring the ClassMap:
var pathToFile = Path.Join(_basePath, "Files", "CsvWithHeader.csv");
var fileReader = FileRiftBuilder.BuildDelimitedReader(pathToFile)
.HasHeaders()
.WithDelimiter(',')
.WithEscapeCharacter('\"')
.WithTrimmedData()
.Build<Person>();
var results = fileReader.Read().ToList();
Roadmap
- Perform AutoMapping for properties that match the property name exactly
- Allow mapping into types that have a constructor with parameters.
Known Issues
- FileRift currently has issues with nullable types like int?. I am working on fixing this.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. 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. |
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
0.3.1 | 167 | 1/16/2024 |
0.3.0 | 107 | 1/12/2024 |
0.2.1 | 102 | 1/11/2024 |
0.2.0 | 104 | 1/10/2024 |
0.1.1 | 106 | 1/10/2024 |
0.1.0 | 104 | 1/10/2024 |
0.0.9 | 109 | 1/10/2024 |
0.0.8 | 103 | 1/10/2024 |
0.0.7 | 122 | 1/8/2024 |
0.0.6 | 121 | 1/8/2024 |
0.0.5 | 126 | 1/5/2024 |
0.0.4 | 110 | 1/5/2024 |
0.0.3 | 127 | 1/3/2024 |
0.0.2 | 122 | 1/3/2024 |
0.0.1 | 127 | 1/3/2024 |