Skip to content

Commit bd03ad3

Browse files
committed
- Refactor engine to align parsers
1 parent 0988d44 commit bd03ad3

File tree

12 files changed

+138
-154
lines changed

12 files changed

+138
-154
lines changed

README.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ FileLine base class has an index property that holds the index of the parsed lin
119119
Once you have created the line class it is as simple as calling the Engine.GetFile() method as follows
120120

121121
>
122-
`var files = new Engine<Employee>(configSettings).GetFiles();`
122+
`var files = new Engine(configSettings).GetFiles<Employee>();`
123123
124124
The engine will parse the files found at the specified folder location and return a collection of
125125
`File<Employee>` objects ie. one for each file parsed with an array of strongly typed lines (in this case Employee[]).
@@ -188,7 +188,7 @@ ie one for the header, footer and data line respectively.
188188

189189
We continue by creating two extra classes HeaderLine and FooterLine as follows.
190190

191-
public class HeaderLine : FileLine
191+
public class Header : FileLine
192192
{
193193
[Column(0)]
194194
public string Name { get; set; }
@@ -205,9 +205,9 @@ We continue by creating two extra classes HeaderLine and FooterLine as follows.
205205

206206
To parse the file you call the GetFiles() Method as follows -
207207
>
208-
`var files = new Engine<HeaderLine, Employee, Footer>(configSettings).GetFiles();`
208+
`var files = new Engine(configSettings).GetFiles<Header, Employee, Footer>();`
209209
210-
The engine will parse the files and return a collection of `File<HeaderLine, Employee, Footer>` objects
210+
The engine will parse the files and return a collection of `File<Header, Employee, Footer>` objects
211211
ie. one for each file parsed with strongly typed header, footer and data line arrays.
212212

213213

@@ -243,9 +243,9 @@ An example dummy implementation is as follows
243243

244244
You can pass the custom provider to the engine as follows -
245245

246-
`var files = new Engine<Employee>(configSettings, new CustomProvider()).GetFiles();`
246+
`var files = new Engine(configSettings, new CustomProvider()).GetFiles<Employee>();`
247247

248-
`var files = new Engine<HeaderLine, Employee, Footer>(configSettings, new CustomProvider()).GetFiles();`
248+
`var files = new Engine(configSettings, new CustomProvider()).GetFiles<Header, Employee, Footer>();`
249249

250250
Returns
251251
```
@@ -258,15 +258,15 @@ public class File<TH, TD, TF>
258258
/// <summary>
259259
/// Parsed header lines.
260260
/// </summary>
261-
public TH[] Headers { get; set; }
261+
public TH Header { get; set; }
262262
/// <summary>
263263
/// Parsed data lines.
264264
/// </summary>
265265
public TD[] Data { get; set; }
266266
/// <summary>
267-
/// Parsed footer lines.
267+
/// Parsed footer line.
268268
/// </summary>
269-
public TF[] Footers { get; set; }
269+
public TF Footer { get; set; }
270270
}
271271
```
272272

src/Ninja.FileUtil/Engine.cs

+40-67
Original file line numberDiff line numberDiff line change
@@ -7,39 +7,43 @@
77

88
namespace Ninja.FileUtil
99
{
10-
public class Engine<T> where T : FileLine, new()
10+
public class Engine
1111
{
1212
private readonly IFileProvider fileProvider;
1313
private readonly ILineParser lineParser;
1414

15-
internal Engine(IFileProvider fileProvider, ILineParser lineParser)
15+
internal Engine(ILineParser lineParser, IFileProvider fileProvider)
1616
{
1717
this.fileProvider = fileProvider;
1818
this.lineParser = lineParser;
1919
}
20+
2021
/// <summary>
21-
/// Create Single line type Engine instance with default parser.
22+
/// Create Engine instance with default parser and file provider.
2223
/// </summary>
23-
/// <param name="parserSettings">Parser setting instance.</param>
24-
/// <param name="fileProvider">File provider instance.</param>
25-
public Engine(IParserSettings parserSettings, IFileProvider fileProvider)
26-
: this(fileProvider, new LineParser(parserSettings.Delimiter))
24+
/// <remarks>
25+
/// You need to provide the parser and file provider settings.
26+
/// </remarks>
27+
/// <param name="settings">Configuration settings for default file provider and parser</param>
28+
public Engine(IConfigSettings settings)
29+
: this(new LineParser(settings.ParserSettings), new DefaulProvider(settings.ProviderSettings, new FileHelper()))
2730
{
2831

2932
}
33+
3034
/// <summary>
31-
/// Create Multi line type Engine instance with default parser and default file provider.
35+
/// Create Engine instance with custom file provider and default parser.
3236
/// </summary>
33-
/// <param name="settings">Configuration settings for default file provider and default parser</param>
34-
public Engine(IConfigSettings settings)
35-
: this(settings.ParserSettings, new DefaulProvider(settings.ProviderSettings, new FileHelper()))
37+
/// <param name="parserSettings">Parser settings.</param>
38+
/// <param name="fileProvider">Custom file provider instance.</param>
39+
public Engine(IParserSettings parserSettings, IFileProvider fileProvider)
40+
: this(new LineParser(parserSettings), fileProvider)
3641
{
37-
42+
3843
}
39-
4044
/// <summary>
4145
/// Get all single fixed format lines from a text file parsed into a strongly typed array
42-
/// Default delimiter is '|'
46+
/// Default delimiter is '|'. Override by specifying the delimiter in parser settings.
4347
/// Example File -
4448
/// "John Walsh|456RT4|True|Male"
4549
/// "Simone Walsh|456RT5|True|Female"
@@ -48,64 +52,30 @@ public Engine(IConfigSettings settings)
4852
/// <returns>
4953
/// Collection of Files each parsed with typed class arrays
5054
/// </returns>
51-
public File<T>[] GetFiles()
55+
public File<T>[] GetFiles<T>() where T : FileLine, new()
5256
{
5357
var files = fileProvider.GetFiles();
5458
return files.Select(file => new File<T>
55-
{
56-
FileMeta = new FileMeta
5759
{
58-
FileName = file.FileName,
59-
FilePath = file.FilePath,
60-
FileSize = file.FileSize,
61-
Lines = file.Lines,
62-
},
63-
64-
Data = lineParser.ParseWithNoLineType<T>(file.Lines)
65-
})
66-
.ToArray();
67-
}
68-
}
69-
70-
public class Engine<TH, TD, TF> where TH : FileLine, new()
71-
where TD : FileLine, new()
72-
where TF : FileLine, new()
73-
{
74-
private readonly IFileProvider fileProvider;
75-
private readonly ILineParser lineParser;
76-
private readonly IParserSettings parserSettings;
77-
78-
internal Engine(IFileProvider fileProvider, ILineParser lineParser)
79-
{
80-
this.fileProvider = fileProvider;
81-
this.lineParser = lineParser;
82-
}
83-
/// <summary>
84-
/// Create Multi line type Engine instance with default parser.
85-
/// </summary>
86-
/// <param name="parserSettings">Parser setting instance.</param>
87-
/// <param name="fileProvider">File provider instance.</param>
88-
public Engine(IParserSettings parserSettings, IFileProvider fileProvider)
89-
: this(fileProvider, new LineParser(parserSettings.Delimiter))
90-
{
91-
this.parserSettings = parserSettings;
92-
}
93-
94-
/// <summary>
95-
/// Create Multi line type Engine instance with default parser and default file provider.
96-
/// </summary>
97-
/// <param name="settings">Configuration settings for default file provider and default parser</param>
98-
public Engine(IConfigSettings settings)
99-
: this(settings.ParserSettings, new DefaulProvider(settings.ProviderSettings, new FileHelper()))
100-
{
60+
FileMeta = new FileMeta
61+
{
62+
FileName = file.FileName,
63+
FilePath = file.FilePath,
64+
FileSize = file.FileSize,
65+
Lines = file.Lines,
66+
},
10167

68+
Data = lineParser.Parse<T>(file.Lines)
69+
})
70+
.ToArray();
10271
}
10372

10473
/// <summary>
10574
/// Get all multi-format lines from a text file parsed into header, data and footer
10675
/// typed arrays respectively.
107-
/// Header line starts with H, data line starts with D and
108-
/// footer line starts with F by defaults
76+
/// Default delimiter is '|'.
77+
/// By default, Header line starts with H, data line starts with D and footer line starts with F.
78+
/// Override these values in parser settings.
10979
/// Example File -
11080
/// "H|22-10-2016|Employee Status"
11181
/// "D|John Walsh|456RT4|True"
@@ -118,8 +88,11 @@ public Engine(IConfigSettings settings)
11888
/// <returns>
11989
/// Collection of Files each parsed with header, footer and data typed arrays
12090
/// </returns>
121-
public File<TH, TD, TF>[] GetFiles()
122-
{
91+
public File<TH, TD, TF>[] GetFiles<TH,TD,TF>()
92+
where TH : FileLine, new()
93+
where TD : FileLine, new()
94+
where TF : FileLine, new()
95+
{
12396
var files = fileProvider.GetFiles();
12497

12598
return files.Select(file =>
@@ -134,9 +107,9 @@ public File<TH, TD, TF>[] GetFiles()
134107
Lines = file.Lines,
135108
},
136109

137-
Headers = lineParser.ParseWithLineType<TH>(file.Lines.Where(x => x.StartsWith(parserSettings.LineHeaders.GetHeaderValue())).ToArray(), LineType.Header),
138-
Footers = lineParser.ParseWithLineType<TF>(file.Lines.Where(x => x.StartsWith(parserSettings.LineHeaders.GetFooterValue())).ToArray(), LineType.Footer),
139-
Data = lineParser.ParseWithLineType<TD>(file.Lines.Where(x => x.StartsWith(parserSettings.LineHeaders.GetDataValue())).ToArray(), LineType.Data)
110+
Header = lineParser.Parse<TH>(file.Lines, LineType.Header).FirstOrDefault(),
111+
Footer = lineParser.Parse<TF>(file.Lines, LineType.Footer).FirstOrDefault(),
112+
Data = lineParser.Parse<TD>(file.Lines, LineType.Data)
140113
};
141114

142115
return parsed;

src/Ninja.FileUtil/File.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@ public class File<T> where T: FileLine
2222
/// </summary>
2323
public FileMeta FileMeta { get; set; }
2424
/// <summary>
25-
/// Parsed header lines.
25+
/// Parsed header line.
2626
/// </summary>
27-
public TH[] Headers { get; set; }
27+
public TH Header { get; set; }
2828
/// <summary>
2929
/// Parsed data lines.
3030
/// </summary>
3131
public TD[] Data { get; set; }
3232
/// <summary>
33-
/// Parsed footer lines.
33+
/// Parsed footer line.
3434
/// </summary>
35-
public TF[] Footers { get; set; }
35+
public TF Footer { get; set; }
3636
}
3737

3838
public class FileMeta

src/Ninja.FileUtil/Ninja.FileUtil.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<TargetFramework>netstandard2.0</TargetFramework>
44
<RepositoryType>Public</RepositoryType>
@@ -16,6 +16,6 @@ Example: pipe delimited, csv, etc.</Description>
1616
<Product>Fixed Width File Parser</Product>
1717
<PackageProjectUrl>https://github.com/NinjaRocks/FileUtil.Core</PackageProjectUrl>
1818
<PackageIconUrl>https://1drv.ms/u/s!Aq_ncig7TU4551b5fzxOad-pDMfL</PackageIconUrl>
19-
<Version>1.0.4</Version>
19+
<Version>1.1.0</Version>
2020
</PropertyGroup>
2121
</Project>

src/Ninja.FileUtil/Parser/Extensions.cs

+10-10
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,17 @@ public static char GetValue(this IDelimiter delimiter)
2323
return delimiter?.Value ?? ',';
2424
}
2525

