private Dictionary <int, コメントマスター> Readコメント(MasterVersion masterVersion)
        {
            var filePath = Path.Combine(MasterRootDiretoryPath, EnumUtil.GetMasterSubDiretoryName(masterVersion), "c.csv");

            var dict = new Dictionary <int, コメントマスター>();
            Action <CsvReader> readAction = csv =>
            {
                while (csv.Read())
                {
                    var x = new コメントマスター();
                    x.区分      = csv.GetField <int>((int)MASTER_C_IDX.区分);
                    x.パターン    = csv.GetField <int>((int)MASTER_C_IDX.パターン);
                    x.一連番号    = csv.GetField <int>((int)MASTER_C_IDX.一連番号);
                    x.漢字名称    = csv.GetField <string>((int)MASTER_C_IDX.漢字名称);
                    x.カラム位置桁数 = new List <Tuple <int, int> >();

                    // 4回まである。
                    var カラム位置 = csv.GetField <int>((int)MASTER_C_IDX.カラム1位置);
                    var カラム桁数 = csv.GetField <int>((int)MASTER_C_IDX.カラム1桁数);
                    if (0 < カラム桁数)
                    {
                        x.カラム位置桁数.Add(new Tuple <int, int>(カラム位置, カラム桁数));
                    }
                    カラム位置 = csv.GetField <int>((int)MASTER_C_IDX.カラム2位置);
                    カラム桁数 = csv.GetField <int>((int)MASTER_C_IDX.カラム2桁数);
                    if (0 < カラム桁数)
                    {
                        x.カラム位置桁数.Add(new Tuple <int, int>(カラム位置, カラム桁数));
                    }
                    カラム位置 = csv.GetField <int>((int)MASTER_C_IDX.カラム3位置);
                    カラム桁数 = csv.GetField <int>((int)MASTER_C_IDX.カラム3桁数);
                    if (0 < カラム桁数)
                    {
                        x.カラム位置桁数.Add(new Tuple <int, int>(カラム位置, カラム桁数));
                    }
                    カラム位置 = csv.GetField <int>((int)MASTER_C_IDX.カラム4位置);
                    カラム桁数 = csv.GetField <int>((int)MASTER_C_IDX.カラム4桁数);
                    if (0 < カラム桁数)
                    {
                        x.カラム位置桁数.Add(new Tuple <int, int>(カラム位置, カラム桁数));
                    }

#if DEBUG
                    // 2020年以降しかコメントコード列がない。
                    if (MasterVersion.Ver202004 <= masterVersion)
                    {
                        var コメントコード = csv.GetField <int>((int)MASTER_C_IDX.コメントコード);
                        Debug.Assert(コメントコード == x.コメントコード);
                    }
#endif

                    dict.Add(x.コメントコード, x);
                }
            };

            CSVUtil.Read(filePath, readAction);
            return(dict);
        }
        /// <summary>mymenu.csvを読み込んでメニューコマンド生成</summary>
        /// <returns></returns>
        public Dictionary <string, RelayCommand> CreateMyMenuCommands()
        {
            const string MY_MENU_PATH   = @"MyMenu.csv";
            var          myMenuFullpath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, MY_MENU_PATH);

            var useMyMenu = File.Exists(myMenuFullpath);

            if (!useMyMenu)
            {
                return(null);
            }

            var dict = new Dictionary <string, RelayCommand>();
            Action <CsvReader> readAction = csv =>
            {
                while (csv.Read())
                {
                    var title = csv.GetField <string>(0);
                    var path  = csv.GetField <string>(1);
                    var args  = csv.GetField <string>(2);

                    var command = new RelayCommand(() =>
                    {
                        if (this.CurrentReceipt == null)
                        {
                            return;
                        }

                        // 文字列置き換え
                        var tmp = args.Replace("{%カルテ番号%}", this.CurrentReceipt.RE.カルテ番号);
                        tmp     = tmp.Replace("{%レセプト番号%}", this.CurrentReceipt.RE.レセプト番号.ToString());
                        tmp     = tmp.Replace("{%氏名%}", this.CurrentReceipt.RE.氏名);
                        tmp     = tmp.Replace("{%審査支払機関%}", ((int)this.IR.審査支払機関).ToString());
                        tmp     = tmp.Replace("{%請求年月%}", this.IR.請求年月.ToString());

                        try
                        {
                            Process.Start(path, tmp);
                        }
                        catch (Exception)
                        {
                            MessageBox.Show(string.Format("{0}の起動に失敗しました。", path));
                        }
                    });

                    dict.Add(title, command);
                }
                ;
            };

            CSVUtil.Read(myMenuFullpath, readAction);

            return(dict);
        }
        private Dictionary <int, string> Read修飾語(MasterVersion masterVersion)
        {
            var filePath = Path.Combine(MasterRootDiretoryPath, EnumUtil.GetMasterSubDiretoryName(masterVersion), "z.csv");

            var dict = new Dictionary <int, string>();
            Action <CsvReader> readAction = csv =>
            {
                while (csv.Read())
                {
                    var id   = csv.GetField <int>((int)MASTER_Z_IDX.修飾語コード);
                    var name = csv.GetField <string>((int)MASTER_Z_IDX.修飾語名称);
                    dict.Add(id, name);
                }
            };

            CSVUtil.Read(filePath, readAction);
            return(dict);
        }
        private List <称単位マスター> Read名称単位マスター(MasterVersion masterVersion, string fileName)
        {
            var filePath = Path.Combine(MasterRootDiretoryPath, EnumUtil.GetMasterSubDiretoryName(masterVersion), fileName);

            var list = new List <称単位マスター>();
            Action <CsvReader> readAction = csv =>
            {
                while (csv.Read())
                {
                    var id = csv.GetField <int>((int)MASTER_S_Y_T_IDX.コード);
                    var 称  = csv.GetField <string>((int)MASTER_S_Y_T_IDX.称);
                    var 単位 = csv.GetField <string>((int)MASTER_S_Y_T_IDX.単位);
                    list.Add(new  称単位マスター()
                    {
                        Id = id, 称 = 称, 単位 = 単位
                    });
                }
            };

            CSVUtil.Read(filePath, readAction);
            return(list);
        }
        private void FilterAction(string masterSubDiretoryPath, string レコード識別情報)
        {
            if (this.ReceiptListOriginal == null)
            {
                // 条件がかかっていない時は表示中レセプトのカウントをチェック
                if (this.ReceiptList.Count == 0)
                {
                    return;
                }
            }
            else
            {
                //// 条件がかかっている時は退避レセプトのカウントをチェック
                //if (this.ReceiptListOriginal.Count == 0) { return; }

                // 一旦既存条件クリア
                this.ClearFilterCommand.Execute(null);
            }

            var レコード識別名称       = string.Empty;
            var receiptIdField = 0;
            var fileName       = (string)null;

            if (レコード識別情報 == レコード識別情報定数.診療行為)
            {
                レコード識別名称       = "診療行為";
                receiptIdField = (int)SI_IY_IDX.診療行為または医薬品コード;
                fileName       = "s.csv";
            }
            else if (レコード識別情報 == レコード識別情報定数.医薬品)
            {
                レコード識別名称       = "医薬品";
                receiptIdField = (int)SI_IY_IDX.診療行為または医薬品コード;
                fileName       = "y.csv";
            }
            else if (レコード識別情報 == レコード識別情報定数.特定器材)
            {
                レコード識別名称       = "特定器材";
                receiptIdField = (int)TO_IDX.特定器材コード;
                fileName       = "t.csv";
            }
            else if (レコード識別情報 == レコード識別情報定数.コメント)
            {
                レコード識別名称 = "コメント";

                // コメントマスターファイルはここでは見ない。
                // 代わりにコメントConverterの文字列を見る。
            }
            else
            {
                Debug.Assert(false);
                return;
            }

            // 条件ダイアログ
            var window = new FilterWindow();

            window.Title         = レコード識別名称 + "条件";
            window.Label.Content = レコード識別名称 + "(前方一致)";
            var input        = (string)null;
            var dialogResult = window.ShowDialog();

            if (dialogResult.HasValue && dialogResult.Value)
            {
                input = ((FilterWindowViewModel)window.DataContext).Input;
                if (string.IsNullOrWhiteSpace(input))
                {
                    return;
                }
            }
            else
            {
                return;
            }
            var inputUpper = input.ToUpper();  // 大文字同士で比較

            // 条件合致のレセプト番号
            var dict = new Dictionary <int, int>();

            if (レコード識別情報 == レコード識別情報定数.コメント)
            {
                Action <CsvReader> readAction = csv =>
                {
                    var currentReceiptNo = -1;
                    while (csv.Read())
                    {
                        var lineDef = csv.GetField <string>(0);
                        if (lineDef == レコード識別情報定数.レセプト共通)
                        {
                            currentReceiptNo = csv.GetField <int>((int)RE_IDX.レセプト番号);
                        }
                        else if (lineDef == レコード識別情報)
                        {
                            if (dict.ContainsKey(currentReceiptNo))
                            {
                                continue;
                            }

                            var コメントコード = csv.GetField <int>((int)CO_IDX.コメントコード);
                            var 文字データ   = csv.GetField <string>((int)CO_IDX.文字データ);
                            var tmp     = コメントConverter.Instance.Convert(コメントコード, 文字データ, null);
                            if (tmp.StartsWith("※"))
                            {
                                // コメントConverterが勝手に付けている自由入力マーク「※」を消して比較
                                tmp = tmp.Substring(1);
                            }
                            // 「退 院 ~~」のようなコメントがあるので空白削除版も一応比較
                            var tmp2 = tmp.Replace(" ", "");

                            if (tmp.StartsWith(inputUpper))
                            {
                                dict.Add(currentReceiptNo, currentReceiptNo);
                            }
                            else if (tmp2.StartsWith(inputUpper))
                            {
                                dict.Add(currentReceiptNo, currentReceiptNo);
                            }
                        }
                    }
                };
                CSVUtil.Read(ReceiptFilePath, readAction);
            }
            else  // レコード識別情報 in 診療行為, 医薬品, 特定器材
            {
                var masterFilePath = Path.Combine(MasterRootDiretoryPath, masterSubDiretoryPath, fileName);
                var masterIds      = new Dictionary <int, int>();

                // 対象マスターを探す。
                Action <CsvReader> sReadAction = csv =>
                {
                    while (csv.Read())
                    {
                        var id   = csv.GetField <int>((int)MASTER_S_Y_T_IDX.コード);
                        var name = csv.GetField <string>((int)MASTER_S_Y_T_IDX.称).ToUpper();
                        if (name.StartsWith(inputUpper))
                        {
                            masterIds.Add(id, id);
                        }
                    }
                };
                CSVUtil.Read(masterFilePath, sReadAction);
                if (masterIds.Count == 0)
                {
                    MessageBox.Show("「" + input + "」から始まる" + レコード識別名称 + "マスターがありません。");
                    return;
                }

                Action <CsvReader> readAction = csv =>
                {
                    var currentReceiptNo = -1;
                    while (csv.Read())
                    {
                        var lineDef = csv.GetField <string>(0);
                        if (lineDef == レコード識別情報定数.レセプト共通)
                        {
                            currentReceiptNo = csv.GetField <int>((int)RE_IDX.レセプト番号);
                        }
                        else if (lineDef == レコード識別情報)
                        {
                            if (dict.ContainsKey(currentReceiptNo))
                            {
                                continue;
                            }

                            var id = csv.GetField <int>(receiptIdField);
                            if (masterIds.ContainsKey(id))
                            {
                                dict.Add(currentReceiptNo, currentReceiptNo);
                            }
                        }
                    }
                };
                CSVUtil.Read(ReceiptFilePath, readAction);
            }

            // オリジナル保存
            this.ReceiptListOriginal = new List <Receipt>(this.ReceiptList);

            // 条件一致のみ再追加
            this.ReceiptList.Clear();
            foreach (var patient in this.ReceiptListOriginal)
            {
                if (dict.ContainsKey(patient.RE.レセプト番号))
                {
                    this.ReceiptList.Add(patient);
                }
            }

            SelectFirstReceipt();
        }
        private void Read(string filePath)
        {
            // SIIYTO行内のコメント1~3
            Action <CsvReader, int, int, SIIYTO> readコメント = (csv, コメントコード1, コメントコード3, target) =>
            {
                for (int i = コメントコード1; i <= コメントコード3; i = i + 2)  // コメントコード、文字データ、コメントコード・・・となるので+2で進む。
                {
                    var tmp = csv.GetField <int?>(i);
                    if (tmp.HasValue)
                    {
                        if (target.コメントList == null)
                        {
                            target.コメントList = new List <SIIYTO.コメント>();
                        }
                        target.コメントList.Add(new SIIYTO.コメント()
                        {
                            コメントコード = tmp.Value,
                            文字データ   = csv.GetField <string>(i + 1),
                        });
                    }
                    else
                    {
                        break;  // なければコメント3まで待たずに終わる。
                    }
                }
            };

            // 01~31日の情報
            Action <CsvReader, int, int, SIIYTO> readXX日の情報 = (csv, X01日, X31日, target) =>
            {
                for (int i = X01日; i <= X31日; i++)
                {
                    var tmp = csv.GetField <int?>(i);
                    if (tmp.HasValue)
                    {
                        if (target.XX日の情報 == null)
                        {
                            target.XX日の情報 = new Dictionary <int, int>();
                        }
                        var dateIdx = i - X01日;
                        target.XX日の情報.Add(dateIdx, tmp.Value);
                    }
                }
            };

            Action <CsvReader> readAction = csv =>
            {
                var receipt = (Receipt)null;

                Action add = () =>
                {
                    // 公費の件数調整
                    while (Define.公費最大件数 < receipt.KOList.Count)
                    {
                        Debug.Assert(false, string.Format("レセプトの仕様上、公費は最大{0}件までです。", Define.公費最大件数));
                        receipt.KOList.RemoveAt(receipt.KOList.Count - 1);
                    }
                    while (receipt.KOList.Count < Define.公費最大件数)
                    {
                        // KOListをindex指定でバインドしているため、空データ入れた方が都合が良い。
                        receipt.KOList.Add(null);
                    }

                    this.ReceiptList.Add(receipt);
                    receipt = null;
                };

                while (csv.Read())
                {
                    var lineDef = csv.GetField <string>(0);
                    if (lineDef == レコード識別情報定数.医療機関情報)
                    {
                        this.IR.審査支払機関      = (審査支払機関)csv.GetField <int>((int)IR_IDX.審査支払機関);
                        this.IR.都道府県        = csv.GetField <int>((int)IR_IDX.都道府県);
                        this.IR.点数表         = csv.GetField <int>((int)IR_IDX.点数表);
                        this.IR.医療機関コード     = csv.GetField <int>((int)IR_IDX.医療機関コード);
                        this.IR.予備          = csv.GetField <int?>((int)IR_IDX.予備);
                        this.IR.医療機関名称      = csv.GetField <string>((int)IR_IDX.医療機関名称);
                        this.IR.請求年月        = csv.GetField <int>((int)IR_IDX.請求年月);
                        this.IR.マルチボリューム識別子 = csv.GetField <int>((int)IR_IDX.マルチボリューム識別子);
                        this.IR.電話番号        = csv.GetField <string>((int)IR_IDX.電話番号);
                        this.IR.医療機関名称      = csv.GetField <string>((int)IR_IDX.医療機関名称);
                    }
                    else if (lineDef == レコード識別情報定数.診療報酬請求書)
                    {
                        this.GO.総件数         = csv.GetField <int>((int)GO_IDX.総件数);
                        this.GO.総合計点数       = csv.GetField <int>((int)GO_IDX.総合計点数);
                        this.GO.マルチボリューム識別子 = csv.GetField <int>((int)GO_IDX.マルチボリューム識別子);
                    }
                    else if (lineDef == レコード識別情報定数.レセプト共通)
                    {
                        if (receipt != null)
                        {
                            add();  // 前の患者を追加する。
                        }

                        var re = new RE()
                        {
                            レセプト番号 = csv.GetField <int>((int)RE_IDX.レセプト番号),
                            レセプト種別 = csv.GetField <int>((int)RE_IDX.レセプト種別),
                            診療年月   = csv.GetField <int>((int)RE_IDX.診療年月),
                            氏名     = csv.GetField <string>((int)RE_IDX.氏名),
                            男女区分   = (男女区分)csv.GetField <int>((int)RE_IDX.男女区分),
                            生年月日   = csv.GetField <int>((int)RE_IDX.生年月日),
                            カルテ番号  = csv.GetField <string>((int)RE_IDX.カルテ番号等),
                        };
                        if (csv.TryGetField <int>((int)RE_IDX.入院年月日, out int tmp入院年月日))
                        {
                            // 入院レセプトのみ
                            re.入院年月日 = tmp入院年月日;
                        }
                        if (csv.TryGetField <string>((int)RE_IDX.カタカナ, out string tmpカタカナ))
                        {
                            // H30年4月以降
                            re.カタカナ = tmpカタカナ;
                        }
                        if (csv.TryGetField <string>((int)RE_IDX.患者の状態, out string tmp患者の状態))
                        {
                            // H30年4月以降
                            re.患者の状態 = tmp患者の状態;
                        }

                        // 1件でも数値変換不可能なカルテ番号が来たらIsNumberOnlyカルテ番号をfalseに。
                        if (IsNumberOnlyカルテ番号 && Int32.TryParse(re.カルテ番号, out int _) == false)
                        {
                            IsNumberOnlyカルテ番号 = false;
                        }

                        receipt = new Receipt()
                        {
                            KOList       = new List <KO>(),
                            SIIYTOCOList = new List <SIIYTOCO>(),
                            SYList       = new List <SY>(),
                        };
                        receipt.RE = re;
                    }
                    else if (lineDef == レコード識別情報定数.保険者)
                    {
                        var ho = new HO()
                        {
                            保険者番号   = csv.GetField <int>((int)HO_IDX.保険者番号),
                            被保険者証記号 = csv.GetField <string>((int)HO_IDX.被保険者証記号),
                            被保険者証番号 = csv.GetField <string>((int)HO_IDX.被保険者証番号),
                            診療実日数   = csv.GetField <int>((int)HO_IDX.診療実日数),
                            合計点数    = csv.GetField <int>((int)HO_IDX.合計点数),
                            予備      = csv.GetField <int?>((int)HO_IDX.予備),
                            回数      = csv.GetField <int?>((int)HO_IDX.回数),
                            //合計金額 = csv.GetField<int?>((int)HO_IDX.合計金額),
                            職務上の事由 = csv.GetField <int?>((int)HO_IDX.職務上の事由),
                            証明証番号  = csv.GetField <int?>((int)HO_IDX.証明証番号),
                            医療保険   = csv.GetField <int?>((int)HO_IDX.医療保険),
                            減免区分   = csv.GetField <int?>((int)HO_IDX.減免区分),
                            減額割合   = csv.GetField <int?>((int)HO_IDX.減額割合),
                            減額金額   = csv.GetField <int?>((int)HO_IDX.減額金額),
                        };
                        if (receipt != null && receipt.RE != null)
                        {
                            receipt.HO = ho;
                        }
                        else
                        {
                            Debug.Assert(false, "保険者レコードの順番が不正です。");
                        }
                    }
                    else if (lineDef == レコード識別情報定数.公費)
                    {
                        var ko = new KO()
                        {
                            負担者番号   = csv.GetField <string>((int)KO_IDX.負担者番号),
                            受給者番号   = csv.GetField <int?>((int)KO_IDX.受給者番号),
                            任意給付区分  = csv.GetField <int?>((int)KO_IDX.任意給付区分),
                            診療実日数   = csv.GetField <int>((int)KO_IDX.診療実日数),
                            合計点数    = csv.GetField <int>((int)KO_IDX.合計点数),
                            公費      = csv.GetField <int?>((int)KO_IDX.公費),
                            外来一部負担金 = csv.GetField <int?>((int)KO_IDX.外来一部負担金),
                            入院一部負担金 = csv.GetField <int?>((int)KO_IDX.入院一部負担金),
                            予備      = csv.GetField <int?>((int)KO_IDX.予備),
                            回数      = csv.GetField <int?>((int)KO_IDX.回数),
                            合計金額    = csv.GetField <int?>((int)KO_IDX.合計金額),
                        };
                        if (receipt != null && receipt.RE != null)
                        {
                            receipt.KOList.Add(ko);
                        }
                        else
                        {
                            Debug.Assert(false, "公費レコードの順番が不正です。");
                        }
                    }
                    else if (lineDef == レコード識別情報定数.資格確認)
                    {
                    }
                    else if (lineDef == レコード識別情報定数.受診日)
                    {
                    }
                    else if (lineDef == レコード識別情報定数.窓口負担額)
                    {
                    }
                    else if (lineDef == レコード識別情報定数.包括評価対象外理由)
                    {
                    }
                    else if (lineDef == レコード識別情報定数.傷病名)
                    {
                        var sy = new SY()
                        {
                            傷病名コード = csv.GetField <int>((int)SY_IDX.傷病名コード),
                            診療開始日  = csv.GetField <int>((int)SY_IDX.診療開始日),
                            転帰区分   = (転帰区分)csv.GetField <int>((int)SY_IDX.転帰区分),
                            修飾語コード = csv.GetField <string>((int)SY_IDX.修飾語コード),
                            傷病名称   = csv.GetField <string>((int)SY_IDX.傷病名称),
                            主傷病    = csv.GetField <string>((int)SY_IDX.主傷病),
                            補足コメント = csv.GetField <string>((int)SY_IDX.補足コメント),
                        };
                        receipt.SYList.Add(sy);
                    }
                    else if (lineDef == レコード識別情報定数.診療行為 || lineDef == レコード識別情報定数.医薬品)
                    {
                        SIIYTO siiyto;
                        if (lineDef == レコード識別情報定数.診療行為)
                        {
                            siiyto = new SI();
                        }
                        else if (lineDef == レコード識別情報定数.医薬品)
                        {
                            siiyto = new IY();
                        }
                        else
                        {
                            throw new NotImplementedException();
                        }

                        siiyto.診療識別 = csv.GetField <int?>((int)SI_IY_IDX.診療識別);
                        siiyto.負担区分 = csv.GetField <string>((int)SI_IY_IDX.負担区分);
                        siiyto.コード  = (int)csv.GetField <int>((int)SI_IY_IDX.診療行為または医薬品コード);
                        siiyto.数量   = csv.GetField <float?>((int)SI_IY_IDX.数量);
                        siiyto.点数   = csv.GetField <int?>((int)SI_IY_IDX.点数);
                        siiyto.回数   = csv.GetField <int>((int)SI_IY_IDX.回数);
                        readコメント(csv, (int)SI_IY_IDX.コメント1_コメントコード, (int)SI_IY_IDX.コメント3_コメントコード, siiyto);
                        readXX日の情報(csv, (int)SI_IY_IDX.X01日の情報, (int)SI_IY_IDX.X31日の情報, siiyto);
                        receipt.SIIYTOCOList.Add(siiyto);
                    }
                    else if (lineDef == レコード識別情報定数.特定器材)
                    {
                        var to = new TO();
                        to.診療識別    = csv.GetField <int?>((int)TO_IDX.診療識別);
                        to.負担区分    = csv.GetField <string>((int)TO_IDX.負担区分);
                        to.コード     = (int)csv.GetField <int>((int)TO_IDX.特定器材コード);
                        to.数量      = csv.GetField <float?>((int)TO_IDX.使用量);
                        to.点数      = csv.GetField <int?>((int)TO_IDX.点数);
                        to.回数      = csv.GetField <int>((int)TO_IDX.回数);
                        to.単位コード   = csv.GetField <int?>((int)TO_IDX.単位コード);
                        to.単価      = csv.GetField <float?>((int)TO_IDX.単価);
                        to.特定器材名称  = csv.GetField <string>((int)TO_IDX.特定器材名称);
                        to.商品名及び規格 = csv.GetField <string>((int)TO_IDX.商品名及び規格);
                        readコメント(csv, (int)TO_IDX.コメント1_コメントコード, (int)TO_IDX.コメント3_コメントコード, to);
                        readXX日の情報(csv, (int)TO_IDX.X01日の情報, (int)TO_IDX.X31日の情報, to);
                        receipt.SIIYTOCOList.Add(to);
                    }
                    else if (lineDef == レコード識別情報定数.コメント)
                    {
                        var co = new CO()
                        {
                            診療識別    = csv.GetField <int?>((int)CO_IDX.診療識別),
                            負担区分    = csv.GetField <string>((int)CO_IDX.負担区分),
                            コメントコード = csv.GetField <int>((int)CO_IDX.コメントコード),
                            文字データ   = csv.GetField <string>((int)CO_IDX.文字データ),
                        };
                        receipt.SIIYTOCOList.Add(co);
                    }
                    else if (lineDef == レコード識別情報定数.症状詳記)
                    {
                    }
                }

                add();  // 最後の患者を追加する。
            };

            CSVUtil.Read(filePath, readAction);
        }