6
6
using System . Reflection ;
7
7
using System . Text ;
8
8
9
- using CSVFile ;
10
-
11
9
using CsvHelper ;
12
10
13
11
using Lumina ;
14
12
using Lumina . Data ;
15
13
16
14
using LuminaSupplemental . Excel . Model ;
15
+ using Sylvan . Data . Csv ;
16
+
17
+ using CsvDataReader = Sylvan . Data . Csv . CsvDataReader ;
17
18
18
19
namespace LuminaSupplemental . Excel . Services ;
19
20
20
21
public static class CsvLoader
21
22
{
22
- public static List < T > LoadCsv < T > ( string filePath , out List < string > failedLines , out List < Exception > exceptions , GameData ? gameData = null , Language ? language = null ) where T : ICsv , new ( )
23
+ public static List < T > LoadCsv < T > ( string filePath , bool includesHeaders , out List < string > failedLines , out List < Exception > exceptions , GameData ? gameData = null , Language ? language = null ) where T : ICsv , new ( )
23
24
{
24
- using var fileStream = new FileStream ( filePath , FileMode . Open ) ;
25
- using ( StreamReader reader = new StreamReader ( fileStream ) )
26
- {
27
- failedLines = new List < string > ( ) ;
28
- exceptions = new List < Exception > ( ) ;
29
- var items = new List < T > ( ) ;
25
+ failedLines = new List < string > ( ) ;
26
+ exceptions = new List < Exception > ( ) ;
27
+ var items = new List < T > ( ) ;
30
28
31
- //Loading an empty file
32
- if ( reader . EndOfStream )
29
+ using CsvDataReader dr = CsvDataReader . Create ( filePath , new CsvDataReaderOptions ( ) { HasHeaders = includesHeaders } ) ;
30
+ while ( dr . Read ( ) )
31
+ {
32
+ string [ ] fields = new string [ dr . FieldCount ] ;
33
+
34
+ for ( int i = 0 ; i < dr . FieldCount ; i ++ )
33
35
{
34
- return items ;
36
+ fields [ i ] = dr . GetString ( i ) ;
35
37
}
36
-
37
- FileInfo f = new FileInfo ( filePath ) ;
38
- var fileContents = reader . ReadToEnd ( ) ;
39
- fileContents = fileContents . ReplaceLineEndings ( "\n " ) ; // Works around the fact that apparently CI can change line endings
40
- var csvReader = CSVFile . CSVReader . FromString ( fileContents , new CSVSettings { Encoding = Encoding . UTF8 , LineSeparator = "\n " , BufferSize = ( int ) f . Length } ) ; //BufferSize fixes a infinite loop
41
- foreach ( var line in csvReader . Lines ( ) )
38
+ T item = new T ( ) ;
39
+ try
42
40
{
43
- T item = new T ( ) ;
44
- try
41
+ item . FromCsv ( fields ) ;
42
+ if ( gameData != null && language != null )
45
43
{
46
- item . FromCsv ( line ) ;
47
- if ( gameData != null && language != null )
48
- {
49
- item . PopulateData ( gameData . Excel , language . Value ) ;
50
- }
51
- items . Add ( item ) ;
52
- }
53
- catch ( Exception e )
54
- {
55
- exceptions . Add ( e ) ;
56
- failedLines . Add ( String . Join ( "," , line ) ) ;
44
+ item . PopulateData ( gameData . Excel , language . Value ) ;
57
45
}
46
+ items . Add ( item ) ;
47
+ }
48
+ catch ( Exception e )
49
+ {
50
+ exceptions . Add ( e ) ;
51
+ failedLines . Add ( String . Join ( "," , fields ) ) ;
58
52
}
59
- return items ;
60
53
}
54
+ return items ;
61
55
}
62
56
63
57
public const string DungeonBossResourceName = "LuminaSupplemental.Excel.Generated.DungeonBoss.csv" ;
@@ -83,7 +77,7 @@ public static class CsvLoader
83
77
public const string FateItemResourceName = "LuminaSupplemental.Excel.Generated.FateItem.csv" ;
84
78
public const string GardeningCrossbreedResourceName = "LuminaSupplemental.Excel.Generated.GardeningCrossbreed.csv" ;
85
79
86
- public static List < T > LoadResource < T > ( string resourceName , out List < string > failedLines , out List < Exception > exceptions , GameData ? gameData = null , Language ? language = null ) where T : ICsv , new ( )
80
+ public static List < T > LoadResource < T > ( string resourceName , bool includesHeaders , out List < string > failedLines , out List < Exception > exceptions , GameData ? gameData = null , Language ? language = null ) where T : ICsv , new ( )
87
81
{
88
82
var assembly = Assembly . GetExecutingAssembly ( ) ;
89
83
using ( Stream ? stream = assembly . GetManifestResourceStream ( resourceName ) )
@@ -96,16 +90,21 @@ public static class CsvLoader
96
90
}
97
91
using ( StreamReader reader = new StreamReader ( stream ) )
98
92
{
99
- var file = reader . ReadToEnd ( ) ;
100
- file = file . ReplaceLineEndings ( "\n " ) ; // Works around the fact that apparently CI can change line endings
101
- var csvReader = CSVFile . CSVReader . FromString ( file , new CSVSettings { Encoding = Encoding . UTF8 , LineSeparator = "\n " } ) ;
102
93
var items = new List < T > ( ) ;
103
- foreach ( var line in csvReader . Lines ( ) )
94
+
95
+ using CsvDataReader dr = CsvDataReader . Create ( reader , new CsvDataReaderOptions ( ) { HasHeaders = includesHeaders } ) ;
96
+ while ( dr . Read ( ) )
104
97
{
98
+ string [ ] fields = new string [ dr . FieldCount ] ;
99
+
100
+ for ( int i = 0 ; i < dr . FieldCount ; i ++ )
101
+ {
102
+ fields [ i ] = dr . GetString ( i ) ;
103
+ }
105
104
T item = new T ( ) ;
106
105
try
107
106
{
108
- item . FromCsv ( line ) ;
107
+ item . FromCsv ( fields ) ;
109
108
110
109
if ( gameData != null && language != null )
111
110
{
@@ -117,7 +116,7 @@ public static class CsvLoader
117
116
catch ( Exception e )
118
117
{
119
118
exceptions . Add ( e ) ;
120
- failedLines . Add ( String . Join ( "," , line ) ) ;
119
+ failedLines . Add ( String . Join ( "," , fields ) ) ;
121
120
}
122
121
}
123
122
0 commit comments