Projekt

Obecné

Profil

Stáhnout (8.55 KB) Statistiky
| Větev: | Tag: | Revize:
1 734533a8 A-Konig
using System;
2 5d9a5bd9 A-Konig
using System.Collections.Generic;
3
using System.IO;
4 734533a8 A-Konig
using ServerApp.Parser.InputData;
5
using ServerApp.Parser.OutputInfo;
6 5d9a5bd9 A-Konig
7 734533a8 A-Konig
namespace ServerApp.Parser.Parsers
8 5d9a5bd9 A-Konig
{
9 734533a8 A-Konig
    /// <summary>
10
    /// Class parsing jis files into instances of ActivityInfo divided by given time interval
11
    /// Data parsed from 7am (included) to 18pm (included)
12
    /// </summary>
13 5d9a5bd9 A-Konig
    class JisParser
14
    {
15 734533a8 A-Konig
        
16
        /// <summary>
17
        /// Parses jis data to ActivityInfo instances
18
        /// Data parsed from 7am (included) to 18pm (included)
19
        /// </summary>
20
        /// <param name="folder">Folder with login data files</param>
21
        /// <param name="wholeDay">Should data be parsed as one instance per day (if true parameter interval will be ignored)</param>
22
        /// <param name="interval">Time interval to divide days by, minimum is 1h</param>
23
        /// <returns></returns>
24
        public List<ActivityInfo> ParseJisData(string folder, bool wholeDay = true, int interval = 1)
25 5d9a5bd9 A-Konig
        {
26
            if (!Directory.Exists(folder))
27
                return null;
28
29 734533a8 A-Konig
            List<ActivityInfo> list = new List<ActivityInfo>();
30
31
            // parse all files
32 5d9a5bd9 A-Konig
            string[] fileEntries = Directory.GetFiles(folder);
33
            foreach (string fileName in fileEntries)
34
            {
35 734533a8 A-Konig
                List<ActivityInfo> loadedData = null;
36
37
                // parse as one instance per day
38 5d9a5bd9 A-Konig
                if (wholeDay)
39 0da0ac88 A-Konig
                    loadedData = ProcessOneJisFileAsDays(fileName);
40 734533a8 A-Konig
                // parse by interval length
41 5d9a5bd9 A-Konig
                else
42 260b1217 A-Konig
                    loadedData = ProcessOneJisFileAsIntervals(fileName, interval);
43 5d9a5bd9 A-Konig
44
                list.AddRange(loadedData);
45
            }
46
47
            return list;
48
        }
49
50 734533a8 A-Konig
        /// <summary>
51
        /// Parses data from one data file as one instance per day
52
        /// </summary>
53
        /// <param name="path">Path ti file</param>
54
        /// <returns>List with ActivityInfo instances</returns>
55
        private static List<ActivityInfo> ProcessOneJisFileAsDays(string path)
56 5d9a5bd9 A-Konig
        {
57 734533a8 A-Konig
            if (!File.Exists(path))
58
                return null;
59 5d9a5bd9 A-Konig
60 734533a8 A-Konig
            List<ActivityInfo> jisInfo = new List<ActivityInfo>();
61 5d9a5bd9 A-Konig
            List<JisInstance> list =  CsvDataLoader.LoadJisFile(path);
62
63 734533a8 A-Konig
            // data for each faculty
64 5d9a5bd9 A-Konig
            int[] recordedAmount = new int[TagInfo.faculties.Length];
65 734533a8 A-Konig
            // min/max hour taken into account
66 0da0ac88 A-Konig
            int[] minmaxHour = new int[] { 7, 18 };
67 734533a8 A-Konig
            // interval length
68 0da0ac88 A-Konig
            int range = minmaxHour[1] - minmaxHour[0];
69 5d9a5bd9 A-Konig
70 734533a8 A-Konig
            // first day
71
            DateTime lastStartTime = new DateTime(list[0].dateTime.Year, list[0].dateTime.Month, list[0].dateTime.Day, minmaxHour[0], 0, 0);
72 5d9a5bd9 A-Konig
            for (int i = 0; i < list.Count; i++)
73
            {
74 0da0ac88 A-Konig
                int currHour = list[i].dateTime.Hour;
75
                if (currHour < minmaxHour[0] || currHour > minmaxHour[1])
76
                    continue;
77
78 734533a8 A-Konig
                // start of the day -> make an instance
79 0da0ac88 A-Konig
                string place = list[i].placeTag;
80 734533a8 A-Konig
                DateTime date = new DateTime(list[i].dateTime.Year, list[i].dateTime.Month, list[i].dateTime.Day, minmaxHour[0], 0, 0);
81 0da0ac88 A-Konig
                if (!date.Equals(lastStartTime)) 
82 5d9a5bd9 A-Konig
                {
83 734533a8 A-Konig
                    // data for each faculty separate
84 5d9a5bd9 A-Konig
                    for (int k = 0; k < TagInfo.faculties.Length; k++)
85
                    {
86 734533a8 A-Konig
                        ActivityInfo dayInfo = new ActivityInfo(TagInfo.faculties[k], recordedAmount[k], lastStartTime, range);
87 5d9a5bd9 A-Konig
                        jisInfo.Add(dayInfo);
88
                    }
89
90
                    recordedAmount = new int[TagInfo.faculties.Length];
91 0da0ac88 A-Konig
                    lastStartTime = date;
92 5d9a5bd9 A-Konig
                }
93
94 734533a8 A-Konig
                // aggregate data
95 0da0ac88 A-Konig
                if (TagInfo.jisPlaces.ContainsKey(place))
96
                {
97
                    int index = TagInfo.jisPlaces[place];
98
                    if (index == -1)
99
                        for (int l = 0; l < TagInfo.faculties.Length; l++)
100
                            recordedAmount[l] += list[i].amount;
101
                    else
102
                        recordedAmount[index] += list[i].amount;
103
104
                }
105 5d9a5bd9 A-Konig
                else
106
                {
107 734533a8 A-Konig
                    // TODO uknown code handling
108 5d9a5bd9 A-Konig
                    Console.WriteLine("Unknown code " + list[i].placeTag);
109
                }
110
111
            }
112
113 734533a8 A-Konig
            // last day
114 0da0ac88 A-Konig
            for (int k = 0; k < TagInfo.faculties.Length; k++)
115
            {
116 734533a8 A-Konig
                ActivityInfo dayInfo = new ActivityInfo(TagInfo.faculties[k], recordedAmount[k], lastStartTime, range);
117 0da0ac88 A-Konig
                jisInfo.Add(dayInfo);
118
            }
119
120
            return jisInfo;
121
        }
122
123 734533a8 A-Konig
        private static List<ActivityInfo> ProcessOneJisFileAsIntervals(string path, int interval)
124 0da0ac88 A-Konig
        {
125 260b1217 A-Konig
            if (!File.Exists(path))
126
                return null;
127
128
            List<ActivityInfo> jisInfo = new List<ActivityInfo>();
129
            List<JisInstance> list = CsvDataLoader.LoadJisFile(path);
130
131
            // data for each faculty
132
            int[] recordedAmount = new int[TagInfo.faculties.Length];
133
            // min/max hour taken into account
134
            int[] minmaxHour = new int[] { 7, 18 };
135
            int range = minmaxHour[1] - minmaxHour[0];
136
137
            if (interval > range)
138
                return null;
139
140
            int indices = (int) Math.Ceiling(range / (double)interval);
141 ecdce631 A-Konig
            int[] to = new int[indices];
142
            for (int i = 0; i < to.Length; i++) 
143
                to[i] = minmaxHour[0] + interval * (i+1);
144 260b1217 A-Konig
145
            // first day
146
            DateTime lastStartTime = new DateTime(list[0].dateTime.Year, list[0].dateTime.Month, list[0].dateTime.Day, minmaxHour[0], 0, 0);
147 ecdce631 A-Konig
            int endtime = to[0];
148 1db865ce A-Konig
            int startTime = minmaxHour[0];
149
            int index = 0;
150 260b1217 A-Konig
            for (int i = 0; i < list.Count; i++)
151
            {
152
                int currHour = list[i].dateTime.Hour;
153
                if (currHour < minmaxHour[0] || currHour > minmaxHour[1])
154
                    continue;
155
156
                // start of the day -> make an instance
157
                string place = list[i].placeTag;
158
                bool trigger = false;
159
                DateTime date = new DateTime(list[i].dateTime.Year, list[i].dateTime.Month, list[i].dateTime.Day, list[i].dateTime.Hour, 0, 0);
160 1db865ce A-Konig
161 260b1217 A-Konig
                // end of the day
162
                if (!(date.Year == lastStartTime.Year && date.Month == lastStartTime.Month && date.Day == lastStartTime.Day))
163 1db865ce A-Konig
                {
164 260b1217 A-Konig
                    trigger = true;
165 1db865ce A-Konig
                    index = 0;
166
                }
167 260b1217 A-Konig
168
                // end of interval period
169 ecdce631 A-Konig
                if ( date.Hour >= endtime || trigger) 
170 260b1217 A-Konig
                {
171 1db865ce A-Konig
                    // start time of last interval
172
                    DateTime stTime = new DateTime(lastStartTime.Year, lastStartTime.Month, lastStartTime.Day, startTime, 0, 0);
173 ecdce631 A-Konig
174
                    // find end and start time
175 1db865ce A-Konig
                    if (!trigger)
176 ecdce631 A-Konig
                        index++;
177
                    while (date.Hour >= to[index])
178
                        index++;
179 1db865ce A-Konig
180 ecdce631 A-Konig
                    endtime = to[index];
181
                    if (index == 0)
182
                        startTime = minmaxHour[0];
183
                    else
184
                        startTime = to[index - 1];
185 1db865ce A-Konig
186 260b1217 A-Konig
                    // data for each faculty separate
187
                    for (int k = 0; k < TagInfo.faculties.Length; k++)
188
                    {
189 1db865ce A-Konig
                        ActivityInfo dayInfo = new ActivityInfo(TagInfo.faculties[k], recordedAmount[k], stTime, interval);
190 260b1217 A-Konig
                        jisInfo.Add(dayInfo);
191
                    }
192
193
                    recordedAmount = new int[TagInfo.faculties.Length];
194
                    lastStartTime = date;
195
                }
196
197
                // aggregate data
198
                if (TagInfo.jisPlaces.ContainsKey(place))
199
                {
200 1db865ce A-Konig
                    int faculty = TagInfo.jisPlaces[place];
201
                    if (faculty == -1)
202 260b1217 A-Konig
                        for (int l = 0; l < TagInfo.faculties.Length; l++)
203
                            recordedAmount[l] += list[i].amount;
204
                    else
205 1db865ce A-Konig
                        recordedAmount[faculty] += list[i].amount;
206 260b1217 A-Konig
207
                }
208
                else
209
                {
210
                    // TODO uknown code handling
211
                    Console.WriteLine("Unknown code " + list[i].placeTag);
212
                }
213
214
            }
215
216
            // last day
217
            for (int k = 0; k < TagInfo.faculties.Length; k++)
218
            {
219
                ActivityInfo dayInfo = new ActivityInfo(TagInfo.faculties[k], recordedAmount[k], lastStartTime, interval);
220
                jisInfo.Add(dayInfo);
221
            }
222
223
            return jisInfo;
224 5d9a5bd9 A-Konig
        }
225
    }
226
}