예제 #1
0
        /// <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;
        }
예제 #2
0
        /// <summary>地点情報読み込み処理</summary>
        /// <param name="pwData">PWeatherDataオブジェクト</param>
        /// <param name="bStrm">読み取りStream</param>
        private static void getHourlyData(ref WeatherDataTable pwData, BufferedStream bStrm)
        {
            LocationInformation locationInfo = pwData.Location;
            byte[] buffer;
            //年月日情報
            buffer = new byte[8];
            //最終行の場合は終了
            bStrm.Read(buffer, 0, 8);
            string dTime = System.Text.Encoding.GetEncoding(932).GetString(buffer);
            int year = int.Parse(dTime.Substring(0, 4));
            int month = int.Parse(dTime.Substring(4, 2));
            int day = int.Parse(dTime.Substring(6, 2));
            DateTime cTime = new DateTime(year, month, day, 1, 0, 0);

            //1時間データまでシーク
            bStrm.Seek(2, SeekOrigin.Current);

            //24時間データを取得
            buffer = new byte[56];
            WeatherData wd = new WeatherData();
            wd.Source = WeatherData.DataSource.CalculatedValue;
            bool sunRise = false;
            bool hasDR = false;
            for (int i = 0; i < 24; i++)
            {
                WeatherRecord wr = new WeatherRecord();
                wr.DataDTime = cTime;

                //データ取得
                bStrm.Read(buffer, 0, 56);
                string data = System.Text.Encoding.GetEncoding(932).GetString(buffer);

                //気圧[Pa]
                double atm = wd.Value = double.Parse(data.Substring(0, 5)) * 0.01d;
                WeatherData.DataSource atmSource = getDataSource(data.Substring(5, 1));
                wd.Source = atmSource;
                wr.SetData(WeatherRecord.RecordType.AtmosphericPressure, wd);

                //乾球温度[C]
                double dbt = wd.Value = double.Parse(data.Substring(12, 4)) * 0.1;
                WeatherData.DataSource dbtSource = getDataSource(data.Substring(16, 1));
                wd.Source = dbtSource;
                wr.SetData(WeatherRecord.RecordType.DryBulbTemperature, wd);

                //相対湿度[%]
                double rhd = wd.Value = double.Parse(data.Substring(21, 3));
                WeatherData.DataSource rhdSource = getDataSource(data.Substring(24, 1));
                wd.Source = rhdSource;
                wr.SetData(WeatherRecord.RecordType.RelativeHumidity, wd);

                //風向[degree]
                wd.Value = getWindowDirection(int.Parse(data.Substring(25, 2)));
                wd.Source = getDataSource(data.Substring(27, 1));
                wr.SetData(WeatherRecord.RecordType.WindDirection, wd);

                //風速[m/s]
                wd.Value = double.Parse(data.Substring(28, 3)) * 0.1;
                wd.Source = getDataSource(data.Substring(31, 1));
                wr.SetData(WeatherRecord.RecordType.WindSpeed, wd);

                //雲量10分比[-]
                wd.Value = double.Parse(data.Substring(32, 2)) * 0.1;
                wd.Source = getDataSource(data.Substring(34, 1));
                wr.SetData(WeatherRecord.RecordType.TotalSkyCover, wd);

                //天気記号
                wd.Value = double.Parse(data.Substring(35, 2));
                wd.Source = getDataSource(data.Substring(37, 1));
                wr.SetData(WeatherRecord.RecordType.WeatherCode, wd);

                //露点温度[C]
                wd.Value = double.Parse(data.Substring(38, 4)) * 0.1;
                wd.Source = getDataSource(data.Substring(42, 1));
                wr.SetData(WeatherRecord.RecordType.DewPointTemperature, wd);

                //全天日射量[W/m2]
                double ghRad = double.Parse(data.Substring(47, 3)) * 277.7777778 * 0.01;
                wd.Value = ghRad;
                WeatherData.DataSource ghRadSource = getDataSource(data.Substring(50, 1));
                wd.Source = ghRadSource;
                wr.SetData(WeatherRecord.RecordType.GlobalHorizontalRadiation, wd);

                //降水量[mm]
                wd.Value = double.Parse(data.Substring(51, 4)) * 0.1;
                wd.Source = getDataSource(data.Substring(55, 1));
                wr.SetData(WeatherRecord.RecordType.PrecipitationLevel, wd);

                //推定可能なデータを計算して埋める********************************************************
                //絶対湿度[kg/kg(DA)]
                if (dbtSource != WeatherData.DataSource.MissingValue && rhdSource != WeatherData.DataSource.MissingValue)
                {
                    wd.Value = MoistAir.GetAirStateFromDBRH(dbt, rhd, MoistAir.Property.HumidityRatio, atm);
                    wd.Source = WeatherData.DataSource.CalculatedValue;
                    wr.SetData(WeatherRecord.RecordType.HumidityRatio, wd);
                }

                //直散分離
                //太陽の存在確認
                bool sr = (0 < Sun.GetSunAltitude(locationInfo.Latitude, locationInfo.Longitude, 135d, cTime));

                //直散分離
                double dsRad, dhRad;
                //日出・日没調整
                if (!sunRise && sr) Sun.EstimateDiffuseAndDirectNormalRadiation(ghRad, locationInfo.Latitude, locationInfo.Longitude, 135d, cTime, out dsRad, out dhRad);
                else if (sunRise && !sr) Sun.EstimateDiffuseAndDirectNormalRadiation(ghRad, locationInfo.Latitude, locationInfo.Longitude, 135d, cTime.AddHours(-1), out dsRad, out dhRad);
                else Sun.EstimateDiffuseAndDirectNormalRadiation(ghRad, locationInfo.Latitude, locationInfo.Longitude, 135d, cTime.AddHours(-0.5), out dsRad, out dhRad);
                sunRise = sr;

                //24h「観測しない」が続いた場合は欠測扱い
                hasDR = (ghRadSource != WeatherData.DataSource.MissingValue || hasDR);
                if (i != 23 || hasDR)
                {
                    //直達日射量[W/m2]
                    wd.Value = dsRad;
                    wd.Source = WeatherData.DataSource.PredictedValue;
                    wr.SetData(WeatherRecord.RecordType.DirectNormalRadiation, wd);
                    //天空日射量[W/m2]
                    wd.Value = dhRad;
                    wd.Source = WeatherData.DataSource.PredictedValue;
                    wr.SetData(WeatherRecord.RecordType.DiffuseHorizontalRadiation, wd);
                }

                //空白データを欠測データとして埋める******************************************************
                wr.FillMissingData();

                //1時間進める
                cTime = cTime.AddHours(1);

                //気象レコード追加
                pwData.AddWeatherRecord(wr);
            }
        }
예제 #3
0
        /// <summary>ファイルを元にWeatherDataTableを構成する</summary>
        /// <param name="filePath">読み取りファイルのパス</param>
        /// <param name="success">読み取り成功の真偽</param>
        /// <returns>構成されたPWeatherDataオブジェクト</returns>
        public static WeatherDataTable ToPWeatherData(string filePath, out bool success)
        {
            success = false;

            //読み出しファイルの存在確認
            if (!File.Exists(filePath)) return null;

            WeatherDataTable wdTable = new WeatherDataTable();
            Stream strm = File.OpenRead(filePath);
            BufferedStream bStrm = new BufferedStream(strm);

            //地点番号-名称特定
            LocationInformation lInfo;
            byte[] buffer = new byte[3];
            bStrm.Read(buffer, 0, 3);
            string ln = Encoding.GetEncoding(932).GetString(buffer);
            int lNumber;
            if (int.TryParse(ln, out lNumber))
            {
                if (!GetLocationInformation(lNumber, out lInfo))
                {
                    return null;
                }
            }
            else return null;

            //地点情報を設定
            wdTable.Location = lInfo;

            //年月日データまでシーク
            bStrm.Seek(14, SeekOrigin.Begin);

            //1時間データ読み込み処理
            buffer = new byte[14];
            while (true)
            {
                getHourlyData(ref wdTable, bStrm);
                //次の日にちまでシーク
                bStrm.Seek(184, SeekOrigin.Current);
                //年月日データまでシーク
                if (bStrm.Read(buffer, 0, 14) == 0) break;
            }

            success = true;
            return wdTable;
        }
예제 #4
0
 /// <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)
 {
     success = false;
 }
예제 #5
0
        /// <summary>supwデータのための文字列を作成する</summary>
        /// <param name="wdTable">気象データテーブル</param>
        /// <returns>supwデータのための文字列</returns>
        public static string MakeSupwData(WeatherDataTable wdTable)
        {
            StringBuilder sBuilder = new StringBuilder();
            //1時間間隔のデータに変更
            WeatherDataTable houlyWDTable = wdTable.ConvertToHoulyDataTable();

            //名称設定
            sBuilder.AppendLine(houlyWDTable.Location.EnglishName);

            double maxT, minT, dayAveT, monthAveT, yearAveT, maxDayAveT;
            int maxDayAveDay = 0;
            ImmutableWeatherRecord wr = houlyWDTable.GetWeatherRecord(0);
            DateTime cTime = wr.DataDTime;
            maxT = minT = dayAveT = wr.GetData(WeatherRecord.RecordType.DryBulbTemperature).Value;
            monthAveT = yearAveT = 0;

            int day = 0;
            maxDayAveT = -999;
            for (int i = 1; i < houlyWDTable.WeatherRecordNumber; i++)
            {
                wr = houlyWDTable.GetWeatherRecord(i);
                double temp = wr.GetData(WeatherRecord.RecordType.DryBulbTemperature).Value;
                maxT = Math.Max(temp, maxT);
                minT = Math.Min(temp, minT);

                //日付が変わった場合
                if (cTime.Day != wr.DataDTime.Day)
                {
                    monthAveT += dayAveT;
                    dayAveT = dayAveT / 24d;
                    if (maxDayAveT < dayAveT)
                    {
                        maxDayAveT = dayAveT;
                        maxDayAveDay = cTime.DayOfYear;
                    }
                    dayAveT = 0;
                }

                //月が変わった場合
                if (cTime.Month != wr.DataDTime.Month)
                {
                    yearAveT += monthAveT;
                    sBuilder.Append(" " + (monthAveT / day).ToString("F1"));
                    monthAveT = 0;
                    day = 0;
                }

                dayAveT += temp;
                cTime = wr.DataDTime;
                day++;
            }
            sBuilder.AppendLine();
            sBuilder.Append(" " + maxDayAveDay);
            sBuilder.Append(" " + (yearAveT / houlyWDTable.WeatherRecordNumber).ToString("F1"));
            sBuilder.Append(" " + (maxT - minT).ToString("F1"));

            return sBuilder.ToString();
        }
