- ベストアンサー
二つのCSVを共通のカラムで照合して1つのファイルに
お世話になります。 今回の質問は、分かりやすく言うと シェアウェアの「ズバリ自動化」の 結合機能のみを再現するエクセル用マクロを知りたい、ということです。 http://shop.vector.co.jp/service/catalogue/sr049619/ (上記ソフトは持っていません) 質問を図示してみます。 データ量は少ないのですが、 毎日の作業なので、一発でできれば最高です。 まず二つのCSVがあります。 注文データ(A)と発送データ(B)です。 (*は任意のデータです。) CSV(A) A B C D E F G H I 1 * * * 佐藤A作 * * * * * 2 * * * 鈴木B三 * * * * * ・・・・・・・ 数行続きます。 CSV(B) A B C 1 * * 佐藤A作 2 * * 鈴木B三 ・・・ 氏名を照合カラムとして、それ以外のデータを結合して、 (注:CSV(B)の氏名を除いた後ろにCSV(A)を追加する) 別ファイルとして、出力するにはどういうマクロを使うのか? ということです。 二つのCSVでは名前の出てくる順序が違う場合があります。 また、 CSV(B)には(A)にない氏名も入っているので、 その場合、(B)のデータのみ引き継ぐようにするのも条件です。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
CSVファイルを質問文の様に結合するだけなら、作業にエクセルは別になくてもVBScriptを使ってできます。 少々エラーチェックが甘いかもしれませんが、とりあえず、動くものを(約30分で)作ってみました。 以下の部分を結合.vbsとか適当な名前で保存して実行すると結合.csvというファイルができる。 '------------------切取線------------------------ Dim data, fso, fileA, fileB, fileOut, aLine, field, aName Set data = CreateObject("Scripting.Dictionary") Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set fileA = fso.OpenTextFile("A.CSV",1) Do until fileA.AtEndOfStream aLine = fileA.ReadLine field = split(aLine,",") 'カンマでフィールドに分ける aName = field(3) 'フィールドの4番目に名前がある data.Add aName, aLine '名前で一行分のデータを取って置く Loop fileA.Close Set fileB = fso.OpenTextFile("B.CSV",1) Set fileOut = fso.OpenTextFile("結合.CSV",2,true) Do until fileB.AtEndOfStream aLine = fileB.ReadLine field = split(aLine,",") 'カンマでフィールドに分ける aName = field(2) 'フィールドの3番目に名前がある if data.Exists(aName) then 'A.CSVにある名前 aLine=Replace(aLine,aName,data.Item(aName))'名前の部分をAの内容で置き換える end if fileOut.WriteLine(aLine) '無い時はそのまま書き出す Loop fileB.Close fileOut.Close
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#2>読み込むファイルの場所やファイル名の指定は "A.CSV" "B.CSV" が読み込むファイル名 "結合.CSV" が書き込むファイル名になりますので変更すれば良いです。 例えば、ユーザー名BLUEPIXYのディスクトップにCSVと言うフォルダがあってその中のA.CSVの場合は "A.CSV" を "C:\Documents and Settings\BLUEPIXY\デスクトップ\CSV\A.CSV" に置き換えれば良いです。 基本的にフォルダの位置がバラバラになるならフルパスで(ドライブ:¥~から始める)書きます。 B.CSVの名前が変わるということですが、 あらかじめ規則がわかっている(例えば170223.CSVなどとなるとか)のならファイル名を動的に作ることは可能です。 また、ファイル名の部分を fileBName=InputBox("B.CSVのファイル名をフルパスで入力して下さい", "ファイル名入力", "B.CSV") の様にして、実行時に手入力で処理するファイルを指示することもできます。 例の場合 "B.CSV" を fileBName で置き換えます
- harukabcde
- ベストアンサー率15% (94/610)
この自動化を自分で作るとしたら 1,980円では出来ないと思います。 (例えば、時給2,00円の人が1時間で出来るかということ) 素直に購入した方が安いと思いますよ。
お礼
確かにそうかもしれません。 今後自分でいじれるようになるために 勉強もかねて質問させていただいておりますが、 購入も考えます。 ありがとうございました。
補足
お時間とって頂き、ありがとうございます。 このスクリプトで、 読み込むファイルの場所やファイル名の指定は どう書いたらよいのでしょうか? 二つのCSVはデスクトップの別々のフォルダに入れてあります。 また、CSV(A)のファイル名は固定なのですが、 CSV(B)のファイル名はソフトが日付を参考につける名前のため、日によって名前が変わります。 こうなると、VBSでは無理でしょうか・・・ そのあたりもお教え願えますでしょうか? よろしくお願いいたします。