COBOLで使われているテクニックは過去のもののように思われがちですが、現在でもちょっとしたツールを作る時に役立ちます。
WindowsOS環境の場合は、ちょっとしたツールはC#で作るのが便利なので、今回はC#でCOBOLのマッチング処理を実装してみました。
今回は、下記の記事を参考に実装しています。
https://cyzennt.co.jp/blog/2019/06/01/%E3%83%9E%E3%83%83%E3%83%81%E3%83%B3%E3%82%B0%E5%87%A6%E7%90%86%E3%81%AE%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF/
HIGH-VALUEを使う代わりにEOFを示すフラグ変数を使用しているので、その分だけ処理が複雑になっていることには注意してください。
【フォルダ構成】
execute.bat
matching.cs
files┬master.csv
└transaction.csv
【ソースコード】
・execute.bat
@echo off
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe matching.cs
matching.exe
del matching.exe
pause
・matching.cs
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
0000001,hoge
0000002,fuga
0000004,piyo
・files\transaction.csv
0000001,20180401,00100,00010000
0000001,20180402,00200,00020000
0000003,20180401,00001,00001000
0000004,20180401,00002,00002000
【実行結果】
execute.batをダブルクリックして実行する。
・files\matched.csv
hoge ,20180401
hoge ,20180402
piyo ,20180401
・標準出力
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.
続行するには何かキーを押してください . . .