예제 #6
0
        /// <summary>ファイルを元にWeatherDataTableを構成する</summary>
        /// <param name="filePath">読み取りファイルのパス</param>
        /// <param name="success">読み取り成功の真偽</param>
        /// <returns>構成されたPWeatherDataオブジェクト</returns>
        public static WeatherDataTable ToPWeatherData(string filePath, out bool success)
        {
            success = false;

            //読み出しファイルの存在確認
            if (File.Exists(filePath))
            {
                WeatherDataTable wdTable = new WeatherDataTable();
                using (StreamReader sReader = new StreamReader(filePath))
                {
                    string buff;
                    DateTime dTime;

                    //第1行
                    sReader.ReadLine();

                    for (int i = 0; i < 365; i++)
                    {
                        WeatherRecord[] wRecords = new WeatherRecord[24];

                        //年月日特定
                        buff = sReader.ReadLine();
                        int year = int.Parse(buff.Substring(72, 2));
                        int month = int.Parse(buff.Substring(74, 2));
                        int day = int.Parse(buff.Substring(76, 2));
                        if (year < 50) year += 2000;
                        else year += 1900;
                        dTime = new DateTime(year, month, day, 0, 0, 0);
                        for (int j = 0; j < 24; j++)
                        {
                            wRecords[j] = new WeatherRecord();
                            wRecords[j].DataDTime = dTime;
                            dTime = dTime.AddHours(1);
                        }

                        //乾球温度
                        for (int j = 0; j < 24; j++)
                        {
                            string bf = buff.Substring(j * 3, 3);
                            WeatherData wData = new WeatherData();
                            wData.Source = WeatherData.DataSource.CalculatedValue;
                            wData.Value = (double.Parse(bf) - 500d) / 10d;
                            wRecords[j].SetData(WeatherRecord.RecordType.DryBulbTemperature, wData);
                        }

                        //絶対湿度
                        buff = sReader.ReadLine();
                        for (int j = 0; j < 24; j++)
                        {
                            string bf = buff.Substring(j * 3, 3);
                            WeatherData wData = new WeatherData();
                            wData.Source = WeatherData.DataSource.CalculatedValue;
                            wData.Value = double.Parse(bf) / 10000d;
                            wRecords[j].SetData(WeatherRecord.RecordType.HumidityRatio, wData);
                        }

                        //法線面直達日射[kcal/m2-h]
                        buff = sReader.ReadLine();
                        for (int j = 0; j < 24; j++)
                        {
                            string bf = buff.Substring(j * 3, 3);
                            WeatherData wData = new WeatherData();
                            wData.Source = WeatherData.DataSource.CalculatedValue;
                            wData.Value = double.Parse(bf) * 1.163; // [W/m2]に変換
                            wRecords[j].SetData(WeatherRecord.RecordType.DirectNormalRadiation, wData);
                        }

                        //水平面天空日射[kcal/m2-h]
                        buff = sReader.ReadLine();
                        for (int j = 0; j < 24; j++)
                        {
                            string bf = buff.Substring(j * 3, 3);
                            WeatherData wData = new WeatherData();
                            wData.Source = WeatherData.DataSource.CalculatedValue;
                            wData.Value = double.Parse(bf) * 1.163; // [W/m2]に変換
                            wRecords[j].SetData(WeatherRecord.RecordType.DiffuseHorizontalRadiation, wData);
                        }

                        //雲量[-] (10分比)
                        buff = sReader.ReadLine();
                        for (int j = 0; j < 24; j++)
                        {
                            string bf = buff.Substring(j * 3, 3);
                            WeatherData wData = new WeatherData();
                            wData.Source = WeatherData.DataSource.CalculatedValue;
                            wData.Value = int.Parse(bf);
                            wRecords[j].SetData(WeatherRecord.RecordType.TotalSkyCover, wData);
                        }

                        //風向[-] (16分比)
                        buff = sReader.ReadLine();
                        for (int j = 0; j < 24; j++)
                        {
                            string bf = buff.Substring(j * 3, 3);
                            WeatherData wData = new WeatherData();
                            wData.Source = WeatherData.DataSource.CalculatedValue;
                            wData.Value = convertFromWindDirectionCode(int.Parse(bf));
                            wRecords[j].SetData(WeatherRecord.RecordType.WindDirection, wData);
                        }

                        //風速[m/s]
                        buff = sReader.ReadLine();
                        for (int j = 0; j < 24; j++)
                        {
                            string bf = buff.Substring(j * 3, 3);
                            WeatherData wData = new WeatherData();
                            wData.Source = WeatherData.DataSource.CalculatedValue;
                            wData.Value = double.Parse(bf) / 10d;
                            wRecords[j].SetData(WeatherRecord.RecordType.WindSpeed, wData);
                        }

                        wdTable.AddWeatherRecord(wRecords);
                    }
                }

                success = true;
                return wdTable;
            }
            else return null;
        }
