質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

5回答

22171閲覧

2つのデータ(csvファイル)を比較し差異がある行のみを確認するには

NextSt

総合スコア13

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

1グッド

3クリップ

投稿2019/02/27 10:30

編集2019/02/27 10:32

##現状
2つのcsvファイルを比較し、差異のある行を確認したいと考えており、
excelのマクロで比較処理をかけてみましたが、
1時間たっても終わらず、今現在も処理中です。
※これを書いている間に、 応答なしでExcelがフリーズしておりました。

##ファイル内部の状態
・1列目から100列目まで比較元のデータが入っている。
・101列目から201列目まで比較先のデータが入っている。
・データは比較先・比較元各々で約170000行存在します。
・各セルのデータは日付・最大8桁の数値・任意の文字列、空のセルと複数存在する。

##マクロ内容
Option Explicit
Sub 2019_cros()

Dim X As Long
Dim Y As Long
Dim Z1 As Long

Application.ScreenUpdating = False

X = 2
Y = 1
Z1 = 2

Do Until Cells(X, Y) = "" '比較元が空白である事を確認したら全処理を止める
'比較元を左、比較先を右とする。
If Cells(X, Y + 1) = Cells(Z1, Y + 110) And Cells(X, Y + 2) = Cells(Z1, Y + 111) And Cells(X, Y + 3) = Cells(Z1, Y + 112) And Cells(X, Y + 4) = Cells(Z1, Y + 113) And Cells(X, Y + 5) = Cells(Z1, Y + 114) And Cells(X, Y + 6) = Cells(Z1, Y + 115) And _
Cells(X, Y + 7) = Cells(Z1, Y + 116) And Cells(X, Y + 8) = Cells(Z1, Y + 117) And Cells(X, Y + 9) = Cells(Z1, Y + 118) And Cells(X, Y + 10) = Cells(Z1, Y + 119) And Cells(X, Y + 11) = Cells(Z1, Y + 120) And Cells(X, Y + 12) = Cells(Z1, Y + 121) And _
Cells(X, Y + 13) = Cells(Z1, Y + 122) And Cells(X, Y + 14) = Cells(Z1, Y + 123) And Cells(X, Y + 15) = Cells(Z1, Y + 124) And Cells(X, Y + 16) = Cells(Z1, Y + 125) And Cells(X, Y + 17) = Cells(Z1, Y + 126) And Cells(X, Y + 18) = Cells(Z1, Y + 127) And _
Cells(X, Y + 19) = Cells(Z1, Y + 128) And Cells(X, Y + 20) = Cells(Z1, Y + 129) And Cells(X, Y + 21) = Cells(Z1, Y + 130) And Cells(X, Y + 22) = Cells(Z1, Y + 131) And Cells(X, Y + 23) = Cells(Z1, Y + 132) And Cells(X, Y + 24) = Cells(Z1, Y + 133) And _
Cells(X, Y + 25) = Cells(Z1, Y + 134) And Cells(X, Y + 26) = Cells(Z1, Y + 135) And Cells(X, Y + 27) = Cells(Z1, Y + 136) And Cells(X, Y + 28) = Cells(Z1, Y + 137) And Cells(X, Y + 29) = Cells(Z1, Y + 138) And Cells(X, Y + 30) = Cells(Z1, Y + 139) And _
Cells(X, Y + 31) = Cells(Z1, Y + 140) And Cells(X, Y + 32) = Cells(Z1, Y + 141) And Cells(X, Y + 33) = Cells(Z1, Y + 142) And Cells(X, Y + 34) = Cells(Z1, Y + 143) And Cells(X, Y + 35) = Cells(Z1, Y + 144) And Cells(X, Y + 36) = Cells(Z1, Y + 145) And _
Cells(X, Y + 37) = Cells(Z1, Y + 146) And Cells(X, Y + 38) = Cells(Z1, Y + 147) And Cells(X, Y + 39) = Cells(Z1, Y + 148) And Cells(X, Y + 40) = Cells(Z1, Y + 149) And Cells(X, Y + 41) = Cells(Z1, Y + 150) And Cells(X, Y + 42) = Cells(Z1, Y + 151) And _
Cells(X, Y + 43) = Cells(Z1, Y + 152) And Cells(X, Y + 44) = Cells(Z1, Y + 153) And Cells(X, Y + 45) = Cells(Z1, Y + 154) And Cells(X, Y + 46) = Cells(Z1, Y + 155) And Cells(X, Y + 47) = Cells(Z1, Y + 156) And Cells(X, Y + 48) = Cells(Z1, Y + 157) And _
Cells(X, Y + 49) = Cells(Z1, Y + 158) And Cells(X, Y + 50) = Cells(Z1, Y + 159) And Cells(X, Y + 51) = Cells(Z1, Y + 160) And Cells(X, Y + 52) = Cells(Z1, Y + 161) And Cells(X, Y + 53) = Cells(Z1, Y + 162) And Cells(X, Y + 54) = Cells(Z1, Y + 163) And _
Cells(X, Y + 55) = Cells(Z1, Y + 164) And Cells(X, Y + 56) = Cells(Z1, Y + 165) And Cells(X, Y + 57) = Cells(Z1, Y + 166) And Cells(X, Y + 58) = Cells(Z1, Y + 167) And Cells(X, Y + 59) = Cells(Z1, Y + 168) And Cells(X, Y + 60) = Cells(Z1, Y + 169) And _
Cells(X, Y + 61) = Cells(Z1, Y + 170) And Cells(X, Y + 62) = Cells(Z1, Y + 171) And Cells(X, Y + 63) = Cells(Z1, Y + 172) And Cells(X, Y + 64) = Cells(Z1, Y + 173) And Cells(X, Y + 65) = Cells(Z1, Y + 174) And Cells(X, Y + 66) = Cells(Z1, Y + 175) And _
Cells(X, Y + 67) = Cells(Z1, Y + 176) And Cells(X, Y + 68) = Cells(Z1, Y + 177) And Cells(X, Y + 69) = Cells(Z1, Y + 178) And Cells(X, Y + 70) = Cells(Z1, Y + 179) And Cells(X, Y + 71) = Cells(Z1, Y + 180) And Cells(X, Y + 72) = Cells(Z1, Y + 181) And _
Cells(X, Y + 73) = Cells(Z1, Y + 182) And Cells(X, Y + 74) = Cells(Z1, Y + 183) And Cells(X, Y + 75) = Cells(Z1, Y + 184) And Cells(X, Y + 76) = Cells(Z1, Y + 185) And Cells(X, Y + 77) = Cells(Z1, Y + 186) And Cells(X, Y + 78) = Cells(Z1, Y + 187) And _
Cells(X, Y + 79) = Cells(Z1, Y + 188) And Cells(X, Y + 80) = Cells(Z1, Y + 189) And Cells(X, Y + 81) = Cells(Z1, Y + 190) And Cells(X, Y + 82) = Cells(Z1, Y + 191) And Cells(X, Y + 83) = Cells(Z1, Y + 192) And Cells(X, Y + 84) = Cells(Z1, Y + 193) And _
Cells(X, Y + 85) = Cells(Z1, Y + 194) And Cells(X, Y + 86) = Cells(Z1, Y + 195) And Cells(X, Y + 87) = Cells(Z1, Y + 196) And Cells(X, Y + 88) = Cells(Z1, Y + 197) And Cells(X, Y + 89) = Cells(Z1, Y + 198) And Cells(X, Y + 90) = Cells(Z1, Y + 199) And _
Cells(X, Y + 91) = Cells(Z1, Y + 200) And Cells(X, Y + 92) = Cells(Z1, Y + 201) And Cells(X, Y + 93) = Cells(Z1, Y + 202) And Cells(X, Y + 94) = Cells(Z1, Y + 203) And Cells(X, Y + 95) = Cells(Z1, Y + 204) And Cells(X, Y + 96) = Cells(Z1, Y + 205) And _
Cells(X, Y + 97) = Cells(Z1, Y + 206) And Cells(X, Y + 98) = Cells(Z1, Y + 207) And Cells(X, Y + 99) = Cells(Z1, Y + 208) And Cells(X, Y + 100) = Cells(Z1, Y + 209) And Cells(X, Y + 101) = Cells(Z1, Y + 210) And Cells(X, Y + 102) = Cells(Z1, Y + 211) And _
Cells(X, Y + 103) = Cells(Z1, Y + 212) And Cells(X, Y + 104) = Cells(Z1, Y + 213) And Cells(X, Y + 105) = Cells(Z1, Y + 214) And Cells(X, Y + 106) = Cells(Z1, Y + 215) And Cells(X, Y + 107) = Cells(Z1, Y + 216) And Cells(X, Y + 108) = Cells(Z1, Y + 217) Then

