Skip to content

Instantly share code, notes, and snippets.

@KarateJB
Last active July 22, 2020 11:04
Show Gist options
  • Save KarateJB/edbd100e50072a0e9ee8e006f04856b7 to your computer and use it in GitHub Desktop.
Save KarateJB/edbd100e50072a0e9ee8e006f04856b7 to your computer and use it in GitHub Desktop.
jehugaleahsa/FlatFiles sample codes
/*
* FlatFiles: https://github.com/jehugaleahsa/FlatFiles
* Sample code: https://github.com/jehugaleahsa/FlatFiles/issues/63
*/
internal class MyModel
{
[MaxLength(5)]
public string Prop1 {get; set;}
[MaxLength(5)]
public string Prop2 {get; set;}
}
internal class MyFooterModel
{
[MaxLength(8)]
public string TotalCnt {get; set;}
}
/* Sample file
XXXXXYYYYY
ZZZZZWWWWW
00000002
/*
/* Read file for multiple mappers */
IList<MyModel> myDatas = null;
var fixedLenOptions = new FixedLengthOptions()
{
IsFirstRecordHeader = false,
};
#region FixedLengthTypeMapper for Records
Func<string, int> getRecordPropMaxLen = (prop) => typeof(MyModel).GetAttributeValue(prop, (MaxLengthAttribute a) => a.Length);
var recordMapper = FixedLengthTypeMapper.Define<BloTransAuth>();
recordMapper.Property(c => c.Prop1, new Window(getRecordPropMaxLen(nameof(MyModel.Prop1)))).ColumnName(nameof(MyModel.Prop1));
recordMapper.Property(c => c.Prop2, new Window(getRecordPropMaxLen(nameof(MyModel.Prop2)))).ColumnName(nameof(MyModel.Prop2));
#endregion
#region FixedLengthTypeMapper for Footer
Func<string, int> getFooterPropMaxLen = (prop) => typeof(BloTransAuthFooter).GetAttributeValue(prop, (MaxLengthAttribute a) => a.Length);
var footerMapper = FixedLengthTypeMapper.Define<MyFooterModel>();
footerMapper.Property(c => c.TotalCnt, new Window(getFooterPropMaxLen(nameof(MyFooterModel.TotalCnt)))).ColumnName(nameof(MyFooterModel.TotalCnt));
#endregion
int expectedCnt = 0;
#region Read data
using (var streamReader = new StreamReader(file.FullPath))
{
// transAuths = recordMapper.Read(streamReader, fixedLenOptions).ToList(); // Use this way if all lines are the same length, or it will throw an exception.
var readerTransAuth = recordMapper.GetReader(streamReader, fixedLenOptions); // fixedLenOptions is optional.
readerTransAuth.RecordRead += (sender, e) =>
{
e.IsSkipped = e.Record.Length != 10;
};
transAuths = readerTransAuth.ReadAll().ToList();
}
#endregion
#region Read Trailer
using (var streamReader = new StreamReader(file.FullPath))
{
var readerFooter = footerMapper.GetReader(streamReader);
readerFooter.RecordRead += (sender, e) =>
{
e.IsSkipped = e.Record.Length != 8;
};
var footer = readerFooter.ReadAll().FirstOrDefault();
_ = int.TryParse(footer?.TotalCnt, out expectedCnt);
}
#endregion
/* Another sample to read file once for multiple mappers */
var selector = new FixedLengthSchemaSelector();
selector.When(values => values.Length == 161).Use(recordMapper.GetSchema());
selector.When(values => values.Length == 9).Use(recordMapper.GetSchema());
selector.WithDefault(recordMapper.GetSchema());
using (var streamReader = new StreamReader(file.FullPath))
{
var reader = new FixedLengthReader(streamReader, selector, fixedLenOptions);
while (reader.Read())
{
object[] values = reader.GetValues();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment