/** * 1行分のフィールドからエリアデータを取得する * @input fields: * @output 取得したエリアデータ */ private MemLogArea GetMemAreaText(Dictionary <string, string> fields, MemLogAreaManager manager) { MemLogArea area = new MemLogArea(); // area,name:"area1",parent:"root",color=FF000000, image="icon1" foreach (KeyValuePair <string, string> kvp in fields) { if (kvp.Value != null) { switch (kvp.Key.ToLower()) { case "name": area.Name = kvp.Value; break; case "parent": area.ParentArea = manager.searchArea(kvp.Value); break; case "color": area.Color = Convert.ToUInt32(kvp.Value, 16); break; case "image": area.Image = images.GetImage(kvp.Value); break; } } } return(area); }
/** * ログの本体部分を取得 * <body>~</body> の中の行をすべて取得する * */ private MemLogAreaManager GetLogDataText(StreamReader sr) { MemLogAreaManager manager = new MemLogAreaManager(); while (!sr.EndOfStream) { string line = sr.ReadLine().Trim(); Dictionary <string, string> fields = SplitLineStr(line); if (fields.Count == 0) { continue; } // 終了判定 if (line.Equals("</body>")) { return(manager); } else if (fields.ContainsKey("area")) { MemLogArea area = GetMemAreaText(fields, manager); manager.AddArea(area); } else if (fields.ContainsKey("log")) { MemLogData log = GetMemLogText(fields); manager.AddLogData(log); } } return(null); }
/** * テキスト形式のログファイルを読み込んでメモリに展開する * @input inputFilePath: ログファイルのパス * @output : true:成功 / false:失敗 */ private bool ReadLogFileText(string inputFilePath) { bool isHeader = false; // まずはヘッダ部分からエンコードタイプを取得する encoding = GetEncodingText(inputFilePath); using (StreamReader sr = new StreamReader(inputFilePath, encoding)) { // データ種別部分をスキップ sr.ReadLine(); // ヘッダ部分を読み込む <head>~</head> while (!sr.EndOfStream) { // ファイルを 1 行ずつ読み込む string line = sr.ReadLine().Trim(); // <head>の行が見つかるまではスキップ if (isHeader == false) { if (line.Equals("<head>")) { isHeader = true; } } else { if (line.Equals("</head>")) { break; } Dictionary <string, string> fields = SplitLineStr(line, ',', ':'); // ヘッダーの読み込みメイン switch (line) { case "<lane>": lanes = GetLanesText(sr); break; case "<logid>": logIDs = GetLogIDsText(sr); break; case "<image>": images = GetIconImagesText(sr); break; } } } // 本体部分を読み込む bool isBody = false; while (!sr.EndOfStream) { // ファイルを 1 行ずつ読み込む string line = sr.ReadLine().Trim(); // <body>を見つけたら本体の取得モードに入る if (!isBody) { if (line.Equals("<body>")) { isBody = true; } } else { areaManager = GetLogDataText(sr); } } } return(true); }