Range(Cells(X, Y), Cells(X, Y + 108)).Interior.ColorIndex = 45 Range(Cells(Z1, Y + 110), Cells(Z1, Y + 217)).Interior.ColorIndex = 42 '全セルが一致したので比較元にオレンジ、比較先に水色を塗る X = X + 1 Z1 = 2 ElseIf Cells(Z1, Y + 110) = "" Then X = X + 1 Z1 = 2 Else Z1 = Z1 + 1

End If
Loop

配列変数を組んで入れていけば何とかなるのではないかと思いながら、
組むことができず、取り急ぎで組んだものです。

##比較データをどう使うか
差異のあるデータ・片方にしか存在しないデータを元に、ここには登場しない別のcsvファイルを点検修正する予定です。

##教えていただきたい事
・データの数的にマクロで比較する事が現実的かどうか。
(そもそも上記マクロがひどい内容だという事は重々承知しておりますが、書き直す時間なかなか取れず、件数の少ない別のcsvファイル間で処理ができ、最後に残ったこの大きなファイルに困っております。)

・Excel以外で同様の処理を行う方法はありますでしょうか?

以上となります。どなたかお知恵を拝借できないでしょうか?

bochan2👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/02/27 23:49

遅いとかいう話じゃなく、これ止まらないんじゃないですか? やりたいことを日本語で説明してください。 うまく動かないものを元にして作ったものは動かないものにしかなりません。
NextSt

2019/02/28 07:56

お返事ありがとうございます。 If Cells(X, Y + 1) = Cells(Z1, Y + 110) And~~~の部分がもっと少ない(比較データももっと少ない)ファイルだと、 10分程で処理が済んでおりまして、動く…はずと思い条件部分を加工したものになります。 「1~100列(比較元)と、101列~201列(比較先)で、比較元と比較先のデータを1行ずつ比較し、内容が一致したものに色を付ける」 これを目的に組んだつもりです。
Zuishin

2019/02/28 09:54

データによっては終了すると思いますが、データによっては無限ループになると思います。 だから「このデータでうまくいったから」というのは当てになりません。 途中 Z1 がいきなり 2 に戻っているところや、(2, 2) から評価を始めていたり、101 でなく 110 と比較しているところなど、不明なところがあります。
NextSt

2019/03/01 02:50

ありがとうございます。 仰られている内容を確認し比較データの構成部分に追記が必要だとわかりましたので、補足を致します。
NextSt

2019/03/01 03:11

追記というよりコード自体修正が必要ですね。 If Cells(X, Y + 1) = Cells(Z1, Y + 101)…に修正して後に続くものも値も修正します。 これだと全部対象なしになってしまう…。 逆に前のファイルがなんでうまく処理されてたのかわからなくなってきました。 ご指摘ありがとうございます、コードを編集してみます。
Zuishin

2019/03/01 03:23

コードに修正は必要でしょうが、どのみちそれが意図した通り動くかどうかはわからないわけですよね? これまでの回答が意図した動作になっているかどうかと、違っていれば数行のサンプルデータが必要ではないかと思います。
guest

回答5

0

これは明らかにawkの得意分野ですね。windowsでは馴染みが薄いかもしれませんが、今は簡単に使えるようにできます。

インストール不要!WindowsでLinuxコマンドを使う

次に以下のような感じのスクリプトをテキストエディタで書いてたとえばtest.awkというテキストファイルにセーブします。

BEGIN{FS=","; n=100} { for(i=1; i<=n; i++){ x=$i; y=$(i+n); if(x!=y){ printf "line %d: col %d = '%s'; col %d = '%s'\n", NR, i, x, i+n, y; } } }

上記に従えばawk -f test.awk 対象ファイル
とコマンドを入力すると値の不一致なデータとその行・列番号が出力されるはずです。
入力元ファイルはCSVファイルにコンバートしてあるものとこのコードは仮定していますが、本来はtab区切りデータを推奨したいところです。

やってみないと分かりませんが、たぶんvbaよりは速く結果が返ってくるんじゃないかなと思います。慣れればVBAなんてバカバカしくて使ってられなくなる…はず。