예제 #7
0
        /// <summary>ファイルを元にWeatherDataTableを構成する</summary>
        /// <param name="filePath">読み取りファイルのパス</param>
        /// <param name="success">読み取り成功の真偽</param>
        /// <returns>構成されたPWeatherDataオブジェクト</returns>
        public static WeatherDataTable ToPWeatherData(string filePath, out bool success)
        {
            success = false;

            //読み出しファイルの存在確認
            if (!File.Exists(filePath)) return null;

            WeatherDataTable wdTable = new WeatherDataTable();

            using(StreamReader sReader = new StreamReader(filePath))
            {
                string str;
                bool firstLine = true;
                while ((str = sReader.ReadLine()) != null)
                {
                    //初回は地点情報を設定
                    if (firstLine)
                    {
                        LocationInformation lInfo = new LocationInformation();
                        lInfo.ID = int.Parse(str.Substring(0, 5));
                        lInfo.Name = lInfo.EnglishName = "TMY1" + lInfo.ID.ToString("F0");
                        wdTable.Location = lInfo;

                        firstLine = false;
                    }

                    WeatherRecord wRecord = new WeatherRecord();
                    WeatherData wData;

                    //日時
                    int year = int.Parse(str.Substring(5,2));
                    if (year < 20) year += 2000;
                    else year += 1900;
                    int month = int.Parse(str.Substring(7, 2));
                    int day = int.Parse(str.Substring(9, 2));
                    int hour = int.Parse(str.Substring(11, 2)) - 1;
                    int minute = int.Parse(str.Substring(13, 2));

                    wRecord.DataDTime = new DateTime(year, month, day, hour, minute, 0);

                    //直達日射[W/m2]
                    if (str.Substring(24, 4) == "9999") wData = new WeatherData(0d, getDSource1(str.Substring(23, 1)), -1);
                    else wData = new WeatherData(double.Parse(str.Substring(24, 4)) / 3.6d, getDSource1(str.Substring(23, 1)), -1);
                    wRecord.SetData(WeatherRecord.RecordType.DirectNormalRadiation, wData);

                    //水平面天空日射[W/m2]
                    if (str.Substring(29, 4) == "9999") wData = new WeatherData(0d, getDSource1(str.Substring(28, 1)), -1);
                    else wData = new WeatherData(double.Parse(str.Substring(29, 4)) / 3.6d, getDSource1(str.Substring(28, 1)), -1);
                    wRecord.SetData(WeatherRecord.RecordType.DiffuseHorizontalRadiation, wData);

                    //水平面全天日射[W/m2]
                    if (str.Substring(54, 4) == "9999") wData = new WeatherData(0d, getDSource1(str.Substring(54, 1)), -1);
                    else wData = new WeatherData(double.Parse(str.Substring(54, 4)) / 3.6d, getDSource1(str.Substring(53, 1)), -1);
                    wRecord.SetData(WeatherRecord.RecordType.GlobalHorizontalRadiation, wData);

                    //雲高さ[m]
                    if (str.Substring(72, 4) == "7777") wData = new WeatherData(0d, WeatherData.DataSource.MissingValue, -1);
                    if (str.Substring(72, 4) == "8888") wData = new WeatherData(0d, WeatherData.DataSource.MissingValue, -1);
                    else wData = new WeatherData(double.Parse(str.Substring(72, 4)) * 10, WeatherData.DataSource.MeasuredValue, -1);
                    wRecord.SetData(WeatherRecord.RecordType.CeilingHeight, wData);

                    //視認距離[km]
                    if (str.Substring(81, 4) == "8888") wData = new WeatherData(160d, WeatherData.DataSource.MeasuredValue, -1);
                    else wData = new WeatherData(double.Parse(str.Substring(81, 4)) * 10, WeatherData.DataSource.MeasuredValue, -1);
                    wRecord.SetData(WeatherRecord.RecordType.Visibility, wData);

                    //気圧[kPa]
                    wData = new WeatherData(double.Parse(str.Substring(98, 5)) / 100, WeatherData.DataSource.MeasuredValue, -1);
                    double atm = wData.Value;
                    wRecord.SetData(WeatherRecord.RecordType.AtmosphericPressure, wData);

                    //外気乾球温度[C]
                    wData = new WeatherData(double.Parse(str.Substring(103, 4)) / 10, WeatherData.DataSource.MeasuredValue, -1);
                    double dbt = wData.Value;
                    wRecord.SetData(WeatherRecord.RecordType.DryBulbTemperature, wData);

                    //露点温度[C]
                    wData = new WeatherData(double.Parse(str.Substring(107, 4)) / 10, WeatherData.DataSource.MeasuredValue, -1);
                    double dpt = wData.Value;
                    wRecord.SetData(WeatherRecord.RecordType.DewPointTemperature, wData);

                    //その他の空気状態
                    double ahd = MoistAir.GetSaturatedHumidityRatio(dpt, MoistAir.Property.DryBulbTemperature, atm);
                    MoistAir mAir = MoistAir.GetAirStateFromDBHR(dbt, ahd, atm);

                    //相対湿度[%]
                    wRecord.SetData(WeatherRecord.RecordType.RelativeHumidity, new WeatherData(mAir.RelativeHumidity, WeatherData.DataSource.CalculatedValue, -1));
                    //絶対湿度[kg/kg(DA)]
                    wRecord.SetData(WeatherRecord.RecordType.HumidityRatio, new WeatherData(mAir.HumidityRatio, WeatherData.DataSource.CalculatedValue, -1));

                    //風向
                    wData = new WeatherData(double.Parse(str.Substring(111, 3)), WeatherData.DataSource.MeasuredValue, -1);
                    wRecord.SetData(WeatherRecord.RecordType.WindDirection, wData);

                    //風速[m/s]
                    wData = new WeatherData(double.Parse(str.Substring(114, 4))  / 10d, WeatherData.DataSource.MeasuredValue, -1);
                    wRecord.SetData(WeatherRecord.RecordType.WindSpeed, wData);

                    //雲量
                    double dbl = double.Parse(str.Substring(118, 2));
                    if (dbl == 99) wData = new WeatherData(double.Parse(str.Substring(118, 2)), WeatherData.DataSource.MissingValue, -1);
                    else wData = new WeatherData(double.Parse(str.Substring(118, 2)), WeatherData.DataSource.MeasuredValue, -1);
                    wRecord.SetData(WeatherRecord.RecordType.TotalSkyCover, wData);

                    //雲量2
                    wData = new WeatherData(double.Parse(str.Substring(120, 2)), WeatherData.DataSource.MeasuredValue, -1);
                    wRecord.SetData(WeatherRecord.RecordType.OpaqueSkyCover, wData);

                    //欠測補充
                    wRecord.FillMissingData();

                    //気象レコード追加
                    wdTable.AddWeatherRecord(wRecord);
                }
            }

            success = true;
            return wdTable;
        }
