オーケー馬 ソース公開1「Form1.cs」


画面イメージ

競馬分析ソフト「オーケー馬」のプログラム・ソースを公開します。
5本程度のファイルになります。画面のコントロールのプロパティは後々、記載していきます。
とりあえず、1ページに1ファイルを記載予定です。
いずれ、解説なども記載します。
思い立ったが吉日なので、汚いソースですが、掲載します。
GitHubにもアップする予定です。
目的は、多くの人が競馬ソフトに触れる機会を作ることが、表向き。
個人としては、子供がこのソフトを使い、金に不自由をしない生活を送ること。
分析ソフトなので、このソフトで誰もが億万長者になれるわけではありません。
ですが、最初からソフトを作る労力は並大抵ではありません。
僕の場合は、紆余曲折あって、25年かかりました。
その集大成を公開します。

プログラムを見やすくするために、たまに、ソースを修正します。
noteには、編集されたときの通知機能がないので、有料化することで、お金を払ってくれた人に通知が行くようにします。
ですので、このページをお気に入りに登録しておけば、ソースが変更されても、閲覧は可能です。
画面のコードです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace okbaCSapp
{
    // okbaCS
    public partial class Form1 : Form
    {
        targetRace targ;
        const string chuoData = "UMA_CMPI.txt";
        const string nankanData = "UMA_CMPI_nankan.txt";
        string fileData = string.Empty;
        string resultUmaban = string.Empty;
        int resultRaceCnt = 0;
        int resultHitCnt = 0;
        long resultRetMny = 0;
        int configTargetCnt = 10;
        float configHitRatio = 0.2f;
        float configReturnRatio = 1.2f;
        enum tosusu : int
        {
            t8 = 255,
            t9 = 511,
            t10 = 1023,
            t11 = 2047,
            t12 = 4095,
            t13 = 4095,
            t14 = 4095,
            t15 = 4095,
            t16 = 4095,
            t17 = 4095,
            t18 = 4095,
        }
        //enum tosusu : int
        //{
        //    t8 = 255,
        //    t9 = 511,
        //    t10 = 1023,
        //    t11 = 2047,
        //    t12 = 4095,
        //    t13 = 8191,
        //    t14 = 16383,
        //    t15 = 32767,
        //    t16 = 65535,
        //    t17 = 131071,
        //    t18 = 262143,
        //}

        string line;
        string backkey;
        string[] pat18;// = new string[262143];
        string[] pat17 = new string[131071];
        string[] pat16 = new string[65535];
        string[] pat15 = new string[32767];
        string[] pat14 = new string[16383];
        string[] pat13 = new string[8191];
        string[] pat12 = new string[4095];
        string[] pat11 = new string[2047];
        string[] pat10 = new string[1023];
        string[] pat9 = new string[511];
        string[] pat8 = new string[255];
        string[] src;
        string[] okba;
        string[] harai;
        /// <summary>
        /// コンピ指数情報
        /// </summary>
        string[] tar;

        Dictionary<string, string> ans8 = new Dictionary<string, string>();
        Dictionary<string, string> ans9 = new Dictionary<string, string>();
        Dictionary<string, string> ans10 = new Dictionary<string, string>();
        Dictionary<string, string> ans12 = new Dictionary<string, string>();
        Dictionary<string, string> ans14 = new Dictionary<string, string>();
        Dictionary<string, string> ans16 = new Dictionary<string, string>();
        Dictionary<string, string> ans18 = new Dictionary<string, string>();
        bool isAdd;       // insert or update

        // enum(列挙型)の使い方総まとめ
        // https://www.sejuku.net/blog/50547
        enum indx : int
        {
            Year = 0,
            Monthday,
            jyocd,
            Kaiji,
            Nichiji,
            RaceNum,
            C01,
            C02,
            C03,
            C04,
            C05,
            C06,
            C07,
            C08,
            C09,
            C10,
            C11,
            C12,
            C13,
            C14,
            C15,
            C16,
            C17,
            C18,
            U01,
            U02,
            U03,
            U04,
            U05,
            U06,
            U07,
            U08,
            U09,
            U10,
            U11,
            U12,
            U13,
            U14,
            U15,
            U16,
            U17,
            U18,
            HF01,
            HF02,
            HF03,
            HF04,
            HF05,
            UF01,
            UF02,
            UF03,
            UF04,
            UF05,
            JyokenCD5,
            TrackCD,
            TorokuTosu,
        }

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// パターンファイルのデータ数を取得
        /// </summary>
        /// <param name="pat"></param>
        /// <returns></returns>
        private long getPatArr()
        {
            switch (targ.tarTosu)
            {
                case 8:
                    return pat8.Length;
                case 9:
                    return pat9.Length;
                case 10:
                    return pat10.Length;
                case 12:
                    return pat12.Length;
                case 14:
                    return pat14.Length;
                case 15:
                    return pat15.Length;
                case 16:
                    return pat16.Length;
                case 18:
                    return pat18.Length;
                default:
                    return 0;
            }
        }
        private long getPatArr(int tosu)
        {
            switch (tosu)
            {
                case 8:
                    return pat8.Length;
                case 9:
                    return pat9.Length;
                case 10:
                    return pat10.Length;
                case 12:
                    return pat12.Length;
                case 14:
                    return pat14.Length;
                case 15:
                    return pat15.Length;
                case 16:
                    return pat16.Length;
                case 18:
                    return pat18.Length;
                default:
                    return 0;
            }
        }
        /// <summary>
        /// カンマ区切りのコンピ指数情報を配列に変換
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        private string[] pickPat(long index)
        {
            switch (targ.tarTosu)
            {
                case 8:
                    return pat8[index].Split(',');
                case 9:
                    return pat9[index].Split(',');
                case 10:
                    return pat10[index].Split(',');
                case 12:
                    return pat12[index].Split(',');
                case 14:
                    return pat14[index].Split(',');
                case 15:
                    return pat15[index].Split(',');
                case 16:
                    return pat16[index].Split(',');
                case 18:
                    return pat18[index].Split(',');
            }

            return null;
        }

        /// <summary>
        /// ABCを012に変換 'A'=65
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private string alphabet2Number(string str)
        {
            return ((int)char.Parse(str) - 65).ToString();
        }

        /// <summary>
        /// UMA_CMPI.txtを読込み
        /// </summary>
        private void getSrcDataNew()
        {
            src = Utility.readFile(fileData);
        }
        private void getSrcData()
        {
            int cnt;

            cnt = 0;
            using (StreamReader sr = new StreamReader(fileData))
            {
                while ((line = sr.ReadLine()) != null)
                {
                    cnt++;
                }
            }

            Array.Resize(ref src, cnt);
            cnt = 0;
            using (StreamReader sr = new StreamReader(fileData))
            {
                while ((line = sr.ReadLine()) != null)
                {
                    src[cnt] = line;
                    cnt++;
                }
            }
        }

        private void getTargetData()
        {
            int cnt;

            cnt = 0;
            using (StreamReader sr = new StreamReader("target.txt"))
            {
                while ((line = sr.ReadLine()) != null) cnt++;
            }

            Array.Resize(ref tar, cnt);
            cnt = 0;
            using (StreamReader sr = new StreamReader(ConstValue.fileTargetTxt))
            {
                while ((line = sr.ReadLine()) != null) tar[cnt++] = line;
            }
        }
        /// <summary>
        /// "target.txt"の行数を取得
        /// </summary>
        /// <returns></returns>
        private int countLineFile()
        {
            int cnt = 0;
            using (StreamReader sr = new StreamReader(Utility.PlusPath(ConstValue.fileTargetTxt)))
            {
                while ((line = sr.ReadLine()) != null) cnt++;
            }

            return cnt;
        }
        /// <summary>
        /// "target.txt"をtarに出力
        /// </summary>
        private void getFileData()
        {
            int cnt = 0;
            using (StreamReader sr = new StreamReader(Utility.PlusPath(ConstValue.fileTargetTxt)))
            {
                while ((line = sr.ReadLine()) != null) tar[cnt++] = line;
            }
        }
        /// <summary>
        /// "target.txt"をtarに出力 ※当日コンピ指数情報
        /// </summary>
        private void getTargetDataNew()
        {
            Array.Resize(ref tar, this.countLineFile());
            this.getFileData();
        }

        /// <summary>
        /// アルファベットを数値に変換 A->0, B->1
        /// </summary>
        /// <param name="line"></param>
        /// <returns></returns>
        private string convertAlphabet2NumberSeparateComma(string line)
        {
            StringBuilder wsb = new StringBuilder(string.Empty);
            string[] wsp = line.Split(',');
            for (int idx = 0; idx < (wsp.Length - 1); idx++)
            {
                wsb.Append(alphabet2Number(wsp[idx]));
                wsb.Append(',');
            }

            wsb.Append(alphabet2Number(wsp[wsp.Length - 1]));
            return wsb.ToString();
        }

        /// <summary>
        /// パターンファイルを数値に変換 A,B,C -> 0,1,2
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        private string[] makePat(string filename)
        {
            string[] ans = new string[262143];
            int cnt = 0;
            using (StreamReader sr = new StreamReader(Utility.PlusPath(filename)))
            {
                while ((line = sr.ReadLine()) != null) ans[cnt++] = this.convertAlphabet2NumberSeparateComma(line);
            }

            Array.Resize(ref ans, cnt);
            return ans;
        }

        // A:0, B:1, ....
        // pat18をソースとして、他のパターンは、最大行数をリサイズする→だめ

        /// <summary>
        /// 出走頭数別のパターンデータを生成
        /// </summary>
        private void getPatDataNew()
        {
            pat18 = this.makePat("pat18.txt");
            pat17 = this.makePat("pat17.txt");
            pat16 = this.makePat("pat16.txt");
            pat15 = this.makePat("pat15.txt");
            pat14 = this.makePat("pat14.txt");
            pat13 = this.makePat("pat13.txt");
            pat12 = this.makePat("pat12.txt");
            pat11 = this.makePat("pat11.txt");
            pat10 = this.makePat("pat10.txt");
            pat9 = this.makePat("pat9.txt");
            pat8 = this.makePat("pat8.txt");
        }

        // A:0, B:1, ....
        // pat18をソースとして、他のパターンは、最大行数をリサイズする→だめ
        private void getPatData()
        {
            int cnt = 0;
            StringBuilder wsb;
            using (StreamReader sr = new StreamReader("pat18.txt"))
            {
                wsb = new StringBuilder("");
                while ((line = sr.ReadLine()) != null)
                {
                    string[] wsp = line.Split(',');
                    for (int idx = 0; idx < wsp.Length; idx++)
                    {
                        wsb.Append(alphabet2Number(wsp[idx]));
                        wsb.Append(',');
                    }

                    pat18[cnt++] = wsb.ToString();
                    wsb = new StringBuilder("");
                }
            }
            Array.Resize(ref pat18, cnt);

            cnt = 0;
            using (StreamReader sr = new StreamReader("pat17.txt"))
            {
                wsb = new StringBuilder("");
                while ((line = sr.ReadLine()) != null)
                {
                    string[] wsp = line.Split(',');
                    for (int idx = 0; idx < wsp.Length; idx++)
                    {
                        wsb.Append(alphabet2Number(wsp[idx]));
                        wsb.Append(',');
                    }

                    pat17[cnt] = wsb.ToString();
                    wsb = new StringBuilder("");
                    cnt++;
                }
            }
            Array.Resize(ref pat17, cnt);

            cnt = 0;
            using (StreamReader sr = new StreamReader("pat16.txt"))
            {
                wsb = new StringBuilder("");
                while ((line = sr.ReadLine()) != null)
                {
                    string[] wsp = line.Split(',');
                    for (int idx = 0; idx < wsp.Length; idx++)
                    {
                        wsb.Append(alphabet2Number(wsp[idx]));
                        wsb.Append(',');
                    }

                    pat16[cnt] = wsb.ToString();
                    wsb = new StringBuilder("");
                    cnt++;
                }
            }
            Array.Resize(ref pat16, cnt);

            cnt = 0;
            using (StreamReader sr = new StreamReader("pat15.txt"))
            {
                wsb = new StringBuilder("");
                while ((line = sr.ReadLine()) != null)
                {
                    string[] wsp = line.Split(',');
                    for (int idx = 0; idx < wsp.Length; idx++)
                    {
                        wsb.Append(alphabet2Number(wsp[idx]));
                        wsb.Append(',');
                    }

                    pat15[cnt] = wsb.ToString();
                    wsb = new StringBuilder("");
                    cnt++;
                }
            }
            Array.Resize(ref pat15, cnt);

            cnt = 0;
            using (StreamReader sr = new StreamReader("pat14.txt"))
            {
                wsb = new StringBuilder("");
                while ((line = sr.ReadLine()) != null)
                {
                    string[] wsp = line.Split(',');
                    for (int idx = 0; idx < wsp.Length; idx++)
                    {
                        wsb.Append(alphabet2Number(wsp[idx]));
                        wsb.Append(',');
                    }

                    pat14[cnt] = wsb.ToString();
                    wsb = new StringBuilder("");
                    cnt++;
                }
            }
            Array.Resize(ref pat14, cnt);

            cnt = 0;
            using (StreamReader sr = new StreamReader("pat13.txt"))
            {
                wsb = new StringBuilder("");
                while ((line = sr.ReadLine()) != null)
                {
                    string[] wsp = line.Split(',');
                    for (int idx = 0; idx < wsp.Length; idx++)
                    {
                        wsb.Append(alphabet2Number(wsp[idx]));
                        wsb.Append(',');
                    }

                    pat13[cnt] = wsb.ToString();
                    wsb = new StringBuilder("");
                    cnt++;
                }
            }
            Array.Resize(ref pat13, cnt);

            cnt = 0;
            using (StreamReader sr = new StreamReader("pat12.txt"))
            {
                wsb = new StringBuilder("");
                while ((line = sr.ReadLine()) != null)
                {
                    string[] wsp = line.Split(',');
                    for (int idx = 0; idx < wsp.Length; idx++)
                    {
                        wsb.Append(alphabet2Number(wsp[idx]));
                        wsb.Append(',');
                    }

                    pat12[cnt] = wsb.ToString();
                    wsb = new StringBuilder("");
                    cnt++;
                }
            }
            Array.Resize(ref pat12, cnt);

            cnt = 0;
            using (StreamReader sr = new StreamReader("pat11.txt"))
            {
                wsb = new StringBuilder("");
                while ((line = sr.ReadLine()) != null)
                {
                    string[] wsp = line.Split(',');
                    for (int idx = 0; idx < wsp.Length; idx++)
                    {
                        wsb.Append(alphabet2Number(wsp[idx]));
                        wsb.Append(',');
                    }

                    pat11[cnt] = wsb.ToString();
                    wsb = new StringBuilder("");
                    cnt++;
                }
            }
            Array.Resize(ref pat11, cnt);

            cnt = 0;
            using (StreamReader sr = new StreamReader("pat10.txt"))
            {
                wsb = new StringBuilder("");
                while ((line = sr.ReadLine()) != null)
                {
                    string[] wsp = line.Split(',');
                    for (int idx = 0; idx < wsp.Length; idx++)
                    {
                        wsb.Append(alphabet2Number(wsp[idx]));
                        wsb.Append(',');
                    }

                    pat10[cnt] = wsb.ToString();
                    wsb = new StringBuilder("");
                    cnt++;
                }
            }
            Array.Resize(ref pat10, cnt);

            cnt = 0;
            using (StreamReader sr = new StreamReader("pat9.txt"))
            {
                wsb = new StringBuilder("");
                while ((line = sr.ReadLine()) != null)
                {
                    string[] wsp = line.Split(',');
                    for (int idx = 0; idx < wsp.Length; idx++)
                    {
                        wsb.Append(alphabet2Number(wsp[idx]));
                        wsb.Append(',');
                    }

                    pat9[cnt] = wsb.ToString();
                    wsb = new StringBuilder("");
                    cnt++;
                }
            }
            Array.Resize(ref pat9, cnt);

            cnt = 0;
            using (StreamReader sr = new StreamReader("pat8.txt"))
            {
                wsb = new StringBuilder("");
                while ((line = sr.ReadLine()) != null)
                {
                    string[] wsp = line.Split(',');
                    for (int idx = 0; idx < wsp.Length; idx++)
                    {
                        wsb.Append(alphabet2Number(wsp[idx]));
                        wsb.Append(',');
                    }

                    pat8[cnt] = wsb.ToString();
                    wsb = new StringBuilder("");
                    cnt++;
                }
            }
            Array.Resize(ref pat8, cnt);
        }

        private bool isAddMode(int pat, string key)
        {
            StringBuilder sb = new StringBuilder(key);
            sb.Append("00");    // target"00"は必ず存在するため
            string basekey = sb.ToString();

            switch (pat)
            {
                case 8:
                    return ans8.ContainsKey(basekey) ? false : true;
                case 9:
                    return ans9.ContainsKey(basekey) ? false : true;
                case 10:
                    return ans10.ContainsKey(basekey) ? false : true;
                case 12:
                    return ans12.ContainsKey(basekey) ? false : true;
                case 14:
                    return ans14.ContainsKey(basekey) ? false : true;
                case 16:
                    return ans16.ContainsKey(basekey) ? false : true;
                case 18:
                    return ans18.ContainsKey(basekey) ? false : true;
            }

            return false;
        }

        private void updateData(int pat, string key, bool isAdd, string money)
        {
            //backkey = key;
            ////System.Diagnostics.Debug.WriteLine(key);
            //StringBuilder sb = new StringBuilder("");
            //string wkD;
            ////string hitCnt = "0";
            ////string raceCnt;
            //long addHit = 0;
            //long addRace = 1;

            //if (money != "0")
            //{
            //    addHit = 1;
            //}

            //if (isAdd)
            //{
            //    sb.Append(addRace.ToString());
            //    sb.Append(",");
            //    sb.Append(addHit.ToString());
            //    sb.Append(",");
            //    sb.Append(money);
            //    wkD = sb.ToString();

            //    switch (pat)
            //    {
            //        case 8:
            //            if (ans8.ContainsKey(key))
            //            {
            //                key = key;
            //            }
            //            ans8.Add(key, wkD);
            //            break;
            //        case 9:
            //            if (ans9.ContainsKey(key))
            //            {
            //                key = key;
            //            }
            //            ans9.Add(key, wkD);
            //            break;
            //        case 10:
            //            if (ans10.ContainsKey(key))
            //            {
            //                key = key;
            //            }
            //            ans10.Add(key, wkD);
            //            break;
            //        case 12:
            //            if (ans12.ContainsKey(key))
            //            {
            //                key = key;
            //            }
            //            ans12.Add(key, wkD);
            //            break;
            //        case 14:
            //            if (ans14.ContainsKey(key))
            //            {
            //                key = key;
            //            }
            //            ans14.Add(key, wkD);
            //            break;
            //        case 16:
            //            if (ans16.ContainsKey(key))
            //            {
            //                key = key;
            //            }
            //            ans16.Add(key, wkD);
            //            break;
            //        case 18:
            //            if (ans18.ContainsKey(key))
            //            {
            //                key = key;
            //            }
            //            ans18.Add(key, wkD);
            //            break;
            //    }
            //}
            //else
            //{
            //    switch (pat)
            //    {
            //        case 8:
            //            string[] dats8 = ans8[key].Split(',');
            //            dats8[0] = (long.Parse(dats8[0]) + 1).ToString();                     // count
            //            dats8[1] = (long.Parse(dats8[1]) + addHit).ToString();                // hit
            //            dats8[2] = (long.Parse(dats8[2]) + long.Parse(money)).ToString();     // money
            //            sb.Append(dats8[0]);
            //            sb.Append(",");
            //            sb.Append(dats8[1]);
            //            sb.Append(",");
            //            sb.Append(dats8[2]);
            //            wkD = sb.ToString();
            //            ans8[key] = wkD;
            //            break;
            //        case 9:
            //            string[] dats9 = ans9[key].Split(',');
            //            dats9[0] = (long.Parse(dats9[0]) + 1).ToString();                     // count
            //            dats9[1] = (long.Parse(dats9[1]) + addHit).ToString();                // hit
            //            dats9[2] = (long.Parse(dats9[2]) + long.Parse(money)).ToString();     // money
            //            sb.Append(dats9[0]);
            //            sb.Append(",");
            //            sb.Append(dats9[1]);
            //            sb.Append(",");
            //            sb.Append(dats9[2]);
            //            wkD = sb.ToString();
            //            ans9[key] = wkD;
            //            break;
            //        case 10:
            //            string[] dats10 = ans10[key].Split(',');
            //            dats10[0] = (long.Parse(dats10[0]) + 1).ToString();                     // count
            //            dats10[1] = (long.Parse(dats10[1]) + addHit).ToString();                // hit
            //            dats10[2] = (long.Parse(dats10[2]) + long.Parse(money)).ToString();     // money
            //            sb.Append(dats10[0]);
            //            sb.Append(",");
            //            sb.Append(dats10[1]);
            //            sb.Append(",");
            //            sb.Append(dats10[2]);
            //            wkD = sb.ToString();
            //            ans10[key] = wkD;
            //            break;
            //        case 12:
            //            string[] dats12 = ans12[key].Split(',');
            //            dats12[0] = (long.Parse(dats12[0]) + 1).ToString();                     // count
            //            dats12[1] = (long.Parse(dats12[1]) + addHit).ToString();                // hit
            //            dats12[2] = (long.Parse(dats12[2]) + long.Parse(money)).ToString();     // money
            //            sb.Append(dats12[0]);
            //            sb.Append(",");
            //            sb.Append(dats12[1]);
            //            sb.Append(",");
            //            sb.Append(dats12[2]);
            //            wkD = sb.ToString();
            //            ans12[key] = wkD;
            //            break;
            //        case 14:
            //            string[] dats14 = ans14[key].Split(',');
            //            dats14[0] = (long.Parse(dats14[0]) + 1).ToString();                     // count
            //            dats14[1] = (long.Parse(dats14[1]) + addHit).ToString();                // hit
            //            dats14[2] = (long.Parse(dats14[2]) + long.Parse(money)).ToString();     // money
            //            sb.Append(dats14[0]);
            //            sb.Append(",");
            //            sb.Append(dats14[1]);
            //            sb.Append(",");
            //            sb.Append(dats14[2]);
            //            wkD = sb.ToString();
            //            ans14[key] = wkD;
            //            break;
            //        case 16:
            //            string[] dats16 = ans16[key].Split(',');
            //            dats16[0] = (long.Parse(dats16[0]) + 1).ToString();                     // count
            //            dats16[1] = (long.Parse(dats16[1]) + addHit).ToString();                // hit
            //            dats16[2] = (long.Parse(dats16[2]) + long.Parse(money)).ToString();     // money
            //            sb.Append(dats16[0]);
            //            sb.Append(",");
            //            sb.Append(dats16[1]);
            //            sb.Append(",");
            //            sb.Append(dats16[2]);
            //            wkD = sb.ToString();
            //            ans16[key] = wkD;
            //            break;
            //        case 18:
            //            string[] dats18 = ans18[key].Split(',');
            //            dats18[0] = (long.Parse(dats18[0]) + 1).ToString();                     // count
            //            dats18[1] = (long.Parse(dats18[1]) + addHit).ToString();                // hit
            //            dats18[2] = (long.Parse(dats18[2]) + long.Parse(money)).ToString();     // money
            //            sb.Append(dats18[0]);
            //            sb.Append(",");
            //            sb.Append(dats18[1]);
            //            sb.Append(",");
            //            sb.Append(dats18[2]);
            //            wkD = sb.ToString();
            //            ans18[key] = wkD;
            //            break;
            //    }
            //}

        }

        private void button1_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString());
            button1.Enabled = false;

            // DictionaryのKey、Valueの使い方
            // https://www.sejuku.net/blog/41326

            // char c = char.Parse(str);
            // int aa=(int)c;

            // pattern data load
            getPatData();

            // 初期化

            // ファイルを開く
            using (StreamReader sr = new StreamReader(fileData))
            {
                int tosu;
                string[] vlue;
                string[] umab;
                string[] hara;
                string[] umaw;

                // src data loop
                while ((line = sr.ReadLine()) != null)
                {

                    StringBuilder sb = new StringBuilder("");
                    // カンマで分割
                    var values = line.Split(',');
                    if (values.Length != (int)(indx.TorokuTosu + 1))
                    {
                        throw new Exception("CSV format error");
                    }

                    try
                    {
                        if (values[(int)indx.HF01] == "")
                        {
                            continue;
                            //myDic[key]=value;
                        }
                        // 払い戻しデータが存在する->data make

                        // 頭数
                        tosu = int.Parse(values[(int)indx.TorokuTosu]);

                        if ((tosu != 16)) //if ((tosu < 8) || (tosu == 11) || (tosu == 13) || (tosu == 15) || (tosu == 17) || (tosu > 18))
                        {
                            continue;
                        }

                        // main base data
                        vlue = new string[tosu];
                        for (int ii = 0; ii < vlue.Length; ii++)
                        {
                            vlue[ii] = values[(int)indx.C01 + ii];
                        }

                        umab = new string[tosu];
                        for (int ii = 0; ii < umab.Length; ii++)
                        {
                            umab[ii] = values[(int)indx.U01 + ii];
                        }

                        int haraiCnt = 0;
                        for (int ii = (int)indx.HF01; ii < (int)indx.UF01; ii++)
                        {
                            if (values[ii] == "")
                            {
                                haraiCnt = ii - (int)indx.HF01;
                                break;
                            }
                        }

                        hara = new string[haraiCnt];
                        for (int ii = 0; ii < hara.Length; ii++)
                        {
                            hara[ii] = values[(int)indx.HF01 + ii];
                        }

                        umaw = new string[haraiCnt];
                        for (int ii = 0; ii < umaw.Length; ii++)
                        {
                            umaw[ii] = values[(int)indx.UF01 + ii];
                        }

                        // pattern loop
                        //for (long pp = 0; pp < getPatArr(tosu); pp++)
                        //{
                        //    string[] pick = pickPat(tosu, pp);      // A:0, B:1, ..., null
                        //    Array.Resize(ref pick, pick.Length - 1);
                        //    string[] pickVlue = new string[pick.Length];
                        //    for (int ii = 0; ii < pickVlue.Length; ii++)
                        //    {
                        //        pickVlue[ii] = vlue[int.Parse(pick[ii])];
                        //    }
                        //    string[] pickUmab = new string[pickVlue.Length];
                        //    for (int ii = 0; ii < pickVlue.Length; ii++)
                        //    {
                        //        pickUmab[ii] = umab[int.Parse(pick[ii])];
                        //    }

                        //    StringBuilder keyWk;
                        //    keyWk = new StringBuilder("");
                        //    for (int ii = 0; ii < 18; ii++)
                        //    {
                        //        if (ii < pick.Length)
                        //        {
                        //            keyWk.Append(String.Format("{0:00}", int.Parse(pick[ii])));
                        //        }
                        //        else
                        //        {
                        //            keyWk.Append("00");
                        //        }
                        //    }

                        //    string rankStr = keyWk.ToString();
                        //    //if (rankStr.Length != 36)
                        //    //{
                        //    //    rankStr = rankStr;
                        //    //}

                        //    keyWk = new StringBuilder("");
                        //    for (int ii = 0; ii < 18; ii++)
                        //    {
                        //        if (ii < pick.Length)
                        //        {
                        //            keyWk.Append(pickVlue[ii]);
                        //        }
                        //        else
                        //        {
                        //            keyWk.Append("00");
                        //        }
                        //    }

                        //    string vlueStr = keyWk.ToString();

                        //    keyWk = new StringBuilder("");
                        //    keyWk.Append(rankStr);
                        //    keyWk.Append(vlueStr);
                        //    string key1 = keyWk.ToString();



                        //    isAdd = isAddMode(tosu, key1);
                        //    string getMny = "0";

                        //    // target Loop
                        //    for (int tarIdx = 00; tarIdx < pick.Length; tarIdx++)
                        //    {
                        //        keyWk = new StringBuilder("");
                        //        keyWk.Append(key1);
                        //        string tarStr = String.Format("{0:00}",  tarIdx);
                        //        keyWk.Append(tarStr);
                        //        string key2 = keyWk.ToString();

                        //        // Is win target horse?
                        //        for (int winIdx = 00; winIdx < umaw.Length; winIdx++)
                        //        {
                        //            if (pickUmab[tarIdx] == umaw[winIdx])
                        //            {
                        //                getMny = hara[winIdx];
                        //                break;
                        //            }
                        //        }

                        //        updateData(tosu, key2, isAdd, getMny);
                        //    }
                        //}







                        //// オブジェクト作成
                        //sb.Append(values[54]);
                        //sb.Append("01");
                        //sb.Append("010203040506070809101112131415161718");
                        //for (int ii = 6; ii <= 24; ii++)
                        //{
                        //    sb.Append(values[ii]);
                        //}

                        //work = sb.ToString();

                        //if (!ans.ContainsKey(work))
                        //{
                        //    ans.Add(work, "");
                        //}
                        //else
                        //{
                        //    System.Diagnostics.Debug.WriteLine("exist!");
                        //}
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString());
                        System.Diagnostics.Debug.WriteLine(ex.Message);
                    }
                }
            }

            // テキスト・ファイルの内容を簡単に書き込むには?
            // https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/680filewriteall/filewriteall.html
            //Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
            //string[] manyLines = {"テスト", "書き込み", "改行"};
            //File.WriteAllLines(@"C:\TestLines.txt", manyLines, sjisEnc);

            button1.Enabled = true;
            System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString());
        }
        /// <summary>
        /// 
        /// </summary>
        private void executeJobX()
        {
            this.dispLog(Utility.CombinStrings(new string[] { "start :", DateTime.Now.ToString() }));

            this.setFileData(radioButton1.Checked);//chuo,nankan
            this.setInitialExecuteJob();
            this.executeJobNew();

            this.dispLog(Utility.CombinStrings(new string[] { "end :", DateTime.Now.ToString() }));
        }


        private void dispLog(string log)
        {
            dgv.Rows.Add(log);
        }
        /// <summary>
        /// 過去のコンピ指数、結果情報ファイル名を設定
        /// </summary>
        /// <param name="mode"></param>
        private void setFileData(bool mode)
        {
            fileData = (mode) ? chuoData : nankanData;
        }
        private void waitOneMiliSec()
        {
            System.Threading.Thread.Sleep(1);
            Application.DoEvents();
        }
        private void dispTextBox(string data)
        {
            this.textBox1.Text = data;
        }
        /// <summary>
        /// コンピ指数ファイルから、コンピ指数、馬番を取得
        /// </summary>
        /// <param name="tarTosu"></param>
        /// <param name="targets"></param>
        /// <param name="topIdx"></param>
        /// <returns></returns>
        private string[] getTargetValue(int tarTosu, string[] targets, int topIdx)
        {
            string[] tarVlue = new string[tarTosu];
            for (int ii = 0; ii < tarVlue.Length; ii++) tarVlue[ii] = targets[topIdx + ii];
            return tarVlue;
        }
        private int getHaraiCount(string[] values)
        {
            int haraiCnt = 0;
            for (int ii = (int)indx.HF01; ii < (int)indx.UF01; ii++)
            {
                if (values[ii] == string.Empty) return (ii - (int)indx.HF01);
            }

            return haraiCnt;//TODO:ありえない?
        }
        private string[] getHaraiArray(int haraiCnt, string[] values, int topIdx)
        {
            string[] hara = new string[haraiCnt];
            for (int ii = 0; ii < hara.Length; ii++) hara[ii] = values[(int)indx.HF01 + ii];
            return hara;
        }
        private void getPickValue(ref string[] ans, int tosu, string[] values, string[] pick, int topIdx)
        {
            string[] vlue = new string[tosu];
            for (int ii = 0; ii < vlue.Length; ii++) vlue[ii] = values[topIdx + ii];
            for (int ii = 0; ii < ans.Length; ii++) ans[ii] = vlue[int.Parse(pick[ii])];
        }
        private string[] getTargetPickValue(string[] pick, string[] tarVlue)
        {
            string[] ans = new string[pick.Length];
            for (int ii = 0; ii < pick.Length; ii++) ans[ii] = tarVlue[int.Parse(pick[ii])];
            return ans;
        }
        /// <summary>
        /// 当日コンピのコンピ指数順位、値と過去データが一致するか判定
        /// </summary>
        /// <param name="tarPickVlue"></param>
        /// <param name="pickVlue"></param>
        /// <returns></returns>
        private bool isSameValue(string[] tarPickVlue, string[] pickVlue)
        {
            for (int ii = 0; ii < tarPickVlue.Length; ii++) if (tarPickVlue[ii] != pickVlue[ii]) return false;
            return true;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="hara"></param>
        /// <param name="umaw"></param>
        /// <param name="pickUmab"></param>
        private void calcResult(string[] hara, string[] umaw, string pickUmab)
        {
            resultRaceCnt++;
            for (int ii = 0; ii < umaw.Length; ii++)// hit check
            {
                if (umaw[ii] == pickUmab)
                {
                    resultHitCnt++;// 入賞していた
                    resultRetMny += long.Parse(hara[ii]);
                    break;
                }
            }
        }
        /// <summary>
        /// yyyy,mmdd,jj,rr,umaban,pattern,selectRnk,resultRaceCnt,hit,resultMoney,hitRatio,retRatio
        /// </summary>
        /// <param name="pp"></param>
        /// <param name="selectRnk"></param>
        /// <returns></returns>
        private string calcSumResult(long pp, int selectRnk)
        {
            string test = String.Empty;
            float hitRatio = (float)resultHitCnt / (float)resultRaceCnt;
            float retRatio = (float)resultRetMny / ((float)resultRaceCnt * 100);
            // TODO:該当数(targetCnt)、的中率、回収率は、パラメータにすること
            bool isBet = this.isBetCondition(new int[] { configTargetCnt, resultRaceCnt }, new float[] { configHitRatio, hitRatio }, new float[] { configHitRatio, retRatio });
            //if (hitRatio >= 1) System.Diagnostics.Debug.WriteLine(Utility.CombinStrings(new string[] { "pat:", pp.ToString(), ", rnk:", selectRnk.ToString(), ", cnt:", resultRaceCnt.ToString(), ", hit:", hitRatio.ToString(), ", ret:", retRatio.ToString() }));
            //System.Diagnostics.Debug.WriteLine(Utility.CombinStrings(new string[] { "pat:", pp.ToString(), ", rnk:", selectRnk.ToString(), ", cnt:", resultRaceCnt.ToString(), ", hit:", hitRatio.ToString(), ", ret:", retRatio.ToString() }));
            //System.Diagnostics.Debug.WriteLine(Utility.CombinStrings(new string[] { "cnt:", resultRaceCnt.ToString(), ", hit:", hitRatio.ToString(), ", ret:", retRatio.ToString() }));
            //if (isBet) test = Utility.CombinStrings(new string[] { "umaban:", resultUmaban, ", pattern:", pp.ToString(), ", select:", selectRnk.ToString(), ", count:", resultRaceCnt.ToString(), ", hit:", resultHitCnt.ToString(), ", money:", resultRetMny.ToString(), ", hitRatio:", hitRatio.ToString(), ", retRatio:", retRatio.ToString() });
            test = Utility.CombinStrings(new string[] { targ.targets[(int)ConstValue.indx.Year], ",", targ.targets[(int)ConstValue.indx.Monthday], ",", targ.targets[(int)ConstValue.indx.jyocd], ",", targ.targets[(int)ConstValue.indx.RaceNum], ",", resultUmaban, ",", pp.ToString(), ",", selectRnk.ToString(), ",", resultRaceCnt.ToString(), ",", resultHitCnt.ToString(), ",", resultRetMny.ToString(), ",", hitRatio.ToString(), ",", retRatio.ToString() });
            return test;
        }

        private bool isBetCondition(int[] raceCount,float[] hitRatio, float[] returnRatio)
        {
            if (raceCount[0] <= raceCount[1]) return false;
            if (hitRatio[0] < hitRatio[1]) return false;
            if (returnRatio[0] < returnRatio[1]) return false;
            return true;
        }
        /// <summary>
        /// 当日コンピ指数、パターンファイル、UMA_CMPI.txtを読込み
        /// </summary>
        /// <param name="mode"></param>
        private void setInitialExecuteJob()
        {
            this.getTargetDataNew();
            this.getPatDataNew();
            this.getSrcDataNew();
        }
        /// <summary>
        /// 
        /// </summary>
        private void executeJobNew()
        {
            //long lp1cur = 0;
            //long lp1max = tar.Length;
            string[] ans = new string[360000];
            int cnt = 0;
            foreach (string targetData in tar)
            {
                // 指定頭数以外はスキップ(とりあえず、元データを抽出することで対応)

                // 以下が、1レース分なので、スレッド化する(とりあえず、レース数、EXEを起動して対応)

                //System.Diagnostics.Debug.WriteLine("targetData"); 
                System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString() + " / " + targetData);
                this.targ = new targetRace(targetData);// this.dispTextBox(tarIdx.ToString()); this.waitOneMiliSec();
                int beforePickArrCnt = 0;       // 1頭パターンと2頭パターンの境界を検出するため
                bool isExistSameCompi = false;  // Lengthが1のもので、該当がなければ、レース自体が対象外とする
                //long lp2cur = 0;
                //long lp2max = this.getPatArr();
                for (long pp = 0; pp < this.getPatArr(); pp++)   //②パターン数分 コンピ指数1位~n位の全抽出パターン
                {
                    //System.Diagnostics.Debug.WriteLine("pp"); System.Diagnostics.Debug.WriteLine(pp.ToString());
                    string[] pick = this.pickPat(pp);      // pickupするランク A:0, B:1, ..., null
                    //long lp3cur = 0;
                    //long lp3max = pick.Length;
                    // TODO:pick.Lengthが1のもので、該当がなければ、レース自体が対象外とする
                    if (beforePickArrCnt == 1 && pick.Length == 2 && !isExistSameCompi) break;
                    beforePickArrCnt = pick.Length;
                    bool isSame = false;
                    for (int selectRnk = 0; selectRnk < pick.Length; selectRnk++)// ③pickがABCならA、B、Cを順番に評価
                    {
                        //System.Diagnostics.Debug.WriteLine("selectRnk");System.Diagnostics.Debug.WriteLine(selectRnk.ToString());
                        // ④過去のコンピ指数情報、結果
                        initialResult();
                        //long lp4cur = 0;
                        //long lp4max = src.Length;
                        for (int srcIdx = 0; srcIdx < src.Length; srcIdx++)
                        {
                            //if (srcIdx == 577) System.Diagnostics.Debug.WriteLine("debug"); // debug
                            if (this.isSameValue(pick, src[srcIdx], selectRnk)) isSame = true;
                            //lp4cur++;
                            //string aaa = lp1cur + " / " + lp1max + " - " + lp2cur + " / " + lp2max + " - " + lp3cur + " / " + lp3max + " - " + lp4cur + " / " + lp4max;
                            //this.Text = aaa;
                            //this.Refresh();
                        }

                        //lp3cur++;
                        //string aaa = lp1cur + " / " + lp1max + " - " + lp2cur + " / " + lp2max + " - " + lp3cur + " / " + lp3max;
                        //this.Text = aaa;
                        //this.Refresh();

                        if (!isSame) break; // ひとつも該当しなかった
                        isExistSameCompi = true;
                        if (resultRaceCnt > 0)
                        {
                            //this.dispLog(this.calcSumResult(pp, selectRnk));
                            ans[cnt] = this.calcSumResult(pp, selectRnk);
                            cnt++;
                        }
                        this.waitOneMiliSec();
                    }

                    //lp2cur++;
                }

                //lp1cur++;
            }

            Array.Resize(ref ans, cnt);
            File.WriteAllLines(@"c:\work\okba.txt", ans);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="targetData">1レース分のコンピ指数</param>
        private void analOneRace(string targetData)
        {
            string[] ans = new string[360000];
            int cnt = 0;
            // TODO:this.targは、ローカル変数にする?
            this.targ = new targetRace(targetData);// this.dispTextBox(tarIdx.ToString()); this.waitOneMiliSec();
            int beforePickArrCnt = 0;       // 1頭パターンと2頭パターンの境界を検出するため
            bool isExistSameCompi = false;  // Lengthが1のもので、該当がなければ、レース自体が対象外とする
            for (long pp = 0; pp < this.getPatArr(this.targ.tarTosu); pp++)   //②パターン数分 コンピ指数1位~n位の全抽出パターン
            {
                string[] pick = this.pickPat(pp);      // pickupするランク A:0, B:1, ..., null
                if (beforePickArrCnt == 1 && pick.Length == 2 && !isExistSameCompi) break;
                beforePickArrCnt = pick.Length;
                for (int selectRnk = 0; selectRnk < pick.Length; selectRnk++)// ③pickがABCならA、B、Cを順番に評価
                {
                    // ④過去のコンピ指数情報、結果
                    initialResult();
                    if (!isExistCompiPattern(pick, selectRnk)) break;
                    isExistSameCompi = true;
                    if (resultRaceCnt > 0)
                    {
                        ans[cnt] = this.calcSumResult(pp, selectRnk);
                        cnt++;
                    }
                    this.waitOneMiliSec();
                }
            }
        }

        private bool isExistCompiPattern(string[] pick, int selectRnk)
        {
            for (int srcIdx = 0; srcIdx < src.Length; srcIdx++)
            {
                if (this.isSameValue(pick, src[srcIdx], selectRnk)) return true;
            }

            return false;
        }

        private void initialResult()
        {
            resultUmaban = string.Empty;
            resultRaceCnt = 0;
            resultHitCnt = 0;
            resultRetMny = 0;
        }

        private bool isSameValue(string[] pick, string src, int selectRnk)
        {
            PastData past = new PastData(pick, src, this.targ.tarTosu);
            if (!past.isMatch) return false;
            resultUmaban = past.PickUmab[selectRnk];
            this.targ.GetTargetPickValue(pick);
            bool sameFlg = this.isSameValue(this.targ.tarPickVlue, past.PickVlue);// targetと同じコンピ値?
            if (!sameFlg) return false;
            this.calcResult(past.Hara, past.Umaw, past.PickUmab[selectRnk]);
            return true;
        }
        private bool isSameValue(string[] pick, string src, int selectRnk, targetRace targ)
        {
            PastData past = new PastData(pick, src, targ.tarTosu);
            if (!past.isMatch) return false;
            resultUmaban = past.PickUmab[selectRnk];
            targ.GetTargetPickValue(pick);
            bool sameFlg = this.isSameValue(targ.tarPickVlue, past.PickVlue);// targetと同じコンピ値?
            if (!sameFlg) return false;
            this.calcResult(past.Hara, past.Umaw, past.PickUmab[selectRnk]);
            return true;
        }
        /// <summary>
        /// 過去情報のデータ数が異常、払い戻し情報がない、頭数が異なる、のいずれかが該当すれば、評価対象としない
        /// </summary>
        /// <param name="srcValue"></param>
        /// <param name="tosu"></param>
        /// <param name="tarTosu"></param>
        /// <returns></returns>
        private bool judgeUnMatchAnal(string[] srcValue, int tosu, int tarTosu)
        {
            if (srcValue.Length != (int)(indx.TorokuTosu + 1)) return false;// data数check
            if (srcValue[(int)indx.HF01] == "") return false;// 払い戻しデータ存在check
            if ((tosu != tarTosu)) return false;// 頭数チェック
            return true;
        }

        private void executeJob()
        {
            if (radioButton1.Checked)
            {
                fileData = chuoData;
            }
            else
            {
                fileData = nankanData;
            }

            string log = Utility.CombinStrings(new string[] { "start :", DateTime.Now.ToString() });
            dgv.Rows.Add(log);
            //dgv.Refresh();
            System.Threading.Thread.Sleep(1);
            Application.DoEvents();

            // pattern data load
            getTargetData();    // target.txt
            getPatData();       // patXX.txt
            getSrcData();       // UMA_CMPI.txt

            for (int tartar = 0; tartar < tar.Length; tartar++)
            {
                this.textBox1.Text = tartar.ToString();
                System.Threading.Thread.Sleep(1);
                Application.DoEvents();

                // target ファイル読み込みに変更予定
                string target;// = textBox1.Text;// "2022,0213,05,,,01,71,70,69,65,57,54,53,52,49,48,47,46,43,42,41,40,,,10,04,11,15,16,12,14,02,08,05,03,13,06,07,01,09,,,,,,,,,,,,,,,16";     // 対象レースのデータ
                target = tar[tartar];
                string[] targets = target.Split(',');
                int tarTosu = int.Parse(targets[(int)indx.TorokuTosu]);

                log = Utility.CombinStrings(new string[] { "Year:", targets[(int)indx.Year], ", Monthday:", targets[(int)indx.Monthday], ", jyocd:", targets[(int)indx.jyocd], ", RaceNum:", targets[(int)indx.RaceNum] });
                this.dispLog(log);
                System.Threading.Thread.Sleep(1);
                Application.DoEvents();


                string[] tarVlue;
                string[] tarUmab;

                tarVlue = new string[tarTosu];
                for (int ii = 0; ii < tarVlue.Length; ii++)
                {
                    tarVlue[ii] = targets[(int)indx.C01 + ii];
                }

                tarUmab = new string[tarTosu];
                for (int ii = 0; ii < tarUmab.Length; ii++)
                {
                    tarUmab[ii] = targets[(int)indx.U01 + ii];
                }

                // pat18から今回の頭数用パターンデータを生成する

                // ①pattern loop
                //for (long pp = 0; pp < getPatArr(tarTosu); pp++)
                //{
                //    string[] pick = pickPat(tarTosu, pp);      // pickupするランク A:0, B:1, ..., null
                //    Array.Resize(ref pick, pick.Length - 1);
                //    string[] pickVlue = new string[pick.Length];
                //    string[] pickUmab = new string[pickVlue.Length];

                //    int tosu;
                //    string[] vlue;
                //    string[] umab;
                //    string[] hara;
                //    string[] umaw;

                //    int raceCnt = 0;
                //    int hitCnt = 0;
                //    long retMny = 0;

                //    // ②pickupしたランクから、ひとつのランクを選択 loop
                //    for (int selectRnk = 0; selectRnk < pick.Length; selectRnk++)
                //    {
                //        // ③src data loop
                //        for (int srcIdx = 00; srcIdx < src.Length; srcIdx++)
                //        {
                //            StringBuilder sb = new StringBuilder("");
                //            // カンマで分割
                //            var values = src[srcIdx].Split(',');
                //            // data数check
                //            if (values.Length != (int)(indx.TorokuTosu + 1))
                //            {
                //                continue;   // throw new Exception("CSV format error");
                //            }

                //            // 払い戻しデータ存在check
                //            if (values[(int)indx.HF01] == "")
                //            {
                //                continue;   //myDic[key]=value;
                //            }

                //            // 頭数
                //            tosu = int.Parse(values[(int)indx.TorokuTosu]);

                //            if ((tosu != tarTosu))
                //            {
                //                continue;
                //            }

                //            // main base data
                //            vlue = new string[tosu];
                //            for (int ii = 0; ii < vlue.Length; ii++)
                //            {
                //                vlue[ii] = values[(int)indx.C01 + ii];
                //            }

                //            umab = new string[tosu];
                //            for (int ii = 0; ii < umab.Length; ii++)
                //            {
                //                umab[ii] = values[(int)indx.U01 + ii];
                //            }

                //            int haraiCnt = 0;
                //            for (int ii = (int)indx.HF01; ii < (int)indx.UF01; ii++)
                //            {
                //                if (values[ii] == "")
                //                {
                //                    haraiCnt = ii - (int)indx.HF01;
                //                    break;
                //                }
                //            }

                //            hara = new string[haraiCnt];
                //            for (int ii = 0; ii < hara.Length; ii++)
                //            {
                //                hara[ii] = values[(int)indx.HF01 + ii];
                //            }

                //            umaw = new string[haraiCnt];
                //            for (int ii = 0; ii < umaw.Length; ii++)
                //            {
                //                umaw[ii] = values[(int)indx.UF01 + ii];
                //            }

                //            for (int ii = 0; ii < pickVlue.Length; ii++)
                //            {
                //                pickVlue[ii] = vlue[int.Parse(pick[ii])];
                //            }
                //            for (int ii = 0; ii < pickVlue.Length; ii++)
                //            {
                //                pickUmab[ii] = umab[int.Parse(pick[ii])];
                //            }

                //            // target pick
                //            string[] tarPickVlue = new string[pick.Length];
                //            for (int ii = 0; ii < tarPickVlue.Length; ii++)
                //            {
                //                tarPickVlue[ii] = tarVlue[int.Parse(pick[ii])];
                //            }

                //            // targetと同じコンピ値?
                //            bool sameFlg = true;
                //            for (int ii = 0; ii < tarPickVlue.Length; ii++)
                //            {
                //                if (tarPickVlue[ii] != pickVlue[ii])
                //                {
                //                    // ひとつでも異なれば対象外データ
                //                    sameFlg = false;
                //                    break;
                //                }
                //            }

                //            if (sameFlg)
                //            {
                //                // count, hitCount, money
                //                raceCnt++;
                //                // hit check
                //                for (int ii = 0; ii < umaw.Length; ii++)
                //                {
                //                    if (umaw[ii] == pickUmab[selectRnk])
                //                    {
                //                        // 入賞していた
                //                        hitCnt++;
                //                        retMny = retMny + long.Parse(hara[ii]);
                //                        break;
                //                    }
                //                }
                //            }

                //            //// output result
                //            //StringBuilder res = new StringBuilder("");
                //            //res.Append("pattern:");
                //            //res.Append(pp.ToString());
                //            //res.Append(", select:");
                //            //res.Append(selectRnk.ToString());
                //            //res.Append(", src:");
                //            //res.Append(srcIdx.ToString());
                //            //res.Append(", count:");
                //            //res.Append(raceCnt.ToString());
                //            //res.Append(", hit:");
                //            //res.Append(hitCnt.ToString());
                //            //res.Append(", money:");
                //            //res.Append(retMny.ToString());
                //            //string test = res.ToString();
                //            //System.Diagnostics.Debug.WriteLine(test);

                //        }

                //        if (raceCnt > 0)
                //        {
                //            float hitRatio = (float)hitCnt / (float)raceCnt;
                //            float retRatio = (float)retMny / ((float)raceCnt * 100);

                //            if ((raceCnt > 10) && (hitRatio >= 0.2) && (retRatio >= 1.2))
                //            {
                //                // pattern result
                //                StringBuilder res = new StringBuilder("");
                //                res.Append("umaban:");
                //                res.Append(pickUmab[selectRnk].ToString());
                //                res.Append(" ,pattern:");
                //                res.Append(pp.ToString());
                //                res.Append(", select:");
                //                res.Append(selectRnk.ToString());
                //                res.Append(", count:");
                //                res.Append(raceCnt.ToString());
                //                res.Append(", hit:");
                //                res.Append(hitCnt.ToString());
                //                res.Append(", money:");
                //                res.Append(retMny.ToString());
                //                res.Append(", hitRatio:");
                //                res.Append(hitRatio.ToString());
                //                res.Append(", retRatio:");
                //                res.Append(retRatio.ToString());
                //                string test = res.ToString();
                //                //System.Diagnostics.Debug.WriteLine(test);

                //                dgv.Rows.Add(test);
                //                System.Threading.Thread.Sleep(1);
                //                Application.DoEvents();
                //                //dgv.Refresh();
                //                //this.Refresh();
                //            }
                //        }
                //    }
                //}

                log = Utility.CombinStrings(new string[] { "end :", DateTime.Now.ToString() });
                this.dispLog(log);
            }
        }
        /// <summary>
        /// Let's analボタン押下
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString());
            button2.Enabled = false;
            this.executeJobX();
            System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString());
            Utility.mailSend("end", "okba");
            button2.Enabled = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dgv.ColumnCount = 1;
            dgv.Columns[0].Width = 1000;

        }

        private void button3_Click(object sender, EventArgs e)
        {
            button3.Enabled = false;
            this.setFileData(radioButton1.Checked);
            this.getSrcDataNew();
            long racecount = 0;
            long harai = 0;
            long kati = 0;
            int torokusu = 12;
            int rank = int.Parse(textBox2.Text);
            int umabanOffset = (int)indx.U01 - 1;
            int conpiOffset = (int)indx.C01 - 1;
            int umabanIndex = umabanOffset + rank;
            int conpiIndex = conpiOffset + rank;
            long haraiOne;
            string raceOne;
            int debugCnt;
            double[] px = new double[src.Length];
            double[] py = new double[src.Length];
            for (int srcIdx = 0; srcIdx < src.Length; srcIdx++)
            {
                string[] arr = src[srcIdx].Split(',');
                if ((int.Parse(arr[(int)indx.TorokuTosu]) >= torokusu) && (arr[(int)indx.HF01] != "") && (arr[umabanIndex] != ""))
                {
                    racecount++;
                    px[racecount] = (double)racecount;
                    raceOne = arr[(int)indx.Year] + "," + arr[(int)indx.Monthday] + "," + arr[(int)indx.jyocd] + "," + arr[(int)indx.RaceNum] + ",";
                    haraiOne = 0;
                    debugCnt = 0;
                    for (int lp = 0; lp < 5; lp++)
                    {
                        if (arr[umabanIndex] == arr[(int)indx.UF01 + lp])
                        {
                            debugCnt++;
                            if (debugCnt > 1)
                            {
                                this.dispLog("xxx," + raceOne);
                            }
                            kati++;
                            haraiOne = int.Parse(arr[(int)indx.HF01 + lp]);
                            harai += haraiOne;
                        }
                    }

                    py[racecount] = ((double)harai / (double)racecount);
                    //this.dispLog(px[racecount].ToString() + " , " + py[racecount].ToString());
                    this.dispLog(raceOne + haraiOne.ToString());
                }
            }

            float hit = (((float)kati / (float)racecount) * 100);
            float ret = (((float)harai / ((float)racecount * 100)) * 100);
            this.dispLog("条件:出走頭数" + torokusu.ToString() + "以上、コンピ指数" + rank.ToString() + "位");
            this.dispLog("race:" + racecount.ToString());
            this.dispLog("win :" + kati.ToString());
            this.dispLog("ret :" + harai.ToString());
            this.dispLog("的中率:" + hit.ToString());
            this.dispLog("回収率:" + ret.ToString());

            // グラフにタイトルを付けます
            formsPlot1.plt.Title("こんぴ君");

            // X軸, Y軸に名前を付けます
            // fontNameでフォントを指定することができます。

            formsPlot1.plt.XLabel("時間", fontName: "MS ゴシック");
            formsPlot1.plt.YLabel("値");

            Array.Resize(ref px, (int)racecount);
            Array.Resize(ref py, (int)racecount);
            // 散布図としてデータをセットします。凡例もあわせて設定します。
            formsPlot1.plt.PlotScatter(px, py, label: "コンピ回収率");

            // Legend(凡例)の表示を指定します(指定しないと表示されません)
            formsPlot1.plt.Legend();

            // ScottPlotのコントロールに描画(表示)します。
            formsPlot1.Render();

            button3.Enabled = true;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            dgv.Rows.Clear();
            // グラフデータにあわせて描画内容を調整します(最初に戻す)
            // 引数でX軸・Y軸の余白(マージン)を調整することもできます。
            formsPlot1.plt.AxisAuto();

            // ScottPlotのコントロールに再描画します。
            formsPlot1.Render();
        }

        private void tabPage1_Click(object sender, EventArgs e)
        {

        }

        private void button5_Click(object sender, EventArgs e)
        {
            Utility.mailSend("test", "tensai");
        }
        /// <summary>
        /// マルチスレッド対応
        /// </summary>
        private void executeJobMulti()
        {
            string[] ans = new string[360000];
            int cnt = 0;
            foreach (string targetData in tar)
            {
                System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString() + " / " + targetData);
                this.targ = new targetRace(targetData);// this.dispTextBox(tarIdx.ToString()); this.waitOneMiliSec();
                int beforePickArrCnt = 0;       // 1頭パターンと2頭パターンの境界を検出するため
                bool isExistSameCompi = false;  // Lengthが1のもので、該当がなければ、レース自体が対象外とする
                for (long pp = 0; pp < this.getPatArr(); pp++)   //②パターン数分 コンピ指数1位~n位の全抽出パターン
                {
                    string[] pick = this.pickPat(pp);      // pickupするランク A:0, B:1, ..., null
                    if (beforePickArrCnt == 1 && pick.Length == 2 && !isExistSameCompi) break;
                    beforePickArrCnt = pick.Length;
                    bool isSame = false;
                    for (int selectRnk = 0; selectRnk < pick.Length; selectRnk++)// ③pickがABCならA、B、Cを順番に評価
                    {
                        // ④過去のコンピ指数情報、結果
                        initialResult();
                        for (int srcIdx = 0; srcIdx < src.Length; srcIdx++)
                        {
                            if (this.isSameValue(pick, src[srcIdx], selectRnk)) isSame = true;
                        }

                        if (!isSame) break; // ひとつも該当しなかった
                        isExistSameCompi = true;
                        if (resultRaceCnt > 0)
                        {
                            ans[cnt] = this.calcSumResult(pp, selectRnk);
                            cnt++;
                        }
                        this.waitOneMiliSec();
                    }
                }
            }

            Array.Resize(ref ans, cnt);
            File.WriteAllLines(@"c:\work\okba.txt", ans);
        }

        private void button6_Click(object sender, EventArgs e)
        {
            button6.Enabled = false;
            addFuku();
            button6.Enabled = true;
        }
        /// <summary>
        /// 払い戻しのデータを結合して分析を容易にする
        /// yyyy,mmdd,jj,rr,umabanをキーにして、コンピ指数データ、払い戻しのデータを結合
        /// オーケー馬のデータ:okba.txt
        /// 2023,0611,05,06,18,0,0,215,37,4510,0.172093,0.2097674
        /// 0    1    2  3  4
        /// yyyy,mmdd,jj,rr,umaban
        /// 払い戻しのデータ:harai.txt
        /// 2023,0611,05,,06,17,2,18,,,110,170,140,,,1305,3,4,2-17-18,,,,,1100,,,,,17-2-18,,,,,3770,,,,,,2023,0611,05,3,4,06,86,66,65,58,57,54,52,50,49,48,47,46,45,44,43,42,41,40,17,04,03,02,18,16,08,13,11,09,10,01,12,14,15,06,05,07,,,,,,,,,,,,,18
        /// 0    1    2  3 4 5  6 7 89 0   1   2
        /// yyyy,mmdd,jj,,rr,1 ,2,3    複勝          time k,n,sanrenpuku  harai    sanrentan   harai                         compi                                                 umaban
        ///                  着順馬番
        /// add data:複勝の払い戻し(外れはゼロ)・・・実際の回収率、的中率を算出する
        /// 着順馬番から検索をして、ヒットしてたら、払い戻しを取得
        /// </summary>
        private void addFuku()
        {
            // ファイル読み込み
            // オーケー馬のデータ:okba.txt
            okba = Utility.readFile("okba.txt");
            // 払い戻しのデータ:harai.txt
            harai = Utility.readFile("harai.txt");
            string[] res = new string[okba.Length];
            int cnt = 0;
            // キー:オーケー馬のyyyy,mmdd,jj,rr:払い戻しをなめる
            for(int ii = 0; ii < okba.Length; ii++)
            {
                int idx = hitHarai(okba[ii], harai);
                if (idx != -1)
                {
                    // TODO
                    // ヒットしたら、umabanが着順馬番に存在するか判定
                    // あれば、着順に応じた複勝払い戻しを取得。なければ、ゼロ
                    string ans = getFukuHarai(okba[ii], harai[idx]);
                    res[cnt] = ans;
                    cnt++;
                }
            }

            Array.Resize(ref res, cnt);
            string filePath = "analy.txt";
            System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis");
            System.IO.File.WriteAllLines(filePath, res, enc);
        }
        /// <summary>
        /// オーケー馬のデータ:okba.txt
        /// 2023,0611,05,06,18,0,0,215,37,4510,0.172093,0.2097674
        /// 0    1    2  3  4
        /// yyyy,mmdd,jj,rr,umaban
        /// 払い戻しのデータ:harai.txt
        /// 2023,0611,05,,06,17,2,18,,,110,170,140,,,1305,3,4,2-17-18,,,,,1100,,,,,17-2-18,,,,,3770,,,,,,2023,0611,05,3,4,06,86,66,65,58,57,54,52,50,49,48,47,46,45,44,43,42,41,40,17,04,03,02,18,16,08,13,11,09,10,01,12,14,15,06,05,07,,,,,,,,,,,,,18
        /// 0    1    2  3 4 5  6 7 89 0   1   2
        /// yyyy,mmdd,jj,,rr,1 ,2,3    複勝          time k,n,sanrenpuku  harai    sanrentan   harai                         compi                                                 umaban
        ///                  着順馬番
        /// </summary>
        /// <param name="okba"></param>
        /// <param name="harai"></param>
        /// <returns></returns>
        private string getFukuHarai(string okba,string harai)
        {
            string[] arrOkba = okba.Split(',');
            string[] arrHarai = harai.Split(',');
            int umaban = int.Parse(arrOkba[4]);
            string ans = "0";
            for(int ii = 5; ii <= 9;ii++)
            {
                if (arrHarai[ii] == string.Empty) break;
                if (umaban == int.Parse(arrHarai[ii]))
                {
                    ans = arrHarai[ii + 5];
                    break;
                }
            }

            return okba + "," + ans;
        }
        private int hitHarai(string oneOkba, string[] arrHarai)
        {
            for(int ii = 0; ii < arrHarai.Length; ii++)
            {
                string str = arrHarai[ii];
                if (hitHarai(oneOkba, str)) return ii;
            }

            return -1;
        }
        /// <summary>
        /// オーケー馬のデータ:okba.txt
        /// 2023,0611,05,06,18,0,0,215,37,4510,0.172093,0.2097674
        /// yyyy,mmdd,jj,rr,umaban
        /// 0    1    2  3  4
        /// 払い戻しのデータ:harai.txt
        /// 2023,0611,05,,06,17,2,18,,,110,170,140,,,1305,3,4,2-17-18,,,,,1100,,,,,17-2-18,,,,,3770,,,,,,2023,0611,05,3,4,06,86,66,65,58,57,54,52,50,49,48,47,46,45,44,43,42,41,40,17,04,03,02,18,16,08,13,11,09,10,01,12,14,15,06,05,07,,,,,,,,,,,,,18
        /// yyyy,mmdd,jj,,rr,1 ,2,3    複勝          time k,n,sanrenpuku  harai    sanrentan   harai                         compi                                                 umaban
        /// 0    1    2  3 4 5  6 7 89 0   1   2
        /// hit check:yyyy,mmdd,jj,rr
        /// </summary>
        /// <param name="oneOkba"></param>
        /// <param name="oneHarai"></param>
        /// <returns></returns>
        private bool hitHarai(string oneOkba, string oneHarai)
        {
            string[] arrOkba = oneOkba.Split(',');
            string[] arrHarai = oneHarai.Split(',');
            if (arrOkba[0] == arrHarai[0])
            {
                if(arrOkba[1] == arrHarai[1])
                {
                    if (arrOkba[2] == arrHarai[2])
                    {
                        if (arrOkba[3] == arrHarai[4])
                        {
                            return true;
                        }
                    }
                }
            }

            return false;
        }
    }

    class Human
    {
        public string Name { get; set; }
        public string Age { get; set; }
    }

}

以下は特に記事はありません。
お金を払ってもらえると、僕が少しハッピーになります。
あと、ソースを修正したときに通知が行くはずです。

ここから先は

20字

¥ 100

この記事が気に入ったらサポートをしてみませんか?