gnu awk4 on windows

さらに調べてみたところ、https://www.klabaster.com/freeware.htmで、gawk4.0のwindows版実行ファイルが配布されています。
gawk4.0にはFPATという組み込み変数が追加されており、「値の中に,が含まれるcsvを扱おうとすると困ってしまう」問題を実質的に解決できるようになっています。
参考:GNU AWKでCSVファイルを楽々あつかう組込変数FPATと、関数のインダイレクト呼び出し

ダウンロードしてexeファイルをpathの通ったところに置くだけですので、導入の簡単さではbusyboxと変わらず、機能面を考えるとこちらが良いでしょう。

これを利用して上記スクリプトを書き換えたものを示しておきます。

BEGIN{FPAT="([^,]+)|(\"[^\"]+\")"; n=100} { for(i=1; i<=n; i++){ x=$i; y=$(i+n); if(x!=y){ printf "line %d: col %d = '%s'; col %d = '%s'\n", NR, i, x, i+n, y; } } }

追記: 上記サイトから引用します。

このパターンでは、CSVファイルの規格にある「ダブルクォートで括られた中に改行を含めることが可能」というルールに対応することはできません。

このような中途半端な状態なのにCSVファイルを扱えると明言するのはおかしいのではないかという意見もありますが、gawkの開発は「完全を目指すのではなく9割をサクサクこなし、フィールドに改行を含むようなCSVファイルは専用のツールで処理すれば良い」という思想で進められました。

ようするに、いつでも使えるわけではないが、使えるときには使って簡単に片づけたらいいじゃんという発想です。awkとはそういうものです。awkが本件ではうまく使えない可能性はあるし、もっといい方法がある可能性もあります。

私はこれを唯一絶対最高の解決策だと主張したいわけではありません。しかし、条件が合うなら最短距離で問題を片づけられる可能性はあると考えています。何かごちゃごちゃ言っている人がいますが、まどわされず、ご自分の案件に使えるかどうかは質問者さんご自身が淡々と判断していただければと思います。

投稿2019/02/27 11:55

編集2019/03/01 04:43
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwbQzhMkhhgEmhU

2019/02/27 17:52

すみませんが、ミスリードにも程があると思ったので、低評価させてもらいました。理由を書けとのことだったので記載しておきます。 まずawk > VBAってことはありません。 awkは主にフィルタ処理を得意とする非力なスクリプト言語です。gawkでない素のawkは特に非力です。 用途は基本shell scriptからのテキスト整形です。 一般的なawkスクリプトではBEGIN節で全処理を入れるとかあんまりしません。 そもそも実際にまともなawkスクリプトを書ける人は稀です(基本ワンライナーが多いので)。私はたまたまshell/sed/awkしか使えないところで面倒なテキスト処理をする必要があったために、数百行のawkスクリプト(gawk)を結構作っていましたが、全くオススメする気になりません。 誤解を招くような書き方は止めましょう。 しかもインストール不要でもなんでもなく、WSLという巨大なモジュールのインストールが必須です。 バカバカしくてやってられないです。 なお、速度的にはExcelでCSVを読み込む時間が長そうなので、Excelが遅いと思います。ただし、VBAは速く書ければ、速度的にさほど遅い部類ではありません。WSLを入れてawkで処理するくらいなら、Windows環境ならpowershellかせめてvbsを使った方が簡単で速くて健全だと思います。
KojiDoi

2019/02/27 18:39

すみませんが、あなたのコメントこそ的外れです、完全に。 awkはおっしゃる通りテキスト処理に特化したスクリプト言語です。ただ非力ということはありません。行単位の処理なら十分高速です。本件は行単位で完結する処理なので元データが何十万件あろうとも問題ありません。awkにこそふさわしい処理内容ですよ。 そもそもBEGIN説に全処理を入れるなんて誰もやっていませんし。スクリプトは10行以下ですが? 数百行のawkがどうとか関係ない話を持ち出さないでくれませんかね。
wwbQzhMkhhgEmhU

2019/02/27 18:50 編集

BEGIN節かと思ってしまいました。すみません。 でも主旨とは無関係です。 ではCSVのエスケープ処理を入れてください。簡単に出来ますか? コードはシフトJISを前提としてください。 私がコード行数を書いたのは、まともなスクリプトを書ける人が稀という意味です。そんな言語を他人に勧めるのはどうかと思いますよ。普通にLinux環境でCSVの処理をさせるなら昔はperl、今はpythonかrubyくらいです。
KojiDoi

2019/02/27 19:13

> ではCSVのエスケープ処理を入れてください。簡単に出来ますか? ですから、なんで関係ない話を持ち込むのですか? あなたがawkが嫌いらしいことは判りましたが、使えるときには使えるという事実は謙虚に受け入れてほしいものです。スクリプトが書けないなら勉強すればいいことです。シンプルな言語なので、VBAをいじるほどの能力があるなら、30分もあれば私が上で提案した程度のスクリプトは組めるようになるはずです。ちなみにこの処理ならperlやpythonでももちろんできますが、awkの方が高速なはずですよ。
wwbQzhMkhhgEmhU

2019/02/27 19:28

関係なくないですよ。CSVをExcelで読ませた場合と同じ判定にするのに必要です。awkだと一旦分割したのを繋げるなどの処理が必要になり、処理が難しくなる上に、エンコーディングの変換にロケールの追加が必要になるはずです。pythonやperlやrubyなら何も考えずに簡単に実装出来るんです。 私はawkを良く使います。複雑な正規表現はperlにすることもありますが、簡単な整形はawkで済ませますよ。でも適材適所です。今回のようにCSVをparseするような処理はawkには向いていません。Field Separatorで分割する程度のことはコマンドプロンプトのFOR文でも出来るので、WSL入れてawkが速いとか言ってる間にバッチファイル実行して終わりです。速度は測ってみないと何とも言えません。仕組みが違うのでぶっちゃけどっちが速いか分かりません。まあそもそも同じことが出来る前提の処理でないと比較できないですけどね。
KojiDoi

2019/02/27 19:32

あのー。WSLってなんですか?
wwbQzhMkhhgEmhU

2019/02/27 19:42

Windows Subsystem for Linuxのことです。あなたが紹介しているリンク先に書いてありますよ。
KojiDoi

2019/02/27 19:50

書いてあるのは前置きで、本題とは関係ありません。busybox.exeというバイナリファイルを一つダウンロードして、パスの通ったディレクトリに置き、windows10を再起動するだけで普通に使えますよ。
KojiDoi

