Skip to content

Commit 1801cb3

Browse files
committed
- Version 5.0.0 check-in
1 parent be0835e commit 1801cb3

28 files changed

+161
-718
lines changed

DeveloperGuide.md

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public class File<T> where T: FileLine
110110
-------------
111111

112112

113-
**Case 2:** Let us see how we can parse a delimiter separted file with header and footer rows.
113+
**Case 2:** Let us see how we can parse a delimiter separted file with prefixed header, data and footer rows.
114114
------------------------------------------------------------------------
115115

116116
**Note:** This file will have rows with line head to determine each row type. By default, the line heads are 'H' for header, 'D' for data and 'F' for footer respectively. all these line heads are configurable via the config.
@@ -131,13 +131,7 @@ The configuration is the same as before. We can override the default line heads
131131
```
132132
{
133133
"configSettings":{
134-
"parserSettings":{ "delimiter": { "value":"|"} ,
135-
"lineHeaders": {
136-
"header":"H",
137-
"footer":"F",
138-
"data":"D"
139-
}
140-
},
134+
"parserSettings":{ "delimiter": { "value":"|"} },
141135
"providerSettings":{
142136
"folderPath":"C:work",
143137
"fileNameFormat":"File*.txt",
@@ -154,21 +148,49 @@ The configuration is the same as before. We can override the default line heads
154148
Like before we need a line class to map to each type of the row in the file
155149
ie one for the header, footer and data line respectively.
156150

151+
However, this time we derive from `PrefixedFileLine` class instead of `FileLine` class.
152+
The `PrefixedFileLine` class has an extra property called `Prefix` which is used to determine the type of the line.
153+
The prefix is set to the first column of the row by default.
154+
157155
We continue by creating two extra classes HeaderLine and FooterLine as follows.
158156

159-
public class Header : FileLine
160-
{
161-
[Column(0)]
162-
public string Name { get; set; }
163-
[Column(1)]
164-
public DateTime Date { get; set; }
165-
}
157+
public class Header : PrefixedFileLine
158+
{
159+
public override string Prefix => "H";
160+
161+
[Column(0)]
162+
public LineType Type { get; set; }
163+
[Column(1)]
164+
public string Name { get; set; }
165+
[Column(2)]
166+
public DateTime Date { get; set; }
167+
}
166168

167-
public class Footer : FileLine
168-
{
169-
[Column(0)]
170-
public string FileRemarks { get; set; }
171-
}
169+
public class Employee : PrefixedFileLine
170+
{
171+
public override string Prefix => "D";
172+
173+
[Column(0)]
174+
public LineType Type { get; set; }
175+
[Column(1)]
176+
public string Title { get; set; }
177+
[Column(2)]
178+
public string Name { get; set; }
179+
[Column(3)]
180+
public string Sex { get; set; }
181+
[Column(4, "London")]
182+
public string Location { get; set; }
183+
}
184+
185+
public class Footer : FileLine
186+
{
187+
public override string Prefix => "F";
188+
189+
[Column(0)]
190+
public LineType Type { get; set; }
191+
[Column(1)]
192+
public string FileRemarks { get; set; }
193+
}
172194

173195

174196
To parse the file you call the GetFiles() Method as follows -

FileUtil.Core.sln

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileUtil.Tests", "test\File
1111
EndProject
1212
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{D549CC35-5318-45B0-ACCD-F28C543E482C}"
1313
ProjectSection(SolutionItems) = preProject
14-
.github\workflows\Master-Build.yml = .github\workflows\Master-Build.yml
1514
.github\workflows\CI-Package-Release.yml = .github\workflows\CI-Package-Release.yml
15+
.github\workflows\Master-Build.yml = .github\workflows\Master-Build.yml
1616
.github\workflows\Master-CodeQL.yml = .github\workflows\Master-CodeQL.yml
1717
.github\workflows\PR-CodeQL.yml = .github\workflows\PR-CodeQL.yml
1818
EndProjectSection
@@ -25,6 +25,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".misc", ".misc", "{8EDBC8F3
2525
ProjectSection(SolutionItems) = preProject
2626
.gitattributes = .gitattributes
2727
.gitignore = .gitignore
28+
DeveloperGuide.md = DeveloperGuide.md
2829
GitVersion.yml = GitVersion.yml
2930
License.md = License.md
3031
nuget.config = nuget.config

src/FileUtil/ColumnAttribute.cs

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/FileUtil/Configuration/IParserSettings.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,5 @@ namespace FileUtil.Configuration
33
public interface IParserSettings
44
{
55
IDelimiter Delimiter { get; set; }
6-
ILineHeaders LineHeaders { get; set; }
76
}
87
}

src/FileUtil/Engine.cs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1+
using System.Collections.Generic;
12
using System.Linq;
23
using FileUtil.Configuration;
3-
using FileUtil.Parser;
4-
using FileUtil.Parser.Impl;
54
using FileUtil.Provider;
65
using FileUtil.Provider.Impl;
6+
using parsley;
77

88
namespace FileUtil
99
{
1010
public class Engine
1111
{
1212
private readonly IFileProvider fileProvider;
13-
private readonly ILineParser lineParser;
13+
private readonly IParser parser;
1414

15-
internal Engine(ILineParser lineParser, IFileProvider fileProvider)
15+
internal Engine(IParser parser, IFileProvider fileProvider)
1616
{
1717
this.fileProvider = fileProvider;
18-
this.lineParser = lineParser;
18+
this.parser = parser;
1919
}
2020

2121
/// <summary>
@@ -26,7 +26,7 @@ internal Engine(ILineParser lineParser, IFileProvider fileProvider)
2626
/// </remarks>
2727
/// <param name="settings">Configuration settings for default file provider and parser</param>
2828
public Engine(IConfigSettings settings)
29-
: this(new LineParser(settings.ParserSettings), new DefaulProvider(settings.ProviderSettings, new FileHelper()))
29+
: this(new Parser((settings?.ParserSettings?.Delimiter?.Value).GetValueOrDefault(',')), new DefaulProvider(settings.ProviderSettings, new FileHelper()))
3030
{
3131
}
3232

@@ -36,7 +36,7 @@ public Engine(IConfigSettings settings)
3636
/// <param name="parserSettings">Parser settings.</param>
3737
/// <param name="fileProvider">Custom file provider instance.</param>
3838
public Engine(IParserSettings parserSettings, IFileProvider fileProvider)
39-
: this(new LineParser(parserSettings), fileProvider)
39+
: this(new Parser((parserSettings?.Delimiter?.Value).GetValueOrDefault(',')), fileProvider)
4040
{
4141
}
4242

@@ -64,9 +64,8 @@ public Engine(IParserSettings parserSettings, IFileProvider fileProvider)
6464
Lines = file.Lines,
6565
},
6666

67-
Data = lineParser.Parse<T>(file.Lines)
68-
})
69-
.ToArray();
67+
Data = parser.Parse<T>(file.Lines)
68+
}).ToArray();
7069
}
7170

7271
/// <summary>
@@ -88,14 +87,18 @@ public Engine(IParserSettings parserSettings, IFileProvider fileProvider)
8887
/// Collection of Files each parsed with header, footer and data typed arrays
8988
/// </returns>
9089
public File<TH, TD, TF>[] GetFiles<TH, TD, TF>()
91-
where TH : FileLine, new()
92-
where TD : FileLine, new()
93-
where TF : FileLine, new()
90+
where TH : PrefixedFileLine, new()
91+
where TD : PrefixedFileLine, new()
92+
where TF : PrefixedFileLine, new()
9493
{
9594
var files = fileProvider.GetFiles();
9695

9796
return files.Select(file =>
9897
{
98+
var headerLines = file.Lines.Where(line => line.StartsWith(new TH().Prefix)).ToArray();
99+
var footerLines = file.Lines.Where(line => line.StartsWith(new TF().Prefix)).ToArray();
100+
var dataLines = file.Lines.Where(line => line.StartsWith(new TD().Prefix)).ToArray();
101+
99102
var parsed = new File<TH, TD, TF>
100103
{
101104
FileMeta = new FileMeta
@@ -106,9 +109,9 @@ public File<TH, TD, TF>[] GetFiles<TH, TD, TF>()
106109
Lines = file.Lines,
107110
},
108111

109-
Header = lineParser.Parse<TH>(file.Lines, LineType.Header).FirstOrDefault(),
110-
Footer = lineParser.Parse<TF>(file.Lines, LineType.Footer).FirstOrDefault(),
111-
Data = lineParser.Parse<TD>(file.Lines, LineType.Data)
112+
Header = parser.Parse<TH>(headerLines).FirstOrDefault(),
113+
Data = parser.Parse<TD>(dataLines).ToArray(),
114+
Footer = parser.Parse<TF>(footerLines).FirstOrDefault()
112115
};
113116

114117
return parsed;

src/FileUtil/File.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,37 @@
1-
namespace FileUtil
1+
namespace FileUtil
22
{
33
public class File<T> where T : FileLine
44
{
55
/// <summary>
66
/// File meta data.
77
/// </summary>
88
public FileMeta FileMeta { get; set; }
9+
910
/// <summary>
1011
/// Strongly typed parsed lines.
1112
/// </summary>
1213
public T[] Data { get; set; }
13-
1414
}
1515

16-
public class File<TH, TD, TF> where TH : FileLine, new()
17-
where TD : FileLine, new()
18-
where TF : FileLine, new()
16+
public class File<TH, TD, TF> where TH : PrefixedFileLine, new()
17+
where TD : PrefixedFileLine, new()
18+
where TF : PrefixedFileLine, new()
1919
{
2020
/// <summary>
2121
/// File meta data.
2222
/// </summary>
2323
public FileMeta FileMeta { get; set; }
24+
2425
/// <summary>
2526
/// Parsed header line.
2627
/// </summary>
2728
public TH Header { get; set; }
29+
2830
/// <summary>
2931
/// Parsed data lines.
3032
/// </summary>
3133
public TD[] Data { get; set; }
34+
3235
/// <summary>
3336
/// Parsed footer line.
3437
/// </summary>
@@ -41,14 +44,17 @@ public class FileMeta
4144
/// File Path
4245
/// </summary>
4346
public string FilePath { get; set; }
47+
4448
/// <summary>
4549
/// File Name
4650
/// </summary>
4751
public string FileName { get; set; }
52+
4853
/// <summary>
4954
/// File Size
5055
/// </summary>
5156
public long FileSize { get; set; }
57+
5258
/// <summary>
5359
/// Raw lines in the file (not parsed).
5460
/// </summary>

src/FileUtil/FileLine.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using parsley;
23

34
namespace FileUtil
45
{
@@ -10,7 +11,6 @@ protected FileLine()
1011
}
1112

1213
public int Index { get; set; }
13-
public LineType Type { get; set; }
1414
public IList<string> Errors { get; set; }
1515
}
1616
}

src/FileUtil/FileUtil.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,7 @@ Example: pipe delimited, csv, tsv, etc.</Description>
4141
<PackagePath>\</PackagePath>
4242
</None>
4343
</ItemGroup>
44+
<ItemGroup>
45+
<PackageReference Include="Parsley.Net" Version="1.0.0" />
46+
</ItemGroup>
4447
</Project>

src/FileUtil/IFileLine.cs

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/FileUtil/LineType.cs

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)