• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2つのCSVを比較して一致していないものを検出したいのですがヒントをい)

2つのCSVを比較して一致していないものを検出する方法

このQ&Aのポイント
  • 2つのCSVを比較して一致していないデータを検出する方法について教えてください。
  • 特定の条件に基づいて、2つのCSVファイルの一致していないデータを抽出する方法を教えてください。
  • VBスクリプトを使用して、2つのCSVファイルを比較し、一致していないデータを見つける方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

AccessのクエリをVBSに載せ替えてみたという、実験的なコードで、実用性は疑問ですが、ご参考まで。(自分自身Accessの助け無しにこのSQLを書く才覚はありませんので) 最初の課題に沿っているつもりですが、実行例もご質問に書いていただけると助かります。二つ目の課題もAccess上ではやってみましたが... VBSは滅多に使わないので、お作法に則っておりませんが、ご容赦下さい。 Dim cn Dim rs Dim connectionString Dim csvFilePath Dim item Dim mySQL Dim fso, dstFile Dim buf Set cn = CreateObject("ADODB.Connection") Set fso = CreateObject("Scripting.FileSystemObject") Set dstFile = fso.CreateTextFile("c:\testfile.txt", True) csvFilePath = "C:\" 'CSVファイルにラベル(フィールド名)が無いとする connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & csvFilePath & ";" _ & "Extended Properties=""Text;HDR=NO;FMT=Delimited""" cn.Open connectionString mySQL = "SELECT tableA.F1, tableA.F2, tableA.F3" _ & " FROM A.csv AS tableA LEFT JOIN B.csv AS tableB ON (tableA.F3=tableB.F3) AND (tableA.F2=tableB.F2) AND (tableA.F1=tableB.F1)" _ & " WHERE (((tableB.F3) Is Null));" Set rs = cn.Execute(mySQL) Do While rs.EOF = False buf= chr(34) & rs.fields(0) & """,""" & rs.fields(1) & """,""" & rs.fields(2) & chr(34) dstFile.WriteLine buf rs.MoveNext Loop dstFile.Close rs.Close cn.Close Set rs = Nothing Set cn = Nothing Set fso = Nothing

mr-r00
質問者

お礼

ありがとうございました。 こういう使い方は思いつきもしませんでした。 要件も問題なくクリアしており大変助かりました。 参考になりました

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

●VBScriptでテキストファイルの内容の間違い探しは出来るでしょうか? http://okwave.jp/qa/q6138246.html の続きかと存じますが、No.2 nda23 さんがお書きの >(1)データを読み込んで配列に溜め、比較を行う。 >(1)はまぁ、コテコテとプログラムすることになります。 に近い方法をお一つ。 ------------------------------------ >BのCSVの「A列の値+B列の値」がおなじものをAのCSVから探し >同じものを見つけたらBのCSVの同じ行のC列の値が一致しているか検索 とのことですが、その順序で コード を書くと、冗長になりますので、 1)「BのCSV」の中から「AのCSV」に存在しない行を探し 2)BのCSVのその行の「A列の値+B列の値」を、再度「AのCSV」から探す という順序で考えてみました。 ------------------------------------ [1]「AのCSV」("D:\hoge\A.CSV")の全文を strCsvA に格納します。 [2]「BのCSV」("D:\hoge\B.CSV")を 1レコード ずつ読み込み、[1] から検索します。 [3] 見つからなかった場合は、今度は、「A列の値+B列の値」だけを [1] から検索します。 [4] [3] の結果が、 ・「見つかった」場合は(C列の値だけ)「一致しない」 ・「見つからなかった」場合は(「A列の値+B列の値」自体が)「存在しない」 という文字列を付して、「別テキスト」("D:\hoge\C.CSV")に書き出します。 ------------------------------------ >VBすくりぷとで考えています。 とのことですので、 ・メモ帳を起動し、下記コード を コピペ します。 ・全角スペース を 半角スペース 2個 に置換します。 ・これを適当な名前で、拡張子「VBS」で保存します。 ・この VBS ファイル を実行します。  以上です。 '----------------------------------- Option Explicit Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 Dim objFSO Dim objCsvA, objCsvB, objCsvC Dim strCsvA, strCsvB, strCsvC Dim arrCsvB '//FileSystemObject を使って 値を読み書きします。 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objCsvA = objFSO.OpenTextFile("D:\hoge\A.CSV", ForReading) Set objCsvB = objFSO.OpenTextFile("D:\hoge\B.CSV", ForReading) '//追加書込の場合は、下の「ForWriting」を「ForAppending」に変えてください。 Set objCsvC = objFSO.OpenTextFile("D:\hoge\C.CSV", ForWriting) strCsvA = vbCrLf & objCsvA.ReadAll  '[1] Do While objCsvB.AtEndOfStream <> True  '[2]  strCsvB = vbCrLf & objCsvB.ReadLine  arrCsvB = Split(strCsvB, ",")  If InStr(strCsvA, strCsvB) = 0 Then   If InStr(strCsvA, arrCsvB(0) & "," & arrCsvB(1)) = 0 Then  '[3]・[4]    objCsvC.writeline """存在しない""," & Replace(strCsvB, vbCrLf, "")   Else    objCsvC.writeline """一致しない""," & Replace(strCsvB, vbCrLf, "")   End If  End If Loop objCsvA.Close objCsvB.Close objCsvC.Close Set objCsvA = Nothing Set objCsvB = Nothing Set objCsvC = Nothing Set objFSO = Nothing