2019/02/27 19:53

あとロケールがどうとかいうなら、明示的な内部コード変換が必須なperlのほうがよほど面倒じゃないですかね。そもそも同じファイルの中に書いてある文字列の異動を判定するのにエンコーディングの変換なんか必要ないですけど。正規表現も必要ない。適材適所という概念をご存知なら、それを自分自身の判断に応用なさってください。
wwbQzhMkhhgEmhU

2019/02/27 20:20 編集

busyboxはこういう用途に使うものではありません。限られた資源で、簡単なshell環境を実現したいときに使用する限定的なものです。sedにせよ、awkにせよ、他のコマンドにせよ、機能がとても限られており、普通に使うものではありません。主な用途は、kernel起動時のRAMディスク内に置いておき、/のマウントに失敗したときなどに使用する、とかです。機能も異常系もメッセージも大幅に削られたものを、この用途で使うとかありえません。 awkも普通にロケールを使っており、文字コードはデフォルト(の環境変数設定)だとutf-8で動いてしまうだけです。それだとシフトJISは正しくparseできない、という話です。面倒だからバグってもいい、ってことならそれでも構いませんが。 正規表現はCSVの正しいparseに必要です。恐らくCSVのエスケープ仕様からご存知ないのだと思いますが、CSVのフィールドには、フィールドセパレータやレコードセパレータも含めることができます。このためには、実際にパースされないように、エスケープが必要になります。エスケープ方法は簡単で、エスケープ文字(通常はダブルクォート)で、フィールド値を囲むだけです。ただし、そうするとエスケープ文字をフィールド値に入れられなくなるので、エスケープ中のエスケープ文字はエスケープ文字を2つ並べて1文字分と換算します。こうすることで、フィールド値には全ての文字列を使用することが可能になります。awkでこれを実現するためには、一旦RS/FSで区切られたレコード/フィールドをエスケープ文字の有無によりくっつけるなどの処理が必要になります。これを正しく行うためには、文字単位に処理をできることが必要であり、そのためには正しい文字エンコーディングを知ることが必須になる、ということです。特にシフトJISだとですが。そしてその際に正規表現の使用が有効だということです。 というわけで、まずは話している内容を理解してください。
KojiDoi

2019/02/27 20:20

折角なので17万行200桁のデータファイルを実際に作って実行してみました。マシンは8年前に10万円で買ったcore-i5 2400@3.10Ghz のwinodws10マシンで、すべてのファイルはSSDに置いた状態です。busybox版awkでは2分で処理を終了しました。ついでにcygwin版awkでもやってみましたが、こちらは5分半でした。ごくおおざっぱな計測ではありますが。
wwbQzhMkhhgEmhU

2019/02/27 20:25

正しくない結果に価値を見出したいならどうぞ勝手にやってください。
KojiDoi

2019/02/27 20:29

あなたにとってありえないということはわかりました。あなたは無理やりに勝手な仮定を置いているだけですね。WSLの話をはじめ、いろいろ勘違いなさってますし。私は十分に使えると判断します。あとは質問者さんの判断です。
wwbQzhMkhhgEmhU

2019/02/27 20:39

私は何も勘違いなどしていませんよ。 busyboxを使った場合、ロケールはどうなるのか説明できるんですか? cygwinならロケールがちゃんと存在することを確認した上で、ja_JP.CP932で動作させてくださいね。 なお、cygwinならmingwの方がファイル処理は速いはずです。
KojiDoi

2019/02/27 20:45

あなたの過去のやり取りを読ませてもらい、だいたい背景がわかったような気がします。本題と関係のない話にはこれ以上お付き合いいたしません。
wwbQzhMkhhgEmhU

2019/02/27 20:52 編集

KojiDoiさんは理解してくれず、弁明すらないので、質問者さん観点での補足を一応入れておきます。。 シフトJISの2バイト目は0x40~0x7e、 0x80~0xfcなので、CSVファイルの区切り文字やエスケープ文字がそこに含まれなければ、もしCロケールで処理されているなら、文字の境界を間違えても、区切り文字を取り違えることはありません(UTF-8だと読み飛ばされる可能性があります)。 ただし、フィールド値の中に区切り文字(改行も含む)などが入る場合は、正しく動作しないので注意してください。
KojiDoi

2019/02/27 21:09

WSLの話が関係ないってところは理解してくれたんですかね? 弁明すらありませんが。
wwbQzhMkhhgEmhU

2019/02/27 21:22

理解も何もあなたがWSLを知らなかっただけでしょう。 リンク先には書いてあり、あなたはbusyboxのリンクすら貼ってませんからね。 何度も書きますが、busyboxは普段遣いのツールではありません。 何かのトラブルで/のマウントが出来ないような状況でメンテナンスするような人が緊急避難的に使うツールです。個人的にはcoLinuxでカーネルを変えたくてフルビルドしたときによくお世話になりました。 ただし、それはinitrdの中に入っていたからです。そんなツールを普段使いにする必要はありません。 もっとまともに動くものがあります。
KojiDoi

2019/02/27 21:47

で、関係ない話を持ち出していたことは理解できたのですか?
wwbQzhMkhhgEmhU

2019/02/27 22:08

全部関係している話なことをあなたが理解できていないだけでしょう。 WSLを持ち出してるのは私ではなくあなたですよ?あなたのリンク先に書かれてるんですよ?
Zuishin

2019/02/28 00:38 編集

WSL はリンク先で「…と言った環境ではやはりWSLも選択肢から外さざるを得ません。」と書いてあります。これを WSL の話とは取れません。 普段使いするかどうかも本題ではなく、このデータを処理できるかどうかが本題です。 https://sites.google.com/site/fudist/Home/grep/sjis-damemoji-jp/table カンマ区切りの CSV ならシフト JIS で問題ありません。 失礼。この部分は正規表現のメタ文字しか考慮していないので取り消します。busybox の awk がマルチバイト文字対策していないのなら問題があります。 VBA と awk のどちらが優れているかも本題ではありません。VBA で時間のかかる処理を awk で数分で処理できたなら一つの立派な回答だと思います。 ただこの質問の問題が VBA のせいかどうかについては疑問がありますから、VBA でもっと早くできるならそれを一つの回答として答えればそれで問題ないと思います。
wwbQzhMkhhgEmhU

2019/02/28 01:10

あ、すみません。WSLを紹介してたのではなかったのですね。後ろにbusyboxがあったと。 そこまで読んでなかったです。何にせよ、busyboxによる文字列処理において、ロケールがどういう扱いなのかは確認しないと使用すべきではありません。まぁ10中8,9はC固定だと思いますが。それを確認せずに元文書のエンコーディング、区切り文字、エスケープ文字、エスケープ文字の使用有無、全て未確認のまま、まともに日本語が扱えるか分からないwindows環境のawkだけ勧め、しかも実行はbusyboxとかありえないと思います。 速度については比較対象がなければ評価のしようがないですね。残念ですが、今Excelは使えないのでそこはどうしようもないです。なので今ちょっとPowerShellでやってみてるのですが、多少遅そうではありますね。こちらで用意したデータ、かつ私の環境(Ryzen 5/1400)で2分?くらいです。質問者さんの興味があれば載せておきます。
NextSt

2019/02/28 08:02

お返事ありがとうございます。 返事が遅くなり申し訳ありません。 今晩改めて確認させていただきます。
wwbQzhMkhhgEmhU

2019/02/28 22:06

→KojiDoiさんへ なんでawkに拘るのやら。。。 あなたが好きで使うのは自由ですが、要件を満たしていることが分からないものを勧めないでください。 疑念は以下の4つです (1)GNU awk=gawkだと理解しているかどうか (2)ロケール指定のことを理解しているかどうか (3)CSVのクォートとエスケープのことを理解してるかどうか (4)正規表現を理解しているかどうか に疑問が残ります。 (1)GNU awk=gawkについて GNU awkはplatformによっては、gawkで起動したときだけ、固有の機能を発現するようにデフォルト設定していたくらいです(--traditional)。例えばubuntuで普通にインストールしているawkはgawkではなく、mawkだったりします。もしubuntuで使うならapt install gawkしないと使えない特殊なawkだということも、理解してください。何が言いたいかというと、awkを勧めている文脈なら、gawkを出す場合は、特殊なawkだということをきちんと周知させて欲しいということです。今回使用しているFPAT組込変数は、gawkの拡張仕様の一部です。 (2)ロケール指定のことを理解しているかどうか awkにはエンコーディング指定ができる明示的なI/Fが存在しません。これは動作しているロケール以外にエンコーディングを限定する手段がないということです。UnixライクなOSの場合、LC_*やLANG環境変数の値によって、内部の文字列処理を変更するということです。テキスト処理の第一段階は文字の特定です。1文字の境界に誤りがあると、テキスト処理は正しく行えません。文字化けを起こす、区切り文字を読み飛ばすなど、重要な問題が起こります。エンコーディングの指定が分からないということは、返ってくる結果が全く信用ならないのと同じです。 (3)CSVのクォートとエスケープのことを理解してるかどうか CSVのフィールド値に任意の文字列を入れたい場合、クォートとエスケープが必須になります。昨日も書きましたが、ダブルクォートで括って、さらにそれを記述するときは重ねる、というルールです。私が書いた回答では、例として,を間に含むケースを入れていますが、対応しなければならないルールはそれだけではありません。Excel含む他の全てのCSVパーサはそれらを処理するのです。awk/gawkだけがそれを正しく処理できません。例えば、カンマが連続しているケースを読み飛ばします。例えば改行コードを入れられません。他にも探せばいくらでも出てきます。正規表現だけでは限界なのです。昨日書いたように、これらを後から更に解析して前出のトークンと結合したりなどの処理が必要になります。awkでやる意味なんてないわけです。 (4)正規表現を理解しているかどうか 来るデータが分かっている状態で、エラーチェックもせずに入力を処理していい状況なら、限定的に使用できるのがgawkデフォルトのCSV処理(FPATを使用したフィールドのparse)です。もちろんインストール後に日本語用のまともな設定がされた環境に限りますが。常識的に考えると、昨日あれだけ説明したにもかかわらず、まともな返事をしていない上に、殊更まだgawkを勧めていることを考えると、この方は正規表現を理解していないのではないかと考えざるを得ません。いくらでも穴があることはすぐに分かるからです。 以上の疑問に正面からお答え頂かない限り、すみませんが、低評価を取り消せないし、今回の問題にawkを勧めるなんてバカげてると言わざるを得ません。
KojiDoi

2019/03/01 04:23

wwbQzhMkhhgEmhUさん。あなたの質問にこれ以上逐一反応する必要を認めません。私は問題をちゃんと把握しています。あなたが後から関係ない問題を持ち出してあーだこーだ言い続けているだけです。まあ評価については勝手にしてください。 awkが万能だというつもりはありませんが、それは使えるときには使えるということを全否定する理由にはなりません。質問者氏が今現在抱えている案件に使えるかどうかは質問者氏が判断すればいいことで、貴方が判断することではありません。
wwbQzhMkhhgEmhU

2019/03/01 06:15

きちんと正面から回答してください。4つとも全く回答できていませんよ。 質問者が判断すればいいと言いつつ、「どこまで使えるのか全く判断材料がないもの」をどうしてあなたが勧め続けるのか、理由に見当が付かないのです。9割なんてとんでもない。 問題の把握ができているなら正面から回答してください。問題点を提示しています。自分がどの程度使えるのか全く把握できてないものを、他人に勧めるなんて、無責任にも程がある、ただの詐欺だと言っているのです。
KojiDoi

2019/03/01 06:43

あなたの質問にこれ以上逐一反応する必要を認めません。
wwbQzhMkhhgEmhU

2019/03/01 07:03

クリティカルな問題に対する回答すらできないのであれば、始めから勧めないでください。
guest

0

何か音沙汰がないし、質問者さんは他のやり方も模索してるとのことであり、また質問者さんのマクロを配列にしたバージョンを誰も作ってないので、awk方式ではカンマ付き数字あるだけで終わるし、いろいろ考慮した結果、回答することにしました。

■サンプルデータ作成用powershell

PowerShell

1$fixedRow= New-Object PSObject 2$fixedRow | Add-Member -MemberType NoteProperty -Name "dummy" -Value 'ダミー' 3 4$colCount=109 5$rowCount=17000 6 7foreach($pat in @("left", "right")) { 8 for ($col=0; $col -lt $colCount; $col++) { 9 $fixedRow | Add-Member -MemberType NoteProperty -Name ($pat+($col+1)) -Value (([string]$col) + ",000") 10 } 11} 12 13@(for ($row = 0; $row -lt $rowCount; ++$row) { 14 $fixedRow 15}) | ConvertTo-Csv -NoTypeInformation | select -Skip 1 | Out-File -Encoding Default data.csv 16

