人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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 さ し す ヾ 〒


●質問者: anesin
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:CSV Excel ファイル レコード 全一
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● cx20
●200ポイント

http://www.hondarer-soft.com/cx/pukiwiki/pukiwiki.php?Memo%2F200...

[hondarer-soft] to [cx20.main.jp]

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

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

◎質問者からの返答

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


2 ● aki73ix
●200ポイント

http://nifberry.727.net/test/hatena77.xls

マクロを作ってみました

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

まず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

◎質問者からの返答

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


3 ● wm5775
●50ポイント

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

はてな

#URLはダミーです。

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

◎質問者からの返答

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

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

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

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


4 ● satoru13
●200ポイント

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,””)]を縦にレコードの数だけ、横にデータ数分だけ相対コピーします。完全一致しないレコードは空白となりますが、値コピーをして空白レコードを削除すれば一致レコード分だけ抽出できます。原始的な方法ですが、いろんな応用ができます。

◎質問者からの返答

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

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

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

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

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

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