ファイルマッチング
二つのファイルの共通項目をキーにして新しいファイルを作成する、ファイルマッチングは事務処理ではポピュラーな処理の一つです。
処理の概要
入力する二つのファイルは共通項目を予めソートしておく。
二つのファイルをキー順に順次読込む。
キーを比較すると以下の3つの状態のいずれかになり、それぞれの処理を実行する。
1.キーが一致したとき
処理1:キーが両方のファイルにある。
2.入力ファイル1のキー<入力フィアル2のキー
処理2:キーが入力ファイル1にだけある。
3.入力ファイル1のキー>入力フィアル2のキー
処理3:キーが入力ファイル2にだけある。
COBOL
VB.NET
COBOLのREAD,WRITEと同様にロジックを組むことも可能ですが、
以下はファイルマッチングを行う時のSQL文の例です。
SQLでファイルマッチングを実行
このSQL文をVB.NETのソースに組込み3つの条件に応じた処理を行えばCOBOLのREAD,WRITEと同じ結果が得られます。
READ,WRITEではレコードを1件読む毎に処理を1回行いますがSQLではまとめて処理を行います。この例では3つの条件に応じて3回のSQL文が実行されます。
テーブルの仕様
Table_1
国コード char(3)
Table_2
国コード char(3)
国名 nchar(10)
USE TEST
-- キーが両方のテーブルにある。
SELECT T2.国コード,T2.国名
FROM Table_1 AS T1
INNER JOIN Table_2 AS T2
ON T1.国コード = T2.国コード
-- キーがTabel_1にだけある(片方のテーブルのみにある)。
SELECT T1.国コード
FROM Table_1 AS T1
LEFT JOIN Table_2 AS T2
ON T1.国コード = T2.国コード
WHERE T2.国コード IS NULL
-- キーがTabel_2にだけある(片方のテーブルだけにある)。
SELECT T2.国コード,T2.国名
FROM Table_2 AS T2
LEFT JOIN Table_1 AS T1
ON T1.国コード = T2.国コード
WHERE T1.国コード IS NULL
実行例)二つのテーブルをマッチングし結果を画面に表示する。
Table_1の内容 |
Table_2の内容 | ||
| 国コード | 国コード | 国名 | |
| 81 | 81 | 日本 | |
| 82 | 82 | 韓国 | |
| 82 | 84 | ベトナム | |
| 886 | 850 | 北朝鮮 | |
| 852 | 香港 | ||
| 853 | マカオ | ||
| 855 | カンボジア | ||
| 856 | ラオス | ||
| 86 | 中華人民共和国 | ||
Module Module1
Private myCNN As SqlClient.SqlConnection
Private myCmd As SqlClient.SqlCommand
Private myReader As SqlClient.SqlDataReader
Sub Main()
Try
Dim strCNN As String = "Data Source=localhost\SQLEXPRESS;" _
& "Initial Catalog=TEST;" _
& "Integrated Security=True"
myCNN = New System.Data.SqlClient.SqlConnection(strCNN)
myCNN.Open()
go両方に有る()
goファイル1だけ有る()
goファイル2だけ有る()
myCNN.Close()
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Sub
Private Sub go両方に有る()
myCmd = myCNN.CreateCommand
myCmd.CommandText _
= "SELECT T2.国コード,T2.国名 " _
& "FROM Table_1 AS T1 " _
& "INNER JOIN Table_2 AS T2 " _
& "ON T1.国コード = T2.国コード"
myReader = myCmd.ExecuteReader
Console.WriteLine("両方に有る")
Do While myReader.Read()
Console.WriteLine(myReader.GetString(0) & " " & myReader.GetString(1))
Loop
myReader.Close()
End Sub
Private Sub goファイル1だけ有る()
myCmd = myCNN.CreateCommand
myCmd.CommandText _
= "SELECT T1.国コード " _
& "FROM Table_1 AS T1 " _
& "LEFT JOIN Table_2 AS T2 " _
& "ON T1.国コード = T2.国コード " _
& "WHERE T2.国コード IS NULL"
myReader = myCmd.ExecuteReader
Console.WriteLine("ファイル1だけ有る")
Do While myReader.Read()
Console.WriteLine(myReader.GetString(0))
Loop
myReader.Close()
End Sub
Private Sub goファイル2だけ有る()
myCmd = myCNN.CreateCommand
myCmd.CommandText _
= "SELECT T2.国コード,T2.国名 " _
& "FROM Table_2 AS T2 " _
& "LEFT JOIN Table_1 AS T1 " _
& "ON T1.国コード = T2.国コード " _
& "WHERE T1.国コード IS NULL"
myReader = myCmd.ExecuteReader
Console.WriteLine("ファイル2だけ有る")
Do While myReader.Read()
Console.WriteLine(myReader.GetString(0) & " " & myReader.GetString(1))
Loop
myReader.Close()
End Sub
End Module
| 両方に有る 81 日本 82 韓国 82 韓国 ファイル1だけ有る 886 ファイル2だけ有る 84 ベトナム 850 北朝鮮 852 香港 853 マカオ 855 カンボジア 856 ラオス 86 中華人民共和国 |
お役に立てましたか?
IT、プログラミングのランキングサイトはこちらです。
最新記事の自動受信登録はこちらです。 |
![]() |
![]() |
![]() |
![]() |
| 固定リンク







コメント