最左列をダミー、次の109列分のデータが左側、次の109列分のデータを右側として、17000行(1/10サイズ)のデータをdata.csvに作成している。ファイルサイズで32MB程度。
これをcreate_data.ps1とした場合、

powershell -ExecutionPolicy RemoteSigned -File create_data.ps1

とかで実行できるはず。

■CSV左右比較同一行削除フィルタpowershell

PowerShell

1$header=New-Object System.Collections.ArrayList 2#$leftColName=New-Object System.Collections.ArrayList 3#$rightColName=New-Object System.Collections.ArrayList 4 5$header.add('dummy') > $null 6$colCount=109 7 8$left = "left" 9$right = "right" 10 11foreach($colPrefix in @($left, $right)) { 12 for ($i = 0; $i -lt $colCount; ++$i) { 13 $header.add($colPrefix + $i) > $null 14 } 15} 16# 汎用コード(A)...遅いので未使用 17#for ($i = 0; $i -lt $colCount; ++$i) { 18# $leftColName.Add($left+$i) > $null 19# $rightColName.Add($right+$i) > $null 20#} 21 22Import-Csv -Encoding default -Path '.\data.csv' -Header $header | 23where { 24 # 汎用コード(B)...遅いので未使用 25 #$result = $false 26 #for ($i = 0; $i -lt $colCount; ++$i) { 27 # $result = $result -or ($_.($leftColName[$i]) -ne $_.($rightColName[$i])) 28 #} 29 #$result; 30 31 $_.left0 -ne $_.right0 -or 32 $_.left1 -ne $_.right1 -or 33 $_.left2 -ne $_.right2 -or 34 $_.left3 -ne $_.right3 -or 35 $_.left4 -ne $_.right4 -or 36 $_.left5 -ne $_.right5 -or 37 $_.left6 -ne $_.right6 -or 38 $_.left7 -ne $_.right7 -or 39 $_.left8 -ne $_.right8 -or 40 $_.left9 -ne $_.right9 -or 41 $_.left10 -ne $_.right10 -or 42 $_.left11 -ne $_.right11 -or 43 $_.left12 -ne $_.right12 -or 44 $_.left13 -ne $_.right13 -or 45 $_.left14 -ne $_.right14 -or 46 $_.left15 -ne $_.right15 -or 47 $_.left16 -ne $_.right16 -or 48 $_.left17 -ne $_.right17 -or 49 $_.left18 -ne $_.right18 -or 50 $_.left19 -ne $_.right19 -or 51 $_.left20 -ne $_.right20 -or 52 $_.left21 -ne $_.right21 -or 53 $_.left22 -ne $_.right22 -or 54 $_.left23 -ne $_.right23 -or 55 $_.left24 -ne $_.right24 -or 56 $_.left25 -ne $_.right25 -or 57 $_.left26 -ne $_.right26 -or 58 $_.left27 -ne $_.right27 -or 59 $_.left28 -ne $_.right28 -or 60 $_.left29 -ne $_.right29 -or 61 $_.left30 -ne $_.right30 -or 62 $_.left31 -ne $_.right31 -or 63 $_.left32 -ne $_.right32 -or 64 $_.left33 -ne $_.right33 -or 65 $_.left34 -ne $_.right34 -or 66 $_.left35 -ne $_.right35 -or 67 $_.left36 -ne $_.right36 -or 68 $_.left37 -ne $_.right37 -or 69 $_.left38 -ne $_.right38 -or 70 $_.left39 -ne $_.right39 -or 71 $_.left40 -ne $_.right40 -or 72 $_.left41 -ne $_.right41 -or 73 $_.left42 -ne $_.right42 -or 74 $_.left43 -ne $_.right43 -or 75 $_.left44 -ne $_.right44 -or 76 $_.left45 -ne $_.right45 -or 77 $_.left46 -ne $_.right46 -or 78 $_.left47 -ne $_.right47 -or 79 $_.left48 -ne $_.right48 -or 80 $_.left49 -ne $_.right49 -or 81 $_.left50 -ne $_.right50 -or 82 $_.left51 -ne $_.right51 -or 83 $_.left52 -ne $_.right52 -or 84 $_.left53 -ne $_.right53 -or 85 $_.left54 -ne $_.right54 -or 86 $_.left55 -ne $_.right55 -or 87 $_.left56 -ne $_.right56 -or 88 $_.left57 -ne $_.right57 -or 89 $_.left58 -ne $_.right58 -or 90 $_.left59 -ne $_.right59 -or 91 $_.left60 -ne $_.right60 -or 92 $_.left61 -ne $_.right61 -or 93 $_.left62 -ne $_.right62 -or 94 $_.left63 -ne $_.right63 -or 95 $_.left64 -ne $_.right64 -or 96 $_.left65 -ne $_.right65 -or 97 $_.left66 -ne $_.right66 -or 98 $_.left67 -ne $_.right67 -or 99 $_.left68 -ne $_.right68 -or 100 $_.left69 -ne $_.right69 -or 101 $_.left70 -ne $_.right70 -or 102 $_.left71 -ne $_.right71 -or 103 $_.left72 -ne $_.right72 -or 104 $_.left73 -ne $_.right73 -or 105 $_.left74 -ne $_.right74 -or 106 $_.left75 -ne $_.right75 -or 107 $_.left76 -ne $_.right76 -or 108 $_.left77 -ne $_.right77 -or 109 $_.left78 -ne $_.right78 -or 110 $_.left79 -ne $_.right79 -or 111 $_.left80 -ne $_.right80 -or 112 $_.left81 -ne $_.right81 -or 113 $_.left82 -ne $_.right82 -or 114 $_.left83 -ne $_.right83 -or 115 $_.left84 -ne $_.right84 -or 116 $_.left85 -ne $_.right85 -or 117 $_.left86 -ne $_.right86 -or 118 $_.left87 -ne $_.right87 -or 119 $_.left88 -ne $_.right88 -or 120 $_.left89 -ne $_.right89 -or 121 $_.left90 -ne $_.right90 -or 122 $_.left91 -ne $_.right91 -or 123 $_.left92 -ne $_.right92 -or 124 $_.left93 -ne $_.right93 -or 125 $_.left94 -ne $_.right94 -or 126 $_.left95 -ne $_.right95 -or 127 $_.left96 -ne $_.right96 -or 128 $_.left97 -ne $_.right97 -or 129 $_.left98 -ne $_.right98 -or 130 $_.left99 -ne $_.right99 -or 131 $_.left100 -ne $_.right100 -or 132 $_.left101 -ne $_.right101 -or 133 $_.left102 -ne $_.right102 -or 134 $_.left103 -ne $_.right103 -or 135 $_.left104 -ne $_.right104 -or 136 $_.left105 -ne $_.right105 -or 137 $_.left106 -ne $_.right106 -or 138 $_.left107 -ne $_.right107 -or 139 $_.left108 -ne $_.right108 140} | ConvertTo-Csv -NoTypeInformation | select -Skip 1 | Out-File -Encoding Default diff.csv 141