mr-r00
質問者

お礼

ありがとうございました。 若干レスポンスに問題はありましたが、要件も問題なくクリアしており大変助かりました。 参考になりました

全文を見る
すると、全ての回答が全文表示されます。
  • layy
  • ベストアンサー率23% (292/1222)
回答No.2

こういうときは同じく「マッチング」のアルゴリズムなのですが、 質問が出ているということはこれは知らない(=作れない、使ったことない)と解釈します。残念ですが・・・。 <AのCSV>において "AAAAA","BBB","CC" "DDDDD","EEE","FF" "GGGGG","HHH","II" "GGGGG","HHH","II"・・・・・・・・・・確認です、同じものは存在しますか?。 "MMMMM","NNN","OO" エクセルらしくやるには、 "A","AAAAA","BBB","CC" "A","DDDDD","EEE","FF" "A","GGGGG","HHH","II" "A","MMMMM","NNN","OO" "B","AAAAA","BBB","CC" "B","DDDDD","EEE","F8" "B","GGGGG","HHH","II" "B","JJJJJJ","KKK","ll" "B","MMMMM","NNN","OO" として 並べ替える。 "A","AAAAA","BBB","CC" "B","AAAAA","BBB","CC" "A","DDDDD","EEE","FF" "B","DDDDD","EEE","F8" "A","GGGGG","HHH","II" "B","GGGGG","HHH","II" "B","JJJJJJ","KKK","ll"・・・・・・・前の行に"A"がないので重複していない "A","MMMMM","NNN","OO" "B","MMMMM","NNN","OO" 同じ次元にして区別できるものを用意します。 "A""B"と2行になっていれば重複となります。

mr-r00
質問者

お礼

ありがとうございました。 参考になりました

全文を見る
すると、全ての回答が全文表示されます。
  • webuser
  • ベストアンサー率33% (372/1120)
回答No.1

>ヒントをいただけないでしょうか? では、ヒントだけ。。。 1.比較の処理パターンを「マッチング処理」といいます。検索すれば流れ図などがいくらでも出てくると思います。 2.マッチングするには入力データがソート済である事が前提になります。 3.比較の対象項目の事を「マッチング・キー」と言います。 4.データのキーに重複が無い事を「1対」、重複がある事を「n対」と表現します。 5.「1対1」のマッチングは比較的簡単です。「1対n」や「n対n」になると少し面倒になります。しかし、基本は同じです。 6.「1対1のマッチング処理」とは、ソート済の2つのデータをまずは1件読み、データ1のキーが小さければデータ1を、データ2が小さければデータ2を、同じなら両方を読む、これを両方のデータの最後まで繰り返すという処理です。 その過程で、データ1のみに存在する、データ2のみに存在する、両方に存在するを判定できます。 7.キーが重複する場合、マッチングと同時に「キーブレイク処理」を行う必要があります。 8.入力データがソートされていないなら、「バブルソート」などで、一旦ソート済データにする必要があります。 これが、どんな言語ツールでも通用する、何も無い状態からイチから作る方法です。 既存のオブジェクトを利用して簡易的に作る方法もあります。 表の形式のオブジェクトにCSVのデータを全て読み込ませた後、オブジェクトに搭載された検索機能を用いて検索したりマッチングさせたり、それは使うオブジェクトによって異なります。

