- ベストアンサー
VBSとCSVによるテキストデータの操作について
- VBSによるテキストファイルの操作についてお伺いします。ファイルAにCSVのヘッダー行があり、ファイルBにCSVヘッダーとデータがあります。出力先ファイルCで、ファイルAのヘッダーを持ち、ファイルBのデータを一致するデータ列にもったCSVを作成したいです。
- 具体例を出すと、ファイルAはHeader1,Header2,Header3,Header4,Header5のヘッダーのみをもちます。ファイルBには一部のヘッダーとそれに対応するデータがあります。VBSで処理後の出力先ファイルCはファイルAのヘッダーを持ち、ファイルBのデータを一致するデータ列にもったCSVです。
- VBSで処理後の出力先ファイルCはファイルAのヘッダーを持ち、ファイルBのデータを一致するデータ列にもったCSVを作成します。VBSを使用して処理を行います。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
まだ開いていたので、一応の完成形の一例を挙げてみます。 例データ CSVファイルの例を拾ったもの。 (見る場合は、下記をコピペして、メモ帳で開くこと。エクセルで開かないこと。) 全国地方公共団体コード,郵便番号,都道府県名,,,市区町村名,町域名,都道府県名,市区町村名,町域名 13101,1000000,トウキョウト,チヨダク,東京都,千代田区 13101,1020072,トウキョウト,チヨダク,イイダバシ,東京都,千代田区,飯田橋 13101,1020082,トウキョウト,チヨダク,イチバンチョウ,東京都,千代田区,一番町 13101,1010032,トウキョウト,チヨダク,イワモトチョウ,東京都,千代田区,岩本町 13101,1010047,トウキョウト,チヨダク,ウチカンダ,東京都,千代田区,内神田 ’ーーーー コード例 フォルダ名とファイル名は適宜変えること。 VBSではあるが、ファイルを扱うので、FSOを使う。 Set fso = CreateObject("Scripting.FileSystemObject") '---- Const ForReading = 1, ForWriting = 2, ForAppending = 8 Set file1 = fso.OpenTextFile("C:\Users\XXXX\Desktop\csvデータ例5.csv") Set file2 = fso.OpenTextFile("text1.csv", ForWriting, true) '---------ファイルを読む Do While file1.AtEndOfStream <> True '// ファイルから1行取得 x = file1.ReadLine msgbox x '---チェック l1=len(x)-len(replace(x,",","")) if l1 > 3 then 'msgbox l1 else msgbox "3列なし " end if '----------3番目のカンマを探索 s=1 for i=1 to 3 '3回カンマを探索 p=instr(s,x,",") s=p+1 next '------‐文字列を加工 ,, を挿入 str=mid(x,1,p) & ",," & mid(x,p+1,len(x)-p) file2.WriteLine(str) '---次レコードで繰り返し Loop '-----------------終了 'ファイルをクローズ file1.Close file2.close 'オブジェクト消去 Set fso = nothing メモ帳に上記をコピペして、拡張子を.VBSで保存すること。実行しやすいので、デスクトップに保存を、お勧めする。 このアイコンをDクリックして実行。 結果 (内容的、意味的には、ここに列挿入する内容ではなく、不自然ですが。) D,E列に当たるところに空白列ができた。 全国地方公共団体コード,郵便番号,都道府県名,,,市区町村名,町域名,都道府県名,市区町村名,町域名 13101,1000000,トウキョウト,,,チヨダク,東京都,千代田区 13101,1020072,トウキョウト,,,チヨダク,イイダバシ,東京都,千代田区,飯田橋 13101,1020082,トウキョウト,,,チヨダク,イチバンチョウ,東京都,千代田区,一番町 13101,1010032,トウキョウト,,,チヨダク,イワモトチョウ,東京都,千代田区,岩本町 13101,1010047,トウキョウト,,,チヨダク,ウチカンダ,東京都,千代田区,内神田 ヘッダーの見出しの文句に当たるもののセットは上記では略している。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
#1です。 VBSで、エクセルの行データの中へ空白列を2列入れる例をやってみました。 ただしVBSで、ファイルを読み書きする部分は略。 下記をコピーし、メモ帳に貼り付け。 D,E列は空白列として、元のD->F,E-->G列へ、移す部分のコード例 ーーーーー。 x = "aa,ss,d,fffg,g" ’ ここはVBSでCSVファイルを毎行読みこんだ文字列部分に当たる。 l = 0 p=split(x,",") msgbox p(0) msgbox p(1) msgbox p(2) msgbox p(3) msgbox p(4) ReDim Preserve p(6) p(5)=p(3) p(6)=p(4) p(3)="" p(4)="" '--- msgbox p(0) msgbox p(1) msgbox p(2) msgbox p(3) msgbox p(4) msgbox p(5) msgbox p(6) y=join(p,",") msgbox y ------------- 名前を付けて保存。どこでもよいが、感嘆のため、VBStest1.vbsでデスクトップに保存。ANSIで保存に注意。 デスクトップのそのアイコンをDクリック。 実行されて、画面に出る情報で、確認納得。 ーーー 別方法ですが、配列に入れず、文字列のままで、切り貼りで、三番目の「,」を見つけ、「,,」を挟み込む方法も考え着く方法です。
- imogasi
- ベストアンサー率27% (4737/17069)
#1です。 難しいことをいってしまったが、プログラムにこだわらなければ、簡単なことではないか? エクセルに元のcsvデータを読みこんで,(シートの第1行目はHeader情報が出るでしょう), そののちエクセルシート上で、手操作で、指定の指定の位置で1列挿入(2箇所?)し、そのエクセルシートで、名前を付けて(別ファイルとして)保存する。 その時、ファイルの拡張子を「.csv」にする。 あと、エクスプローラで、その新csvのファイルのアイコンで右クリックし「プログラムを指定して開く」で「メモ帳」(ソフト)を指定し、読み込んで確認すれば仕舞。 これ全体をマクロの記録を取って、VBA化もできそうだが意味はないだろう。
- imogasi
- ベストアンサー率27% (4737/17069)
丸投げではないか?そういうレベルの人が、なぜVBSを使うのか、わからん。 馴染みの多い、エクセルVBAでもできるが。 「ヘッダー」などというものを持ち出しているところから、作った人は、システム関連の人だろう。 その人に聞くのがよいだろう。 ーー なぜファイルAを持ち出しているのか、訳がわからん。 大型コンピュータ時代はIBMなど、テープファイルには、Headerは仕組みとして、常備のものだったが、MSのパソコンのエクセルなどでは、ファイルの識別よりも、印刷時の共通情報のように見える。 参考 https://excel-excel.com/tips/vba_439.html エクセルのファイル情報 ーーー ・1レコードを読むのは、ReadLineで ・項目に分けるのは Split関数で、 ・この配列の要素をズラして、ABC,,,DEF,GHIになるように、空白列2列用の空白データ配列要素を作り ・Splitと上記加工をしたものをJoinで文字列化して ・それをファイルCの1レコードとして書き出せばよい。 https://www.kanaya440.com/contents/script/vbs/function/string/join.html などGoogleで照会し記事をよめ。 Open,Close,Join,ReadLineなどもGoogleで「VBS Readline」などで照会すれば、例示コードが出るはず。 ファイルAがHeaderを作るためにだけで、挙げたなら、そんなことは、文字列を認識し、 ファイルCの第1レコードを作ればよいことで、質問の話題から除外すべきことだ。 ・ヘッダーレコードは最初の第1レコードに限る、例が多い?作者・利用者間で、約束を守れば2レコードでも差し支えないだろうが。 ・使うほうで、約束事という、他の知識で、第1レコードがヘッダーかどうか伝える(仕様書などで)良いようなものの、はずだ。