data.csvを読んで左右を比較し、同一行はフィルタして、違ってるものをdiff.csvとして吐き出す。ぶっちゃけ遅い。
これをfilter_data.ps1とした場合、

powershell -ExecutionPolicy RemoteSigned -File filter_data.ps1

とかで実行できるはず。

■CSV左右比較同一行削除フィルタpython3スクリプト

python

1import csv 2 3target_file = 'data.csv' 4diff_file = 'diff.csv' 5encoding = 'cp932' 6delimiter = ',' 7 8with open(target_file, 'r', encoding=encoding, newline='') as f: 9 reader = csv.reader(f, delimiter=delimiter) 10 with open(diff_file, 'w', encoding=encoding, newline='') as g: 11 writer = csv.writer(g, delimiter=delimiter) 12 13 offset = 1 14 count = 109 15 for row in reader: 16 result = False 17 for i in range(count): 18 result = result or (row[offset + i] != row[offset + count + i]) 19 if result: 20 writer.writerow(row) 21

同じことをするpython3スクリプト。CSVのクォート仕様が最小限なので、出力は少し異なる。
実行にはpython3.Xが必要。これをdiff.pyとした場合、

python diff.py

で実行できる(環境によってはpythonでなくpython3。適宜読み替え)。

■読込形式と出力を揃えたawkスクリプト

awk

1BEGIN{FS=","; n=109} 2{ 3 is_diff = 0; 4 for(i=1; i<=n; i++){ 5 x=$(i+1); y=$(i+n+1); 6 if(x!=y){ 7 is_diff = 1; 8 break; 9 } 10 } 11 if (is_diff == 1) { 12 printf $0 "\n"; 13 } 14} 15

クォートを処理できないので、正しくparseできず、全てを異なる判定にしてしまう。動かしたければフィールド値にカンマを入れないように元データを修正しないとダメ。オススメは全くしないが、実行にはbusyboxを使いたいらしい。
これをdiff.awkとした場合、

busybox64.exe awk -f diff.awk data.csv > diff.csv

のように実行できる(インストールすると邪魔なファイルができるのでしてない)。

■1/10サイズの測定(32MB)
awk: 1,660ms
python: 1,647ms
powershell: 14,272ms
※ただしawk版は正しく処理できていない
※測定は繰り返し行い、最低値を使用(ディスクアクセスはキャッシュされたものが使われ、外部の影響も最小に)。

投稿2019/02/28 07:16

wwbQzhMkhhgEmhU

総合スコア343

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NextSt

2019/02/28 07:59

お返事ありがとうございます。 タイミング悪く定例処理が重なってしまい、 お返事を多くの方からいただいているのは確認していたのですが、 お返事が返せずじまいでした。 今日の夜に再度確認させていただきます。 [PS] pythonの例を書き込んでいただきありがとうございます。 実は勉強したくて積み本にしてる1冊がpython本です。 後で必ず確認させていただきます。
guest

0

VBAでやるような処理ではないと思いますが、100セルが全て同じかどうかしか見ていないようですし、csvファイルといっても両ファイルの出力形式が同じなら、ファイルのテキスト比較でも要件を満たすのではないですか?

片方の行抜けは想定せず、同一行同士のテキスト比較しかしないのであれば、VBAでも容易に書くことはできます。

VBA

1 Open "比較元csvファイル名" For Input As #1 2 Open "比較先csvファイル名" For Input As #2 3 4 Do Until EOF(1) 5 Line Input #1, hoge1 6 7 If Not EOF(2) Then 8 Line Input #2, hoge2 9 Else 10 hoge2 = "" 11 End If 12 13 If hoge1 <> hoge2 Then 14 'ここに不一致時の処理を書く 15 End If 16 Loop 17 18 Close #1 19 Close #2

とはいえ、安易すぎるコードかもしれません。

投稿2019/02/27 12:49

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwbQzhMkhhgEmhU

2019/02/27 18:08

CSVにはダブルクォートでエスケープする記述が書けるのと、Excelがアホみたいに読み込み時に変換をかけるので、Excelでセル値を比較する場合と結果が異なる可能性があります。 何を正しい仕様とするかによりますが、そこの前提も必要です。
退会済みユーザー

退会済みユーザー

2019/02/27 22:33

そうですね。 その辺りの説明が面倒になってしまい、出力形式が同じとかテキスト比較とかの表現に含めてしまいましたが、説明不足だったかもしれませんね。
NextSt

2019/02/28 08:00

お返事ありがとうございます。 定例処理が重なってしまい、お返事が返せず申し訳ありません。 今晩確認させていただきます。
guest

0

・データの数的にマクロで比較する事が現実的かどうか。

(そもそも上記マクロがひどい内容だという事は重々承知しておりますが、書き直す時間なかなか取れず、件数の少ない別のcsvファイル間で処理ができ、最後に残ったこの大きなファイルに困っております。)

難しくはないと思うのですが件数が多い&条件が複数ある(というか多すぎる)ので時間がかかるのは仕方ないように思えます。
条件はすべてAndのようですので条件部分を書き直すといくらか時間が短縮される&処理が軽くなるかもしれません。
ちなみに私なら比較元が空白である事を確認したら全処理を止める記述のあとに
以下のように先に全セルが一致するか判定し、その判定結果をさらに判定するようにします。

VBA