예제 #8
0
        /// <summary>ファイルを元にWeatherDataTableを構成する</summary>
        /// <param name="filePath">読み取りファイルのパス</param>
        /// <param name="success">読み取り成功の真偽</param>
        /// <returns>構成されたPWeatherDataオブジェクト</returns>
        public static WeatherDataTable ToPWeatherData(string filePath, out bool success)
        {
            success = false;

            //読み出しファイルの存在確認
            if (File.Exists(filePath))
            {
                WeatherDataTable wdTable = new WeatherDataTable();
                using (StreamReader sReader = new StreamReader(filePath))
                {
                    string[] buff;
                    DateTime dTime = new DateTime();

                    //第1行:地点情報
                    buff = sReader.ReadLine().Split(',');
                    LocationInformation lInfo = new LocationInformation();
                    lInfo.ID = int.Parse(buff[0]);
                    lInfo.Name = buff[1];
                    lInfo.EnglishName = buff[2];
                    lInfo.Latitude = double.Parse(buff[4]);
                    lInfo.Longitude = double.Parse(buff[5]);
                    lInfo.Elevation = double.Parse(buff[6]);

                    for (int i = 0; i < 8760; i++)
                    {
                        WeatherRecord wRecord = new WeatherRecord();
                        WeatherData wData;

                        //年月日特定
                        if (i == 0)
                        {
                            buff = sReader.ReadLine().Split(',');
                            dTime = DateTime.ParseExact(buff[0], "MM/dd/yyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo);
                        }
                        wRecord.DataDTime = dTime;

                        //日射関連**********************************
                        //大気圏外水平面日射
                        wData = new WeatherData(double.Parse(buff[2]) / 3600d, WeatherData.DataSource.CalculatedValue, -1);
                        wRecord.SetData(WeatherRecord.RecordType.ExtraterrestrialHorizontalRadiation, wData);
                        //大気圏外法線面日射
                        wData = new WeatherData(double.Parse(buff[3]) / 3600d, WeatherData.DataSource.CalculatedValue, -1);
                        wRecord.SetData(WeatherRecord.RecordType.ExtraterrestrialDirectNormalRadiation, wData);
                        //水平面全天日射
                        wData = new WeatherData(double.Parse(buff[4]) / 3600d, WeatherData.DataSource.Unknown, double.Parse(buff[6]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.GlobalHorizontalRadiation, wData);
                        //直達日射
                        wData = new WeatherData(double.Parse(buff[7]) / 3600d, WeatherData.DataSource.Unknown, double.Parse(buff[9]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.DirectNormalRadiation, wData);
                        //水平面天空日射
                        wData = new WeatherData(double.Parse(buff[10]) / 3600d, WeatherData.DataSource.Unknown, double.Parse(buff[12]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.DiffuseHorizontalRadiation, wData);

                        //日照関連**********************************
                        //水平面全天照度
                        wData = new WeatherData(double.Parse(buff[13]), WeatherData.DataSource.Unknown, double.Parse(buff[15]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.GlobalHorizontalIlluminance, wData);
                        //法線面直射日射照度
                        wData = new WeatherData(double.Parse(buff[16]), WeatherData.DataSource.Unknown, double.Parse(buff[18]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.DirectNormalIlluminance, wData);
                        //水平面天空照度
                        wData = new WeatherData(double.Parse(buff[19]), WeatherData.DataSource.Unknown, double.Parse(buff[21]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.DiffuseHorizontalIlluminance, wData);
                        //天頂輝度
                        wData = new WeatherData(double.Parse(buff[22]), WeatherData.DataSource.Unknown, double.Parse(buff[24]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.ZenithLuminance, wData);
                        //雲量
                        wData = new WeatherData(double.Parse(buff[25]), getDSource(buff[26]), double.Parse(buff[27]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.TotalSkyCover, wData);
                        //雲量2
                        wData = new WeatherData(double.Parse(buff[28]), getDSource(buff[29]), double.Parse(buff[30]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.OpaqueSkyCover, wData);

                        //空気状態関連**********************************
                        //乾球温度
                        wData = new WeatherData(double.Parse(buff[31]), getDSource(buff[32]), double.Parse(buff[33]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.DryBulbTemperature, wData);
                        //露点温度
                        wData = new WeatherData(double.Parse(buff[34]), getDSource(buff[35]), double.Parse(buff[36]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.DewPointTemperature, wData);
                        //相対湿度
                        wData = new WeatherData(double.Parse(buff[37]), getDSource(buff[38]), double.Parse(buff[39]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.RelativeHumidity, wData);
                        //気圧
                        wData = new WeatherData(double.Parse(buff[40]) / 10d, getDSource(buff[41]), double.Parse(buff[42]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.AtmosphericPressure, wData);

                        //その他**********************************
                        //風向
                        wData = new WeatherData(double.Parse(buff[43]) - 180d, getDSource(buff[44]), double.Parse(buff[45]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.WindDirection, wData);
                        //風速
                        wData = new WeatherData(double.Parse(buff[46]), getDSource(buff[47]), double.Parse(buff[48]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.WindSpeed, wData);
                        //視認距離
                        wData = new WeatherData(double.Parse(buff[49]), getDSource(buff[50]), double.Parse(buff[51]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.Visibility, wData);
                        //雲高さ
                        wData = new WeatherData(double.Parse(buff[52]), getDSource(buff[53]), double.Parse(buff[54]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.CeilingHeight, wData);
                        //可降水量
                        wData = new WeatherData(double.Parse(buff[55]), getDSource(buff[56]), double.Parse(buff[57]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.PrecipitableWater, wData);
                        //大気混濁度
                        wData = new WeatherData(double.Parse(buff[58]), getDSource(buff[59]), double.Parse(buff[60]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.AerosolOpticalDepth, wData);
                        //アルベド
                        wData = new WeatherData(double.Parse(buff[61]), getDSource(buff[62]), double.Parse(buff[63]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.Albedo, wData);
                        //降水量
                        wData = new WeatherData(double.Parse(buff[64]), getDSource(buff[66]), double.Parse(buff[67]) / 100d);
                        wRecord.SetData(WeatherRecord.RecordType.PrecipitationLevel, wData);
                        //降水量計測時間はとりあえず無視

                        //気象データ追加
                        wdTable.AddWeatherRecord(wRecord);

                        //時刻更新
                        dTime = dTime.AddHours(1);
                    }
                }

                success = true;
                return wdTable;
            }
            else return null;
        }