プロが教える店舗&オフィスのセキュリティ対策術

csvファイルの内容は、
"ID_A","ID_B","C","D","E" の5列でできたCSVがあります。
1行目は項目名です。
※デフォルトではShift-JIS、改行LFですが、可変可能です。

IDは13桁で、アルファベット大文字小文字、数字が入り混じっています。
ID_AとID_Bはほぼ同一なのですが稀に異なる場合があるのでそれだけ抽出したいのです。

CSVを選択して、ID_AとID_Bが異なる場合のみシートに書き出すようにするには
どうしたらよいでしょうか?
問題は、このCSVは300万行以上あるのでExcelシートで開くには分割する必要があり、
マクロで必要行だけ抽出できれば助かるのですが。。。
※また、最下行には7行のフッター情報が記載されており無視する必要があります。
よろしくお願いいたします。

A 回答 (13件中11~13件)

念のための確認です。


① 1行目の項目名は必要ですか?
② 1,2列目は半角13桁固定で良いですか?
③ フッターの抽出ですが「1行が5列でないなら終了」で良いですか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
①あった方が良いですが無くても結構です。後で手作業で挿入します。
②Yesです。それ以降の項目はサンプルなので実際は桁数は異なります。
③その条件で合ってると思います。もっと細かく言うと、2行の空改行+5行の文字列で7行のフッターと申し上げました。
よろしくお願いいたします。

お礼日時:2020/03/04 12:04

ん?


普通にテキストファイルに対して、行単位の処理を行って「別のファイルに抽出」するようにすれば良いだけで、
そこにExcelやらVBAは不要だよ。

例えば、souce.csv から、「abc」の文字を含む行だけを取り出したいなら、
コマンドプロンプトで、

>find "abc" souce.csv >> make.scv

とすれば、make.csv ファイルに「abc」のテキストを含んだ行だけが抽出される。
いや、VBAの制限なんて無い。マジで。


・・・本題・・・

1カラム目(ID_A)と2カラム目(ID_B)が異なる行だけを抽出したいということなので、ちょっと工夫が必要。
findを使う時と同様にコマンドプロンプトの、
「forコマンド」の /f とそのオプションを使って1行をカラムで分けてしまおう。

>for /f "tokens=1,2,3,4,5 delims=, ” %i in ( souse.csv ) do ( if not %%i==%%j ( @echo %%i,%%j,%%k,%%l,%%m >> make.csv ) )

こんな感じになる。
何をやっているのかを、コマンドプロンプトの上で /? を付けて起動して【必ず】使い方を確認してください。
悪戯で元のファイルを消してしまうようなコマンドを示されたらアウトだろ?
>for /?
これでコマンドの使い方を確認できる。

ポイントは delims で区切り文字にカンマを指定し、tokens で5カラムあることを宣言してしまうということ。
あとは1カラム目と2カラム目が等しくなければカンマで区切った文字列を make.csv に出力するという単純作業。
(これ、環境変数は %i しか宣言してないけど、そこから連続して5つ使うことを tokens で指定しているので、いきなり %j とか出てきても問題ない)

こんな感じで、コマンド1行で済ませられるんだ。
VBAでやってたら凄く面倒だよ。


・・・余談・・・

いつもなら「自分で作れるようにがんばれ」と言うところですが、
流石にこれを自力で作れとは言わない。
急いでいるということなんで、基礎が無い人には無理な話だからね。
代わりにVBAが分かるという前提なので、正解を書いてそれを確認させるようにしています。

あと、300万行ってことなんで処理に時間はかかる。
echoをオフってるのでサイレントに処理が進むため、ハングアップしたような錯覚に陥りますが、慌てないでください。
20行程度の試験用のファイルを作って、まずはそれで試してみることを勧めます。
    • good
    • 2
この回答へのお礼

DOSプロンプトでもそんな工夫ができるのですね。ちょっと試したらファイル生成できましたが、ちょっと求める結果ではなかったのでVBAの方へ傾いてますが、
後程再度試してみたいと思います。
勉強になります。

お礼日時:2020/03/09 18:56

300万くらいだとRDBが無いと検索集計に無理が出てくると思います

    • good
    • 0
この回答へのお礼

エクセルシートに展開せず、1行ずつ処理してくなら可能と聞いた事があるのですが、間違った情報ですかね?・・・

お礼日時:2020/03/02 17:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A