• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Commit MetaInfo

Revisióne252d359b55626b89ff0329ad6734415b6bf6cd8 (tree)
Tiempo2020-02-21 19:35:48
AutorKazuhiro Fujieda <fujieda@user...>
CommiterKazuhiro Fujieda

Log Message

LogProcessorのリファクタリング

Cambiar Resumen

Diferencia incremental

--- a/KancolleSniffer.Test/LogProcessorTest.cs
+++ b/KancolleSniffer.Test/LogProcessorTest.cs
@@ -173,5 +173,26 @@ namespace KancolleSniffer.Test
173173 var excel = "2018/9/10 20:13";
174174 PAssert.That(() => "[\"2018-09-10 20:13:00\"" + expected == dateProcessor(excel), "Excelの形式から変換する");
175175 }
176+
177+ /// <summary>
178+ /// 壊れたログを取り除く
179+ /// </summary>
180+ [TestMethod]
181+ public void TruncatedLog()
182+ {
183+ var processor = new LogProcessor();
184+ var logs = new[]
185+ {
186+ "2014-12-15 23:10:34,29734,29855,28016,41440,1407,1529,2151,13",
187+ "2014-12-15 23:13:29,29709,29819,28019,41440,1407,1529,21",
188+ "2014-12-15 23:16:06,29710,29819,28018,41440,1407,1529,2151,13"
189+ };
190+ var result = processor.Process(logs, "資材ログ", DateTime.MinValue, DateTime.MaxValue, true);
191+ PAssert.That(() => result.SequenceEqual(new[]
192+ {
193+ "[1418652634000,29734,29855,28016,41440,1407,1529,2151,13]",
194+ ",\n[1418652966000,29710,29819,28018,41440,1407,1529,2151,13]"
195+ }));
196+ }
176197 }
177198 }
\ No newline at end of file
--- a/KancolleSniffer/Log/BattleLogProcessor.cs
+++ b/KancolleSniffer/Log/BattleLogProcessor.cs
@@ -20,7 +20,7 @@ using KancolleSniffer.Model;
2020
2121 namespace KancolleSniffer.Log
2222 {
23- public class BattleLogProcessor
23+ public class BattleLogProcessor : LogProcessor.Processor
2424 {
2525 private readonly Dictionary<string, string> _mapDictionary;
2626
@@ -29,7 +29,7 @@ namespace KancolleSniffer.Log
2929 _mapDictionary = mapDictionary ?? new Dictionary<string, string>();
3030 }
3131
32- public string[] Process(string[] data)
32+ public override string[] Process(string[] data)
3333 {
3434 string map;
3535 switch (data.Length)
@@ -49,8 +49,10 @@ namespace KancolleSniffer.Log
4949 Array.Copy(data, 24, data, 23, 15);
5050 goto case 38;
5151 default:
52- return data;
52+ Skip = true;
53+ return null;
5354 }
55+ Skip = false;
5456 if (data[5] == "T字戦(有利)")
5557 data[5] = "T字有利";
5658 if (data[5] == "T字戦(不利)")
--- a/KancolleSniffer/Log/LogProcessor.cs
+++ b/KancolleSniffer/Log/LogProcessor.cs
@@ -32,40 +32,55 @@ namespace KancolleSniffer.Log
3232 _battleLogProcessor = new BattleLogProcessor(mapDictionary);
3333 }
3434
35- public IEnumerable<string> Process(IEnumerable<string> lines, string path, DateTime from, DateTime to,
36- bool number, DateTime now = default)
35+ public class Processor
3736 {
38- var fields = 0;
39- var mission = false;
40- var battle = false;
41- var material = false;
42- switch (Path.GetFileNameWithoutExtension(path))
37+ protected virtual int Fields { get; }
38+ public bool Skip { get; protected set; }
39+
40+ public Processor()
4341 {
44- case "遠征報告書":
45- mission = true;
46- fields = 11;
47- break;
48- case "改修報告書":
49- fields = 15;
50- break;
51- case "海戦・ドロップ報告書":
52- fields = 40;
53- battle = true;
54- break;
55- case "開発報告書":
56- fields = 9;
57- break;
58- case "建造報告書":
59- fields = 12;
60- break;
61- case "資材ログ":
62- fields = 9;
63- material = true;
64- break;
65- case "戦果":
66- fields = 3;
67- break;
6842 }
43+
44+ public Processor(int fields)
45+ {
46+ Fields = fields;
47+ }
48+
49+ public virtual string[] Process(string[] data)
50+ {
51+ Skip = data.Length != Fields;
52+ return Skip ? null : data;
53+ }
54+ }
55+
56+ private class MissionProcessor : Processor
57+ {
58+ protected override int Fields { get; } = 11;
59+
60+ public override string[] Process(string[] data)
61+ {
62+ return data.Concat(new[] {"0"}).Take(Fields).ToArray();
63+ }
64+ }
65+
66+ private class MaterialProcessor : Processor
67+ {
68+ protected override int Fields { get; } = 9;
69+
70+ public override string[] Process(string[] data)
71+ {
72+ if (data.Length >= Fields)
73+ Array.Resize(ref data, Fields);
74+ return base.Process(data);
75+ }
76+ }
77+
78+ public IEnumerable<string> Process(IEnumerable<string> lines, string path, DateTime from, DateTime to,
79+ bool number, DateTime now = default)
80+ {
81+ var logName = Path.GetFileNameWithoutExtension(path);
82+ var currentMaterial = logName == "資材ログ" && !number;
83+ var processor = DecideProcessor(logName);
6984 var delimiter = "";
7085 foreach (var line in lines)
7186 {
@@ -78,14 +93,8 @@ namespace KancolleSniffer.Log
7893 if (date < from)
7994 continue;
8095 data[0] = Logger.FormatDateTime(date);
81- var entries = data;
82- if (mission)
83- entries = data.Concat(new[] {"0"}).Take(fields).ToArray();
84- if (material)
85- entries = data.Take(fields).ToArray();
86- if (battle)
87- entries = _battleLogProcessor.Process(data);
88- if (entries.Length != fields)
96+ var entries = processor.Process(data);
97+ if (processor.Skip)
8998 continue;
9099 var result =
91100 number
@@ -94,11 +103,34 @@ namespace KancolleSniffer.Log
94103 delimiter = ",\n";
95104 yield return result;
96105 }
97- if (material && !number) // 資材の現在値を出力する
106+ if (currentMaterial) // 資材の現在値を出力する
98107 yield return delimiter + "[\"" + Logger.FormatDateTime(now) + "\",\"" +
99108 string.Join("\",\"", _materialCount.Select(c => c.Now)) + "\"]";
100109 }
101110
111+ private Processor DecideProcessor(string logName)
112+ {
113+ switch (logName)
114+ {
115+ case "遠征報告書":
116+ return new MissionProcessor();
117+ case "改修報告書":
118+ return new Processor(15);
119+ case "海戦・ドロップ報告書":
120+ return _battleLogProcessor;
121+ case "開発報告書":
122+ return new Processor(9);
123+ case "建造報告書":
124+ return new Processor(12);
125+ case "資材ログ":
126+ return new MaterialProcessor();
127+ case "戦果":
128+ return new Processor(3);
129+ default:
130+ return new Processor();
131+ }
132+ }
133+
102134 private DateTime ParseDateTime(string dateTime)
103135 {
104136 if (DateTime.TryParseExact(dateTime, Logger.DateTimeFormat, CultureInfo.InvariantCulture,