26-
public static string GetHeaderValue(this ILineHeaders lineHeaders)
26+
public static string GetLineHead(this ILineHeaders lineHeaders, LineType type)
2727
{
28-
return lineHeaders?.Header ?? "H";
29-
}
30-
public static string GetFooterValue(this ILineHeaders lineHeaders)
31-
{
32-
return lineHeaders?.Footer ?? "F";
33-
}
34-
public static string GetDataValue(this ILineHeaders lineHeaders)
35-
{
36-
return lineHeaders?.Data ?? "D";
28+
switch (type)
29+
{
30+
case LineType.Header:
31+
return lineHeaders?.Header ?? "H";
32+
case LineType.Footer:
33+
return lineHeaders?.Footer ?? "F";
34+
default:
35+
return lineHeaders?.Data ?? "D";
36+
}
3737
}
3838
}
3939
}

src/Ninja.FileUtil/Parser/ILineParser.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ namespace Ninja.FileUtil.Parser
22
{
33
internal interface ILineParser
44
{
5-
T[] ParseWithNoLineType<T>(string[] lines) where T : IFileLine, new();
6-
T[] ParseWithLineType<T>(string[] lines, LineType type) where T : IFileLine, new();
5+
T[] Parse<T>(string[] lines) where T : IFileLine, new();
6+
T[] Parse<T>(string[] lines, LineType type) where T : IFileLine, new();
77
}
8-
98
}