mr-r00
質問者

お礼

ありがとうございました。 参考になりました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBScriptでテキストファイルの内容の間違い探しは出来るでしょうか

    VBScriptでテキストファイルの内容の間違い探しは出来るでしょうか? CSVをテキスト形式で読み込んでいるファイルなのですがごくごくたまに一部内容が違っています。 例: <Aテキスト> "AAAAA","BBB","CC" "DDDDD","EEE","FF" "GGGGG","HHH","II" <Bテキスト> "AAAAA","BBB","CC" "DDDDD","EEE","F8" "GGGGG","HHH","II" とほとんどあっているのですが一部違う行をみつけて別ファイルにその行を書き出したいのです。 CSV形式で見たときA列+B列の値が一致したもののC列データが正しいか確認したいのですがどういったアルゴリズムがいいのでしょうか? お願いします。

  • VBAでCSV内にある改行を取る方法

    あるシステムが吐くcsvファイルの項目の中に改行が入っているものがあります。 例) 01,aaa,bbb(改行)bbb,ccc(改行) 02,ddd,eee,fff(改行) 03,ggg(改行)ggg,hhh,iii(改行) このCSVファイルをエクセルのマクロで読み込んでシートに展開したい のですが、項目中にある改行で別レコードを認識してしまいます。 結果) A B C D ---+---+---+--- 01 aaa bbb  bbb ccc 02 ddd eee fff 03 ggg ggg hhh iii これを以下のようにしたいのですが・・・ A B C D ---+------+------+---- 01 aaa bbbbbb ccc 02 ddd eee fff 03 gggggg hhh iii どうやればよいでしょうか? ご教授お願いいたします。

  • Excel比較関数について教えてください。2

    下記のようにA列とC列を比較して、 一致した値が存在する場合、B列とC列を比較して、 E列に全て一致した場合は○、一致しない場合は×にしたいのですが教えてください。 また、A列にあってC列にない場合は、×を表示したいです。 A列 B列 C列 D列 E列 1 12345 aaa 12389 aaa A1とA3が一致&B1とD3が一致したので○ 2 12389 bbb 22222 bbb A2とC1が一致したが、B2とD1が一致しないので× 3 33333 bbb 12345 aaa A3の値がC列にないので空欄 教えてください。

  • Excel比較関数について教えてください。

    下記のようにA列とC列を比較して、 一致した値が存在する場合、B列とC列を比較して、 E列に一致した場合は、●一致しない場合は、空欄にしたいのですが教えてください。 A列 B列 C列 D列 E列 12345 aaa 12389 bbb A2と一致したので● 12389 bbb 22222 bbb 一致しないので空欄 33333 bbb 12345 aaa A1と一致したので●

  • excel2003 二つと一致したものを選ぶ関数

    いつもお世話になります。 素人が何かをするとすぐに壁に当ります。 よろしくお願いします。 二つのキーに一致したものを選べる関数はありますか? 例えば、 CD1 CD2 CD3 CD4 0001 aaa ddd ggg 0002 bbb eee hhh 0003 ccc fff iii 上記のデータがあると致しまして、 CD1の「0002」とCD4「hhh」が、一致して、 CD2の『bbb』を抜き出したいのですが・・・。 よろしくお願い致します。

  • csv形式のデータの一部を削除して、上書きする方法

    前回も似たような(?)質問をしたんですが 今回も質問させてください。CSVに関して(CSVだけというわけではありませんが) 以下のようなデータを読み込んで、配列変数に格納後... aaa,bbb,ccc,ddd eee,fff,ggg,hhh iii,jjj,kkk,lll mmm,nnn,ooo,ppp qqq,rrr,sss,ttt ↑のデータを、下のようなデータにして、保存しなおすにはどうすればよいでしょうか。(上から二列目を削除して前のデータに保存しなおす) aaa,bbb,ccc,ddd iii,jjj,kkk,lll mmm,nnn,ooo,ppp qqq,rrr,sss,ttt 変な質問でもうしわけございませんが、回答できるかたお願いします。

    • ベストアンサー
    • Perl
  • 検索VBAを教えてください。

    VBAの勉強中です。 超初心者です。 シート1のB3に入力した値を、シート2のデータベースのC列から検索して、その検索した値と同じ行のD列・E列・F列の値を、シート1のB4・ B5・B6に表示したいと思います。 <シート1>    A     B     C     D 1 2     3       あああ ←ここを入力すると 4       aaa   ←表示したい! 5       bbb   ←表示したい! 6       ccc   ←表示したい! <シート2>    A    B    C      D     E     F 1           あああ    aaa     bbb     ccc 2           いいい      eee     fff      ggg 3           ううう      hhh      iii       jjj 4           えええ     kkk      mmm     nnn 5             おおお     ooo     ppp     qqq findを使えばいいと聞きましたが、使い方がよくわかりません。 例を読みましたが、どう自分に生かせばいいのかわかりませんでした。 どなたか未熟な私に教えていただけませんか? どうぞよろしくお願いいたします。

  • セルの値を含む文字列を検索する方法

    エクセル2010を使っている者です。 セルの値を一部として含むかどうかを調べることはできますか? countifだとA列のセルとB列のセルの値が一致してないとならないし、findだと*aaa@tokyo.co.jp* のようにセルとして指定することができないし。。 例えば以下のような表でB列においてA列のそれぞれのセルについて値が含まれているか を調べたいと思っております。 よろしくお願いします。 A列              B列 aaa@tokyo.co.jp      aaa@tokyo.co.jp; bbb@tokyo.co.jo; ccc@tokyo.co.jp         bbb@tokyo.co.jp      ddd@tokyo.co.jo; eee@tokyo.co.jp; fff@tokyo.co.jp ccc@tokyo.co.jp      ggg@tokyo.co.jp; hhh@tokyo.co.jp; iii@tokyo.co.jp ・・・             ・・・・・・・

  • Excelでの帳票作成

    Excelで以下のようなシートがあります。 --------------------------- A列  B列 C列 D列 1 Name1 11111 2222 3333 2 Name1 44444 5555 6666 3 Name1 77777 8888 9999 4 Name2 aaaaa bbbb cccc 5 Name2 ddddd eeee ffff 6 Name3 ggggg hhhh iiii --------------------------- これを元に以下のようなシートを別々に作成したいです。 <シート1> Name1 11111 3333 Name1 44444 6666 Name1 77777 9999 <シート2> Name2 aaaaa cccc Name2 ddddd ffff <シート3> Name3 ggggg iiii つまり、元のシートのA列の内容(Name1,Name2,Name3)毎にシートを 作成し、A列、B列、C列をコピーしたいです。 上記のシート作成をマクロで自動化したいのですが、どのように行えばよいでしょうか? (VBAでも可) 以上、よろしくお願いします。

  • 【Excel2007】A列の値がB列に存在しないことを確認したい

    いつもお世話になっております。 Excel2007を使用しております。 次のような一覧があります。 A列   B列 aaaaa aaaaa bbbbb bbbbb ccccc ddddd ddddd fffff eeeee A列にはあるが、B列にはない値を取得したいと 思っております。 この例であれば、「ccccc」と「eeeee」を抜き出したいのです。 何か関数などで抜き出す方法がございましたら、 教えて頂けませんか? A列、B列ともに2000行程度あるため、調査に苦労しています。 ぜひよろしくお願いいたします。