1 Dim i As Long 2 Dim j As Long 3 4 i = 1 5 j = 110 6 7 Dim flg As Boolean 8 flg = True 9 10 ' すべて同じなのか先に判定してしまう。 11 Do While flg 12 13 '比較元を左、比較先を右とする。 14 If Cells(X, Y + i) = Cells(Z1, Y + j) Then 15 16 ' 比較元と比較先が同じ場合 17 ' 隣の列に移動 18 i = i + 1 19 j = j + 1 20 21 'iが109になった場合は処理を抜ける 22 If i = 109 Then 23 24 Exit Do 25 26 End If 27 28 Else 29 30 ' 比較元と比較先が同じではない場合 31 flg = False 32 33 End If 34 35 Loop

flgがfalseになった場合は全セルが一致しなかった、ということになります。
たくさん書いたIf文の条件はこのflgに置き換えれば良いと思います。

・Excel以外で同様の処理を行う方法はありますでしょうか?

差分を比較するツール(例えばWinMergeとか)を使えば差分の確認だけならできます。

投稿2019/02/27 11:15

編集2019/02/27 11:30
chibr

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chibr

2019/02/27 11:25

すべての動作までは確認していないのでもし何かありましたらこちらにコメントを投稿してくだされば。
NextSt

2019/02/28 08:05

お返事ありがとうございます。 昨日の晩に別業務をしながら、お返事内容をざっくり読ませていただき、 行丸ごとしなくともいいというのは、確かに仰られている通りだなぁ…と思いながら、 別の業務に押されてお返事が書けませんでした。 今晩改めて確認させていただきます。
chibr

2019/02/28 12:47

お忙しいなかコメントありがとうございます。 もし引き続きVBAで実現したい(改良したい)と考えているのであれば力になりますのでコメントください。よろしくお願いいたします。
guest

0

こんにちは。よろしくおねがいいたします。
比較対象のA.csvとB.csvで、それぞれの行が単純に完全一致しているかどうかを見るだけでいいなら、1~100列目のデータをつないでしまって、すごく長〜い文字列にしてしまい、それをA.csv対B.csvで比較してしまえばいいのでは?と考えました。
CSVに入っているデータは日付や数値や文字列などさまざまある、ということですが、CSVであるかぎりは全部”文字列"なので、単純比較が可能なのでは?と考えました。

それで考えてみたのが、以下のコードです。
A.CSVとB.CSVを、GetOpenFilenameで選択して開くようにしています。

不一致が発見されたら、"レポートシート"の1100列目にA.CSVの内容を、101200列目にB.CSVの内容を転記します。
さらに、不一致の発見されたデータのペアにおいて、セルを黄色にしています。

これで私のほうで、1000行100列ぐらいのCSVでテストしましたが、成功しています。

VBA

1Option Explicit 2 3Sub Compare2CSVs() 4'2個のCSV(PartA_CSV、PartB_CSV)の、それぞれ1~100列目の内容を比較する 5'不一致があれば、その行をレポートシートに出力する 6'不一致のある部分のセルを黄色にする 7 8Dim ReportSheet As Worksheet 9Set ReportSheet = ThisWorkbook.Worksheets("レポートシート") 10 11Dim PartA_CSV As String 12Dim PartB_CSV As String 13 14Dim I As Long, J As Long 15 16Dim r As Long 'レポートシートの行番号です 17 18'CSVの1行ぶんの文字列です 19Dim strCSV_A As String 20Dim strCSV_B As String 21 22'CSVの1行ぶんを、配列に格納するためのものです 23Dim ArrCSV_A As Variant 24Dim ArrCSV_B As Variant 25 26'100列分の内容を、ひとかたまりにします 27Dim VeryLongString_A As Variant 28Dim VeryLongString_B As Variant 29 30 31'PartA_CSVを開きます 32PartA_CSV = Application.GetOpenFilename("CSVファイル,*.csv", Title:="PartAのCSVを選択してください") 33 34'うっかりキャンセルボタンを押された場合の処理 35If PartA_CSV = "False" Then 36 MsgBox "キャンセルされました" 37 Exit Sub 38End If 39 40'PartB_CSVを開きます 41PartB_CSV = Application.GetOpenFilename("CSVファイル,*.csv", Title:="PartBのCSVを選択してください") 42 43'うっかりキャンセルボタンを押された場合の処理 44If PartB_CSV = "False" Then 45 MsgBox "キャンセルされました" 46 Exit Sub 47End If 48 49r = 1 50 51'PartAのCSVファイルを開きます 52Open PartA_CSV For Input As #1 53 54'PartBのCSVファイルを開きます 55Open PartB_CSV For Input As #2 56 57Do Until EOF(1) 58 59 VeryLongString_A = "" 60 VeryLongString_B = "" 61 62 Line Input #1, strCSV_A 63 64 'PartA_CSVの一行分を、100個の配列に格納します 65 ArrCSV_A = Split(strCSV_A, ",") 66 67 For I = 0 To CSVColumnLength - 1 68 '100個の配列の内容を、一個の長〜い文字列にします 69 VeryLongString_A = VeryLongString_A & ArrCSV_A(I) 70 Next I 71 72 Line Input #2, strCSV_B 73 74 'PartB_CSVの一行分を、100個の配列に格納します 75 ArrCSV_B = Split(strCSV_B, ",") 76 77 For I = 0 To 100 - 1 78 '100個の配列の内容を、一個の長〜い文字列にします 79 VeryLongString_B = VeryLongString_B & ArrCSV_B(I) 80 Next I 81 82 '2つの長〜い文字列を比較します 83 If VeryLongString_A <> VeryLongString_B Then 84 85 For J = 1 To 100 86 '1~100列目に、PartAの内容を転記します 87 ReportSheet.Cells(r, J) = ArrCSV_A(J - 1) 88 '101~200列目に、PartBの内容を転記します 89 ReportSheet.Cells(r, 100 + J) = ArrCSV_B(J - 1) 90 91 '不一致している部分がわかりやすいようにセルを黄色にします 92 If ArrCSV_A(J - 1) <> ArrCSV_B(J - 1) Then 93 ReportSheet.Cells(r, J).Interior.Color = vbYellow 94 ReportSheet.Cells(r, 100 + J).Interior.Color = vbYellow 95 End If 96 97 Next J 98 99 'ここで行送りします 100 r = r + 1 101 End If 102 103 'CSVファイルの次の行へシフトします 104Loop 105 106'PartAのCSVファイルを閉じます 107Close #1 108 109'PartBのCSVファイルを閉じます 110Close #2 111 112'結果のレポートシートをアクティベートします 113ReportSheet.Activate 114 115End Sub 116

投稿2020/02/16 07:03

AkiSaito

総合スコア110

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問