COBOLで使われているテクニックは過去のもののように思われがちですが、現在でもちょっとしたツールを作る時に役立ちます。
WindowsOS環境の場合は、ちょっとしたツールはC#で作るのが便利なので、今回はC#でCOBOLのマッチング処理を実装してみました。
今回は、下記の記事を参考に実装しています。
マッチング処理のロジック – サイゼントの技術ブログ
HIGH-VALUEを使う代わりにEOFを示すフラグ変数を使用しているので、その分だけ処理が複雑になっていることには注意してください。
また、この記事に限りませんが、ソースコードをコピペする場合は、「[」を「[」、「]」を「]」、「>」を「>」、「<」を「<」に変換するようにお願いします。
【フォルダ構成】
1 2 3 4 |
execute.bat matching.cs files┬master.csv └transaction.csv |
【ソースコード】
・execute.bat
1 2 3 4 5 6 7 |
@echo off C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe matching.cs matching.exe del matching.exe pause |
・matching.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace Program { class Program { // EOFフラグ static bool isSrmEof = false; static bool isSrtEof = false; static void Main(string[] args) { // ファイルオープン StreamReader srm = new StreamReader (@"files\master.csv", Encoding.UTF8); StreamReader srt = new StreamReader (@"files\transaction.csv", Encoding.UTF8); StreamWriter sw = new StreamWriter (@"files\matched.csv", false, Encoding.UTF8); // 先読みRead string[] mRecord; string[] tRecord; mRecord = mRead(srm); tRecord = tRead(srt); // マッチング処理のループ while (!isSrmEof || !isSrtEof) { // masterのみの場合 if ((!isSrmEof && isSrtEof) || (string.Compare(mRecord[0],tRecord[0]) < 0)) { // 何もしない // master読み込み mRecord = mRead(srm); } // マッチした場合 else if ((!isSrmEof && !isSrtEof) && (string.Compare(mRecord[0],tRecord[0]) == 0)) { // transactionが次のキーに進むまでループ while ((!isSrtEof) && !(string.Compare(mRecord[0],tRecord[0]) < 0)) { // ファイル出力 sw.WriteLine(mRecord[1] + "," + tRecord[1]); // transaction読み込み tRecord = tRead(srt); } // master読み込み mRecord = mRead(srm); } // transactionのみの場合 else if ((isSrmEof && !isSrtEof) || (string.Compare(mRecord[0],tRecord[0]) > 0)) { // エラー出力 Console.WriteLine("Error:" + tRecord[0] + " is tran only."); // transaction読み込み tRecord = tRead(srt); } } // ファイルクローズ srm.Close(); srt.Close(); sw.Close(); } // MasterファイルRead static string[] mRead(StreamReader srm) { if (srm.Peek() == -1) { isSrmEof = true; return null; } else { string str = srm.ReadLine(); return str.Split(','); } } // TransactionファイルRead static string[] tRead(StreamReader srt) { if (srt.Peek() == -1) { isSrtEof = true; return null; } else { string str = srt.ReadLine(); return str.Split(','); } } } } |
【実行前のファイル】
・files\master.csv
1 2 3 |
0000001,hoge 0000002,fuga 0000004,piyo |
・files\transaction.csv
1 2 3 4 |
0000001,20180401,00100,00010000 0000001,20180402,00200,00020000 0000003,20180401,00001,00001000 0000004,20180401,00002,00002000 |
【実行結果】
execute.batをダブルクリックして実行する。
・files\matched.csv
1 2 3 |
hoge ,20180401 hoge ,20180402 piyo ,20180401 |
・標準出力
1 2 3 4 5 6 7 8 9 10 11 |
Microsoft (R) Visual C# Compiler version 4.7.3062.0 for C# 5 Copyright (C) Microsoft Corporation. All rights reserved. This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, w hich is no longer the latest version. For compilers that support newer versions of the C# programming language, see http ://go.microsoft.com/fwlink/?LinkID=533240 Error:0000003 is tran only. 続行するには何かキーを押してください . . . |
Windows OSで作業や運用を行う場合は、C#を使いこなせると何かと便利です。
C#でツールを使う時に便利なソースコードは、これからも公開していきたいと思います!
コメント