- ベストアンサー
2つのCSVファイルの比較
CSVファイルが2つあります。 この内容が同じかどうかをチェックしたいんです。 しかしエクセルで開くとデータが256を超えているため、途中でちょん切れちゃって比較できません。 メモ帳で開けばちょん切れませんが、比較する方法が思い当たりません。 どうすればよいでしょうか?
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
#10 改行も1文字として数えるので、ファイルの最後は改行せずに試してみてください^-^ If EOF(1) And EOF(2) Then このIf文は、 ファイル1及びファイル2から読み込む文字がなくなったときに真になるけれど、最後の文字の一致/不一致まで言及していないのです。^-^; ↓ If EOF(1) And EOF(2) And MyChar1 = MyChar2 Then これだと、 ファイル1及びファイル2から読み込む文字がなくなり、かつ、最後の文字も一致しているときに真になります。
その他の回答 (10)
- kumadayo
- ベストアンサー率31% (9/29)
#8 最後の1文字が違うとき、同じと判定されていました^-^; 訂正です。 If EOF(1) And EOF(2) Then ↓ If EOF(1) And EOF(2) And MyChar1 = MyChar2 Then
補足
何度もありがとうございます。 少数のデータで試しましたが、以下のコードで最後の1文字違いも判別するようですが、If EOF(1) And EOF(2) ThenでなくIf EOF(1) And EOF(2) And MyChar1 = MyChar2 Thenの意味はなんでしょう? Sub CSVデータ比較() Dim MyChar1 As String Dim MyChar2 As String Dim FName1 As Variant Dim FName2 As Variant Res = MsgBox("データを比較する2つのCSVファイルを選びます。 " & vbCr & _ "" & vbCr & _ "続行しますか?", vbYesNo + vbQuestion, "確認") If Res = vbNo Then MsgBox "中止します。 ", , "中止" Exit Sub End If FName1 = Application.GetOpenFilename(FileFilter:="CSVファイル (*.csv), *.csv") If FName1 = False Then MsgBox "中止します。", , "中止" Exit Sub Else End If MsgBox FName1 & "を選択しました。 " & vbCr & _ "比較対象するファイルを選択してください。 ", , "対象選択" FName2 = Application.GetOpenFilename(FileFilter:="CSVファイル (*.csv), *.csv") If FName2 = False Then MsgBox "中止します。", , "中止" Exit Sub Else MsgBox FName1 & "と " & vbCr & _ FName2 & "の" & vbCr & _ "データを比較します。", vbInformation, "比較開始" Open FName1 For Input As #1 Open FName2 For Input As #2 Do Until EOF(1) Or EOF(2) MyChar1 = Input(1, #1) MyChar2 = Input(1, #2) If MyChar1 <> MyChar2 Then Exit Do n = n + 1 Loop If EOF(1) And EOF(2) Then MsgBox "データ" & n & "個(カンマを含む)は完全一致です。", , "終了" Else MsgBox "データが異なりました。 " & vbCr & _ "カンマを含み、" & n & "個目で最初の不一致を確認しました。 ", , "終了" End If Close #1 Close #2 End If End Sub
- Gin_F
- ベストアンサー率63% (286/453)
> とりあえずは同じかどうかだけでいいのです。 > FilsSystemObject の ReadAll メソッドというものを存じませんので・・・。 ReadAll メソッド http://www.microsoft.com/japan/msdn/library/ja/script56/html/jsmthReadAll.asp こちらが参考になると思います。 ただ、↑にも書いてありますが、csvファイルのサイズが大きければ、使えませんが (^^ゞ
- kumadayo
- ベストアンサー率31% (9/29)
vbaで txtデータが同じかどうか調べたいということならば、こんな感じになります^-^? Option Explicit Public Sub Aaa() Dim MyChar1 As String Dim MyChar2 As String Open "c:\temp\1.csv" For Input As #1 Open "c:\temp\2.csv" For Input As #2 Do Until EOF(1) Or EOF(2) MyChar1 = Input(1, #1) MyChar2 = Input(1, #2) If MyChar1 <> MyChar2 Then Exit Do Loop If EOF(1) And EOF(2) Then Debug.Print "OK" Else Debug.Print "違うよ^-^" End If Close #1 Close #2 End Sub
お礼
ご教示をもとに下記のように作りました。 ちゃんと作動するようですが、穴がないか、またはアドバイスがありましたら教えていただけたら幸いです。 Sub CSVデータ比較() Dim MyChar1 As String Dim MyChar2 As String Dim FName1 As Variant Dim FName2 As Variant Res = MsgBox("比較用する2つのファイルを選びます。 " & vbCr & _ "続行しますか?", vbYesNo + vbQuestion, "確認") If Res = vbNo Then MsgBox "中止します。 ", , "中止" Exit Sub End If Dim FName1 As Variant FName1 = Application.GetOpenFilename(FileFilter:="CSVファイル (*.csv), *.csv") If FName1 = False Then MsgBox "中止します。", , "中止" Exit Sub Else End If MsgBox FName1 & "を選択しました。 " & vbCr & _ "比較対象するファイルを選択してください。 ", , "対象選択" Dim FName2 As Variant FName2 = Application.GetOpenFilename(FileFilter:="CSVファイル (*.csv), *.csv") If FName2 = False Then MsgBox "中止します。", , "中止" Exit Sub Else MsgBox FName1 & "と " & vbCr & _ FName2 & "の" & vbCr & _ "データを比較します。", vbInformation, "比較開始" Open FName1 For Input As #1 Open FName2 For Input As #2 Do Until EOF(1) Or EOF(2) MyChar1 = Input(1, #1) MyChar2 = Input(1, #2) n = n + 1 If MyChar1 <> MyChar2 Then Exit Do Loop If EOF(1) And EOF(2) Then MsgBox "データ" & n & "個(カンマを含む)は同一でした。", , "終了" Else MsgBox "データ異なりました。", , "終了" End If Close #1 Close #2 End If End Sub
- imogasi
- ベストアンサー率27% (4737/17069)
(1)普通ビジネスでファイルが同じかどうか問題にするのはキー(例えば社員コードのようなもの)で、AとBファイルの同一の2レコードについてキー以外の項目を比較します。 このキーに当たるものがAとBファイルにありますか。 (2)無ければ、Aファイルの1番目のレコードとBファイルの1番目のレコード(以下2番と2番、以下繰り返し)で比較せねばなりませんが、それで意味がありますか。Bファイルに1レコード挿入されただけでも他のレコードが全く同じでも挿入レコード以後はすべて不一致になります。そう言う事態は考えられないのでしょうか。 (1)については、A,Bファイルをキー順にソートして マッチングのアルゴリズムで処理するのが易しく、処理時間が早いと思います。オフラインバッチ処理の定番です。 普通は(2)は既製ソフト(ファイルコンペア)を見つけるのが良いのではないでしょうか。 >、いずれはVBAで処理しようと プログラムはマッチングのアルゴリズムなら比較的簡単ですが、他の方法では、人によってはそこまで速く達するが、近くにアドバイザなどいないと、一般には難しいものですよ。
お礼
ありがとうございます。 > Bファイルに1レコード挿入されただけでも他のレコードが全く同じでも挿入レコード以後はすべて不一致になります。そう言う事態は考えられないのでしょうか。 今回はこれは想定外でしたが、今後はそういうこともありますね。そのときのために既成ソフトがあるということですね。勉強になりました。
- Gin_F
- ベストアンサー率63% (286/453)
> この内容が同じかどうかをチェックしたいんです。 どのレベルで比較するのでしょうか? 同じかどうかだけでいいのなら、FilsSystemObject の ReadAll メソッドで双方を読み込み、単純に 比較するとか。
お礼
ありがとうございます。 とりあえずは同じかどうかだけでいいのです。 FilsSystemObject の ReadAll メソッドというものを存じませんので・・・。
すいません、読んだらそのとおりでした FCは内容です
お礼
何度もありがとうございます。 FCは内容?やっぱりわかりません。 わたし、そもそも「バッチ」がどういうものかも知らないので、今回はVBAでやってみました。 ごめんなさい。
1.txtはたとえばです。拡張子に注意してください 「1.txtを1.bat」とは名前を変えればいいです。 1はご自由に~
テキストで 「FC ファイル名.csv ファイル名2.csv > kekka.txt」 で保存。(1.txtとする) 1.txtを1.batに変更。 3ファイルを同じ場所においてbatをダブルクリック。 kekka.txtに違う場所が表示されます。 あとこれは 完全一致でないと使えません(・・;)
補足
ありがとうございます。 >「FC ファイル名.csv ファイル名2.csv > kekka.txt」 で保存。(1.txtとする) 意味がよくわからないのですが、「」内が拡張子を含んだファイル名ですか?(1.txtとする)ってどういう意味でしょうか? > 1.txtを1.batに変更。 拡張子を変えるということですか?
- hana-hana3
- ベストアンサー率31% (4940/15541)
ファイルを比較するための下記のようなソフトが有ります。 CSVなら、拡張子をTXTに変更すれば問題なく動作するはずです。
補足
ありがとうございます。 たた、いずれはVBAで処理しようと思っていますので、できれば比較ソフト以外でやりたいのです。
- syosyosyo
- ベストアンサー率33% (32/95)
「テキスト比較」とか「diff」で検索すると、テキストデータの比較を行うツールがいくつもヒットすると思いますので、それを使うのが一番でしょう。 あるいは、windowsのコマンドラインから、compコマンドでもある程度の比較は可能です。 コマンドラインで comp /? と打って、使用法を見てください。
補足
ありがとうございます。 たた、いずれはVBAで処理しようと思っていますので、できれば比較ソフト以外でやりたいのです。
お礼
ありがとうございました。