csv形式(Excel等)のファイル操作の方法についてお伺い致します。

2つのファイルを比較し、特定の条件(A,B,C列の一致など)を満たしている
レコード(行)を抽出する方法はありますでしょうか





※縦=行、横=列

Aファイル

    1 2 3 4 5

1   あ い う ※ △
2   か き く ○ ◆
3   さ し す × ◇



Bファイル

    1 2 3 4 5

1   あ い う × ○
2   か き く を ■
3   さ し す ヾ 〒
4   た ち つ ‖ 〆
5   な に ぬ 仝 ±

この場合、Bファイルの中からAファイルの1列〜3列と完全一致するレコード(行)を
抽出したいので、仮に抽出できた場合は、以下のレコード(行)
が抽出できるようになれば助かります。

*ファイル

    1 2 3 4 5

1   あ い う × ○
2   か き く を ■
3   さ し す ヾ 〒

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:cx20 No.1

回答回数607ベストアンサー獲得回数108

ポイント200pt

試しにコードを書いてみました。

URL にサンプルプログラムを置いてあります。

ちょっと邪道ですが、ADO を利用して、Excel を DB として利用した方法です。

各ファイルの先頭には、項目行を設定しておく必要があります。

’ MatchData.vbs

’ Usage : CScript MatchData.vbs

Const strFileName1 = ”D:¥home¥edu¥hatena¥20040915¥db1.xls”

Const strFileName2 = ”D:¥home¥edu¥hatena¥20040915¥db2.xls”

Const strFileName3 = ”D:¥home¥edu¥hatena¥20040915¥db3.xls”

MatchData

Sub MatchData

Dim cn

Dim rs

Set cn = CreateObject(”ADODB.Connection”)

cn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & strFileName3 & ”;Extended Properties=Excel 8.0”

Dim strSQL

strSQL = ”INSERT INTO [Sheet1$]” & _

” SELECT t2.c1, t2.c2, t2.c3, t2.c4, t2.c5” & _

” FROM [Excel 8.0;database=” & strFileName1 & ”].[Sheet1$] AS t1” & _

” INNER JOIN [Excel 8.0;database=” & strFileName2 & ”].[Sheet1$] AS t2” & _

” ON (t1.c3 = t2.c3) AND (t1.c2 = t2.c2) AND (t1.c1 = t2.c1)”

Set rs = cn.Execute( strSQL )

End Sub

id:anesin

まだ試してはいませんが、十分できそうっすね(^^

2004/09/15 21:19:09
id:aki73ix No.2

回答回数5224ベストアンサー獲得回数27

ポイント200pt

マクロを作ってみました

色々な条件で行の出力が出来ます

まずSheet1にCSVファイル1

まずSheet2にCSVファイル2をコピーします

表示>ツールバー>VisualBasicをチェックを入れてVisualBasicEditorのアイコンをクリック

MAXXとMAXYの値を入れます

最後に再生アイコンをクリックすると

Sheet3に条件に合致した行が出力されます

条件を

If DT1(1) = DT2(1) And DT1(2) = DT2(2) And DT1(3) = DT2(3) Then

にすれば列1〜3が同じという条件になります

Sub Macro1()

’ Macro1 Macro

’ マクロ記録日 : 2004/9/15 ユーザー名 : Aki

’横方向のセルの数

Const MAXX = 200

’縦方向のセルの数

Const MAXY = 10

Dim DT1(MAXX) As String

Dim DT2(MAXX) As String

Sheets(”Sheet3”).Select

Cells.Select

Selection.Clear

Range(”A1”).Select

L = 1

For Y = 1 To MAXY

M = 1

For X = 1 To MAXX

DT1(X) = Sheets(”Sheet1”).Cells(Y, X).Value

DT2(X) = Sheets(”Sheet2”).Cells(Y, X).Value

If DT1(X) <> DT2(X) Then M = 0

Next

’条件

’ 全セルの一致が条件

If M = 1 Then

’ 1,3列のセルの一致が条件

’ If DT1(1) = DT2(1) And DT1(3) = DT2(3) Then

’条件を満たした行の出力

For X = 1 To MAXX

Cells(L, X).Value = DT1(X)

Next

L = L + 1

End If

Next

End Sub

id:anesin

同じくまだ試していませんが、出来そうです(^^

2004/09/15 21:22:12
id:wm5775 No.3

回答回数351ベストアンサー獲得回数4

ポイント50pt

#URLはダミーです。

エクセルのファイルをODBCに設定して、Accessなどのデータベースソフトからクエリをかけたらいかがでしょうか?

id:anesin

なるほど、確かに出来そうな気がするのですが

DBソフトに明るく無いんです(^^; でも

選択支のひとつとしては候補にあがると

思います。ありがとうございますー

2004/09/15 21:26:19
id:satoru13 No.4

回答回数6ベストアンサー獲得回数0

ポイント200pt

http://www.hatena.ne.jp/1095238536#

csv形式(Excel等)のファイル操作の方法についてお伺い致します。 2つのファイルを比較し、特定の条件(A,B,C列の一致など)を満たしている レコード(行)を抽出する方.. - 人力検索はてな

URLはダミーです。1つのデータが一文字かどうかでも回答が変わるので、EXCEL上で各データがセルに割り振られたとして回答します。Aファイルをsheet1、Bファイルをsheet2、結果をsheet3に出力させます。sheet4のA1セルに[=if(sheet1!A1=sheet2!A1,1,0)+if(sheet1!b1=sheet2!b1,1,0)+if(sheet1!C1=sheet2!C1,1,0)]と入力して、レコードの数だけ縦に相対コピーします。sheet3のA1セルには[=if(sheet4!$A1=3,sheet2!A1,””)]を縦にレコードの数だけ、横にデータ数分だけ相対コピーします。完全一致しないレコードは空白となりますが、値コピーをして空白レコードを削除すれば一致レコード分だけ抽出できます。原始的な方法ですが、いろんな応用ができます。

id:anesin

基礎的な型として勉強させて頂きました。

実施に入力してみたところ、

レコード自体の一致だけではなく、

行数の一致も必要である為、

行がずれていると出力できない仕様なんですね。

私の説明不足なんで申し訳ないのですが、

行がずれている場合がほどんどのファイルに

なるので、残念ながら扱いきれなかったです。

ただ、VLOOKUP程度しか扱えない私にとっては

結構勉強になりましたので、感謝しております。

2004/09/15 22:15:53

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません