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); }