forked from FOSBOS/diNo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
WinSVSchuelerReader.cs
207 lines (198 loc) · 8.26 KB
/
WinSVSchuelerReader.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
using diNo.diNoDataSetTableAdapters;
using log4net;
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
namespace diNo
{
/// <summary>
/// Liest die Schülerdatei aus der WinSV ein.
/// </summary>
public class WinSVSchuelerReader
{
# region Spaltenindex-Konstanten
private const int schuelerIdSpalte = 2;
private const int nachnameSpalte = 3;
private const int vornameSpalte = 6;
private const int rufnameSpalte = 7;
private const int geschlechtSpalte = 8;
private const int geburtsdatumSpalte = 10;
private const int geburtsortSpalte = 12;
private const int bekenntnisSpalte = 14;
private const int nachnameEltern1Spalte = 15;
private const int vornameEltern1Spalte = 16;
private const int anredeEltern1Spalte = 17;
private const int verwandtschaftsbezeichnungEltern1Spalte = 18;
private const int nachnameEltern2Spalte = 20;
private const int vornameEltern2Spalte = 21;
private const int anredeEltern2Spalte = 22;
private const int verwandtschaftsbezeichnungEltern2Spalte = 23;
private const int anschr1PlzSpalte = 25;
private const int anschr1OrtSpalte = 26;
private const int anschr1StrasseSpalte = 27;
private const int anschr1TelefonSpalte = 28;
private const int klasseSpalte = 52;
private const int jahrgangsstufeSpalte = 53;
private const int ausbildungsrichtungSpalte = 58;
private const int fremdsprache2Spalte = 60;
private const int reliOderEthikSpalte = 63;
private const int wahlpflichtfachSpalte = 64;
private const int wahlfach1Spalte = 73;
private const int wahlfach2Spalte = 74;
private const int wahlfach3Spalte = 75;
private const int wahlfach4Spalte = 76;
private const int wdh1JahrgangsstufeSpalte = 86;
private const int wdh2JahrgangsstufeSpalte = 87;
private const int wdh1GrundSpalte = 91;
private const int wdh2GrundSpalte = 92;
private const int probezeitBisSpalte = 98;
private const int austrittsdatumSpalte = 122;
private const int schulischeVorbildungSpalte = 128;
private const int beruflicheVorbildungSpalte = 129;
private const int lrsStoerungSpalte = 215;
private const int lrsSchwaecheSpalte = 216;
private const int lrsBisDatumSpalte = 254;
#endregion
/// <summary>
/// Der log4net-Logger.
/// </summary>
private static readonly log4net.ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Die Methode zum Einlesen der Daten.
/// </summary>
/// <param name="fileName">Der Dateiname.</param>
public static void ReadSchueler(string fileName)
{
using (StreamReader reader = new StreamReader(fileName, Encoding.GetEncoding("iso-8859-1")))
using (SchuelerTableAdapter tableAdapter = new SchuelerTableAdapter())
using (KlasseTableAdapter klasseTableAdapter = new KlasseTableAdapter())
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
if (string.IsNullOrEmpty(line))
{
log.Debug("Ignoriere Leerzeile");
continue;
}
string[] array = line.Split(new string[] { "\t" }, StringSplitOptions.None);
string[] cleanArray = array.Select(aString => aString.Trim(new char[] { '\"', ' ', '\n' })).ToArray();
int klasseId = GetKlasseId(klasseTableAdapter, cleanArray[klasseSpalte].Trim());
if (klasseId == -1)
{
log.Debug("Ignoriere einen Schüler ohne richtige Klasse. Übergebene Klasse war " + cleanArray[klasseSpalte]);
continue;
}
// wenn der Schüler noch nicht vorhanden ist
if (tableAdapter.GetDataById(int.Parse(cleanArray[schuelerIdSpalte])).Count == 0)
{
tableAdapter.Insert(
int.Parse(cleanArray[schuelerIdSpalte]),
cleanArray[nachnameSpalte],
cleanArray[vornameSpalte],
klasseId,
cleanArray[rufnameSpalte],
cleanArray[geschlechtSpalte],
ParseDate(cleanArray[geburtsdatumSpalte]),
cleanArray[geburtsortSpalte],
cleanArray[bekenntnisSpalte],
cleanArray[anschr1PlzSpalte],
cleanArray[anschr1OrtSpalte],
cleanArray[anschr1StrasseSpalte],
cleanArray[anschr1TelefonSpalte],
ChangeAusbildungsrichtung(cleanArray[ausbildungsrichtungSpalte]),
cleanArray[fremdsprache2Spalte],
cleanArray[reliOderEthikSpalte],
cleanArray[wahlpflichtfachSpalte],
cleanArray[wahlfach1Spalte],
cleanArray[wahlfach2Spalte],
cleanArray[wahlfach3Spalte],
cleanArray[wahlfach4Spalte],
cleanArray[wdh1JahrgangsstufeSpalte],
cleanArray[wdh2JahrgangsstufeSpalte],
cleanArray[wdh1GrundSpalte],
cleanArray[wdh2GrundSpalte],
ParseDate(cleanArray[probezeitBisSpalte]),
ParseDate(cleanArray[austrittsdatumSpalte]),
cleanArray[schulischeVorbildungSpalte],
cleanArray[beruflicheVorbildungSpalte],
cleanArray[lrsStoerungSpalte] == "1",
cleanArray[lrsSchwaecheSpalte] == "1",
ParseDate(cleanArray[lrsBisDatumSpalte]),
cleanArray[verwandtschaftsbezeichnungEltern1Spalte],
cleanArray[nachnameEltern1Spalte],
cleanArray[vornameEltern1Spalte],
cleanArray[anredeEltern1Spalte],
cleanArray[nachnameEltern2Spalte],
cleanArray[vornameEltern2Spalte],
cleanArray[anredeEltern2Spalte],
cleanArray[verwandtschaftsbezeichnungEltern2Spalte]
);
}
}
}
}
/// <summary>
/// Sucht die ID der Klasse in der Datenbank. Versucht auch zu beurteilen, ob es sich überhaupt um eine echte Klasse handelt.
/// Legt auch Klassen ggf. selbstständig in der Datenbank an.
/// </summary>
/// <param name="klasseTableAdapter">Der Table Adapter für Klassen.</param>
/// <param name="klasse">Die Klassenbezeichnung.</param>
/// <returns>Die Id der Klasse oder -1 falls die Klasse ungültig ist.</returns>
private static int GetKlasseId(KlasseTableAdapter klasseTableAdapter, string klasse)
{
var klasseDBresult = klasseTableAdapter.GetDataByBezeichnung(klasse);
if (klasseDBresult.Count == 1)
{
return klasseDBresult[0].Id;
}
else
{
// -N : Klassen für kommendes Jahr
// AHR, FHR: Klassen des vergangenen Jahres
// Abm: Abmeldungen
// Ex, Import: ?
if (klasse.EndsWith("-N") || klasse.Contains("AHR") || klasse.Contains("FHR") || klasse.Contains("Abm") || klasse.Equals("Ex") || klasse.Equals("Import"))
{
return -1;
}
else
{
klasseTableAdapter.Insert(klasse);
var neueKlasse = klasseTableAdapter.GetDataByBezeichnung(klasse);
return neueKlasse[0].Id;
}
}
}
/// <summary>
/// Macht aus einem Datummstring ein DateTime oder null wenn das Datum leer ist.
/// </summary>
/// <param name="date">Der Datumsstring.</param>
/// <returns>Ein DateTime oder null.</returns>
private static DateTime? ParseDate(string date)
{
if (string.IsNullOrEmpty(date))
return null;
return DateTime.Parse(date, CultureInfo.CurrentCulture);
}
/// <summary>
/// Hauptzweck der Methode: W statt WVR im Wirtschaftszweig verwenden.
/// </summary>
/// <param name="ausbildungsrichtung">Die Ausbildungsrichtung aus der Schüler SV. z. B. WVR für Wirtschaft.</param>
/// <returns>Ein-Buchstabige Ausbildungsrichtung, z. B. W für Wirtschaft.</returns>
private static string ChangeAusbildungsrichtung(string ausbildungsrichtung)
{
switch (ausbildungsrichtung)
{
case "S": return "S";
case "T": return "T";
case "WVR": return "W";
case "W": return "W"; // manchmal steht W auch schon drin
case "V": return "V"; // Vorklasse FOS hat noch keine Ausbildungsrichtung
default: throw new InvalidOperationException("Unbekannte Ausbildungsrichtung " + ausbildungsrichtung);
}
}
}
}