src/Ninja.FileUtil/Parser/Impl/LineParser.cs

+10-10
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,33 @@
66
using System.Threading.Tasks;
77
using Ninja.FileUtil.Configuration;
88

9-
109
namespace Ninja.FileUtil.Parser.Impl
1110
{
1211
internal class LineParser : ILineParser
1312
{
14-
private readonly IDelimiter delimiter;
13+
private readonly IParserSettings parserSettings;
1514

16-
public LineParser(IDelimiter delimiter)
15+
public LineParser(IParserSettings parserSettings)
1716
{
18-
this.delimiter = delimiter;
17+
this.parserSettings = parserSettings;
1918
}
2019

21-
public T[] ParseWithNoLineType<T>(string[] lines) where T : IFileLine, new()
20+
public T[] Parse<T>(string[] lines) where T : IFileLine, new()
2221
{
2322
return Parse<T>(lines, LineType.Data, false);
24-
2523
}
2624

27-
public T[] ParseWithLineType<T>(string[] lines, LineType type) where T : IFileLine, new()
25+
public T[] Parse<T>(string[] lines, LineType type) where T : IFileLine, new()
2826
{
29-
return Parse<T>(lines, type, true);
27+
var filteredLines = lines?.Where(x => x.StartsWith(parserSettings.LineHeaders.GetLineHead(type))).ToArray();
28+
return Parse<T>(filteredLines, type, true);
3029
}
3130

3231
private T[] Parse<T>(string[] lines, LineType type, bool hasLineHeader) where T : IFileLine, new()
3332
{
3433

35-
if (lines == null || lines.Length == 0) return Enumerable.Empty<T>().ToArray();
34+
if (lines == null || lines.Length == 0)
35+
return Enumerable.Empty<T>().ToArray();
3636

3737
var list = new T[lines.Length];
3838

@@ -147,7 +147,7 @@ public LineParser(IDelimiter delimiter)
147147

148148
private string[] GetDelimiterSeparatedValues(string line)
149149
{
150-
var values = line.Split(delimiter.GetValue())
150+
var values = line.Split(parserSettings.Delimiter.GetValue())
151151
.Select(x => !string.IsNullOrWhiteSpace(x)? x.Trim(): x)
152152
.ToArray();
153153
return values;

0 commit comments

Comments
 (0)