/// <summary>PWeatherDataをファイルに書き出す</summary> /// <param name="wdTable">WeatherDataTableオブジェクト</param> /// <param name="filePath">書き出しファイルへのパス</param> /// <param name="success">書き出し成功の真偽</param> public static void FromPWeather(WeatherDataTable wdTable, string filePath, out bool success) { //書き出しストリームを用意 StreamWriter sWriter = new StreamWriter(filePath); //1時間間隔のデータに変更 WeatherDataTable houlyWDTable = wdTable.ConvertToHoulyDataTable(); //第一行を記入 LocationInformation lInfo = wdTable.Location; string ss = lInfo.EnglishName + " " + lInfo.Latitude.ToString("F2") + " " + lInfo.Longitude.ToString("F2") + " " + lInfo.LongitudeAtStandardTime.ToString("F2") + " 0 0 0 "; while (ss.Length < 80) ss += "-"; sWriter.WriteLine(ss); int cHour = 0; ImmutableWeatherRecord[] wrs = new ImmutableWeatherRecord[24]; for (int i = 0; i < houlyWDTable.WeatherRecordNumber; i++) { wrs[cHour] = houlyWDTable.GetWeatherRecord(i); //24時間分データがたまった場合は書き出し if (cHour == 23) { if (!output24Data(sWriter, wrs)) { //変換失敗の場合 sWriter.Close(); File.Delete(filePath); success = false; return; } cHour = 0; } else cHour++; } sWriter.Close(); success = true; }
/// <summary>24時間分のデータを書き出す</summary> /// <param name="sWriter">書き出しストリーム</param> /// <param name="wRecord">24時間分のデータ</param> private static bool output24Data(StreamWriter sWriter, ImmutableWeatherRecord[] wRecord) { if (wRecord.Length != 24) throw new Exception(); //年月日文字列 DateTime dt = wRecord[0].DataDTime; string dTime = dt.Year.ToString().Substring(2); dTime += String.Format("{0, 2}", dt.Month.ToString()); dTime += String.Format("{0, 2}", dt.Day.ToString()); dTime += convertToDayOfWeekCode(dt.DayOfWeek); //気温[CDB]書き出し for (int i = 0; i < 24; i++) { WeatherData wd = wRecord[i].GetData(WeatherRecord.RecordType.DryBulbTemperature); if (wd.Source == WeatherData.DataSource.MissingValue) return false; else sWriter.Write(convertTo3WordString(wd.Value * 10 + 500)); } sWriter.WriteLine(dTime + "1"); //絶対湿度[kg/kg(DA)]書き出し for (int i = 0; i < 24; i++) { WeatherData wd = wRecord[i].GetData(WeatherRecord.RecordType.HumidityRatio); if (wd.Source == WeatherData.DataSource.MissingValue) return false; else sWriter.Write(convertTo3WordString(wd.Value * 10000)); } sWriter.WriteLine(dTime + "2"); //法線面直達日射量[kcal/m2h]書き出し for (int i = 0; i < 24; i++) { WeatherData wd = wRecord[i].GetData(WeatherRecord.RecordType.DirectNormalRadiation); if (wd.Source == WeatherData.DataSource.MissingValue) return false; else sWriter.Write(convertTo3WordString(wd.Value * 0.859999)); } sWriter.WriteLine(dTime + "3"); //水平面天空日射量[kcal/m2h]書き出し for (int i = 0; i < 24; i++) { WeatherData wd = wRecord[i].GetData(WeatherRecord.RecordType.DiffuseHorizontalRadiation); if (wd.Source == WeatherData.DataSource.MissingValue) return false; else sWriter.Write(convertTo3WordString(wd.Value * 0.859999)); } sWriter.WriteLine(dTime + "4"); //雲量(10分比)書き出し for (int i = 0; i < 24; i++) { WeatherData wd = wRecord[i].GetData(WeatherRecord.RecordType.TotalSkyCover); if (wd.Source == WeatherData.DataSource.MissingValue) sWriter.Write(" 0"); else sWriter.Write(convertTo3WordString(wd.Value * 10)); } sWriter.WriteLine(dTime + "5"); //風向(16方位)書き出し for (int i = 0; i < 24; i++) { WeatherData wd = wRecord[i].GetData(WeatherRecord.RecordType.WindDirection); if (wd.Source == WeatherData.DataSource.MissingValue) sWriter.Write(" 0"); else sWriter.Write(convertToWindDirectionCode(wd.Value)); } sWriter.WriteLine(dTime + "6"); //風速[m/s]書き出し for (int i = 0; i < 24; i++) { WeatherData wd = wRecord[i].GetData(WeatherRecord.RecordType.WindSpeed); if (wd.Source == WeatherData.DataSource.MissingValue) sWriter.Write(" 0"); else sWriter.Write(convertTo3WordString(wd.Value * 10)); } sWriter.WriteLine(dTime + "7"); return true; }