VBSによるCSVの比較方法と可変なファイル名の取り扱い

このQ&Aのポイント
  • VBSを使用してCSVファイルを比較する方法について説明します。また、可変なファイル名の取り扱い方法も解説します。
  • CSVファイルを2つ順に呼び出して、配列に格納する方法について説明します。そして、配列を比較して違いがあればテキストに書き込む方法も解説します。
  • for文を使用して配列を比較し、違いがあればテキストに書き込む方法について説明します。比較するCSVファイルの名前が可変な場合でも問題ありません。
回答を見る
  • ベストアンサー

VBSにてCSV読み込みし比較

ある場所に比較するCSVファイルを2個格納しております。 ただしCSVファイル名は可変であります。 その場合 Set objTextA = objFSO.OpenTextFile("C:\" & "A.csv")と特定して呼び出せません。 名前が可変なときのため、そのパスにあるCSV2個を順に呼び出すにはどうすればよいのでしょうか。 また呼出し後、split関数により、配列に入れます。A配列とB配列に格納したとします。 一つ一つ比較していきたいのですが、 以下のような構文の場合、比較で違ったときテキストに書き込みとなりますでしょうか? for i=0 to i=10 step 1 if strcomp(a(i) ,b(i))) = 1 then テキストに書き込み endif next

  • craftx
  • お礼率48% (388/806)

質問者が選んだベストアンサー

  • ベストアンサー
  • ariseru
  • ベストアンサー率56% (930/1659)
回答No.1

>名前が可変なときのため、そのパスにあるCSV2個を順に呼び出すにはどうすればよいのでしょうか。 フォルダ内の全ファイルから拡張子がCSVなものを検索するしか無いかと。 しかも、同じフォルダ内に別のCSVファイルがあるとちゃんと比較することが出来ないため、比較したいCSVファイル以外は無視するようにする必要があります。 http://officetanaka.net/excel/vba/tips/tips36.htm ファイルの検索方法については上記あたりを参考に。 >以下のような構文の場合、比較で違ったときテキストに書き込みとなりますでしょうか? For i = 0 to 10 If a(i) = b(i) Then '書き込み処理 EndIf Next i 大体合ってますが、こんな感じにした方がいいかと。 For文のStep 1については省略可能ですし、文字列の比較は=でも可能ですよ。 ただ、=での比較はアルファベットの大文字小文字が違うだけでも違う内容だと判断されるため、大文字小文字を問わずに比較したい場合はStrcomp関数を使った方が良いかも。 ちなみに、2つのファイルを読み込んだ配列の要素数が可変の場合はUBound関数を使うと良いですよ。 num = UBound(a)でnumの中にA配列の要素数が入ります。 同様に、num = UBound(b)だとB配列の要素数です。

その他の回答 (1)

  • bajutsu
  • ベストアンサー率20% (139/693)
回答No.2

先日、他の方も言っておられましたが、ちょっとは自分で調べたら? VBScriptのリファレンスをちょろっと読むだけで出てくるような 低レベルな質問ばっかりなんですが。 こんなところで、たまたま親切な人が通りかかって 回答をくれるのを待つよりも、よっぽど早いし確実ですよ。 FileSystemObjectの GetFolder に対象のフォルダのパスを指定して フォルダオブジェクトを取得します。 フォルダオブジェクトの Filesコレクション をFor Each で回せば 特定のフォルダ内のファイルをひとつづつ処理できます。 このとき、拡張子がcsvを判定して、ループを抜けるようにしないと どうでもいいファイルも処理するので気をつけてください。 ま、そのフォルダ内のファイルは全部csvという前提なら別に構いませんが。 csvが3個以上あった場合とか、 実際の処理でファイルの入力順序を意識する必要があるのか?ないのか?とか いろいろ気になる部分はありますが・・・

craftx
質問者

お礼

調べてからの確認です。 プログラム自体初心者なので、リファレンスを読んでも自分のやりたい関数はどれを使用すれば実現できるのかなどなかなかわからないわけです。 すいません。 CSVは2個限定なのですが、 読み込む順番はどうなるのでしょうか。どちらを先に読み込むかがきになります。

関連するQ&A

  • VB6でCSVの取込をする

    VB6.0 でCSVの取り込みをしています。 Dim objFso As FileSystemObject Dim objTso As TextStream Dim データ As Variant Dim stArrayData() As String Set objFso = New FileSystemObject Set objTso = objFso.OpenTextFile(取込パス, ForReading) データ = objTso.ReadLine '配列に格納 stArrayData = Split(データ, ",") 'データの取得 データの取得 = stArrayData(0) stArrayData(0)で、データが取得できますが、 ダブルコーテーションが付加された状態で取得がしたいのですが、できません。。 今は、「000」で取得しているのを、 「"000"」で取得したいのです。 なお、取込むCSVをテキストで開くと、 ダブルコーテーションはついていません。 また、そもそも、取込む際に、ダブルコーテーションを付加する方法があるのでしょうか? それとも、取込んだ後に、ダブルコーテションを付加するのでしょうか? ご教授宜しくお願いします。

  • VBScriptでCSVファイルを読み出したい

    現在VBScriptでCSVファイルを1行ずつ読み取って、2次元配列に格納するプログラムを作成しています。 CSVファイルの中身は、サンプルで shop,price,sales 001,500,700 003,1200,90 024,,18 という並びになっています。 実データは300件くらいです。 1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取、","でsplitを用いてまず1次配列に格納しています。 1次元配列のarrLine(0)=001、(1)=500、(2)=700と入ったデータを 2次元配列arrshopに順次保存?したいのです。 ---------------------------------------------- dim strLine '1行ずつ読込んだデータを持つ dim ntLineNum '行数のカウント dim arrLine '","で区切った要素を持つ一次元配列 dim arrshop '一次元配列になった要素を2次元配列として格納 Do until .AtEndOfStream   strLine = .ReadLine   if 0<>strComp("",Trim(strLine)) then ntLineNum = intLineNum + 1   end if   arrLine = split(strLine , ",")   arrshop = Array(arrLines,i) i = i + 1 loop ----------------------------------------- msgbox arrshop(2)(0) と指定すると「003」出るようにしたいです。 Array関数が上手くないような気もします・・・。 どなたかご教授お願いします(>_<。)

  • CSVファイルを読み込み、ファイル名を変更。

    CSVファイルを読み込み、ファイル名を変更。 使用言語はperlです。perlは初心者です。 アルゴリズムが、 CSVファイルを読み込み→2次元配列に格納→ファイル名変更 という流れになっているプログラムを作成中です。 CSVファイルの中身は あ.txt , a.txt い.txt , b.txt う.txt , c.txt です。 CSVファイルを読み込み2次元配列に格納するプログラムは以下のようにしました。 ----------------------------------- $i= 0; open IN, "sample.csv"; while (<IN>) { my @data = (); @data = split (/,/); for (0..@data) {$jdata[$i][$_] = "$data[$_]";} $i++; } close IN; ---------------------------------------- 「あ.txt」を「a.txt」に変更しようとして、この中に rename $jdata[0][0] , $jdata[0][1] ; と書いてみましたが、変換されません。 どう書けばよいのでしょうか。よろしくお願いします。

    • ベストアンサー
    • Perl
  • CSVファイル

    CSVファイルを1行ずつ比較して読み込み、一致した行を別ファイルに記述していこうと思っています。 現在、csvファイルを読み込む所まで出来ています。 比較して別ファイルに記述する方法を教えて下さい。 もしくはアドバイスください。 【ファイルの中身】 "09/09/2005 0:00:00,aaa,bbb,ccc" 【比較条件】 当日の日付を取得し、年月日だけで比較する Dim objFSO ' FileSystemObject Dim objFile ' ファイル読み込み用 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("c:\test.csv") Do while objFile.ReadLine <> ""         'IF文を記述(条件:日付)        '別ファイルに記述する Loop objFile.close Set objFileSystem = Nothing Set objFile = Nothing

  • VBS 複数ファイル複数行を配列格納

    ある配下のCSVファイル2個(固定)を読み込み、 コンピュータ名の列が同じ行を比較するというツールを作っています。 考えた結果以下まではできましたが、どうしても指定行を配列に埋め込み処理ができません。 比較方法はわかります。 ですが以下のプログラムでは、CSVの行は複数行あるので最終行しか格納されません。 どのようにしたら、2つのCSVファイルそしてすべての行を配列に入れ込むことができるのでしょうか。 For Each FileName In src.Files FileEx = fso.GetExtensionName(FileName) If LCase(FileEx) = "csv" Then Set CsvFile = fso.OpenTextFile(FileName) Do Until CsvFile.AtEndOfStream tmpLine = CsvFile.ReadLine If roopCnt = 0 Then '1個目のCSV ArrayA = Split(tmpLine,",") Else '2個目のCSV ArrayB = Split(tmpLine,",") End rowCnt = rowCnt +1 Loop roopCnt = 1 End If Next

  • perlでのcsvファイルの比較・上書き

    はじめまして、今回初めて質問させていただきます。 今、perlでAとBという2つのCSVファイルを比較して、マッチしない箇所がある場合はAの情報がBに上書きされるというスクリプトを作成しようとしています。 OPEN関数と比較演算子を利用するのはわかっているのですが、上書きさせる方法がわかりません... ネットで調べたりしたのですが、参考になるHPがなかなか見つからなかったので、こちらに質問させていただきました。 サンプルとなるプログラムやHP等を教えていただければ、勉強になりますのでとても助かります。 よろしくお願いします。 追記 Bのcsvファイルには住所録情報が格納されておりまして、AのcsvファイルにはBの住所録情報の中から変更箇所がある新しい住所録情報が格納されております。

  • VBSでカンマ区切り

    お世話になっております。 VBSで、CSVファイルをカンマ区切りで配列にし、 ファイルに書き出したいです。 下記のスクリプトを実行すると3行の改行と これ⇒ ---------------- だけ出力されます。 Splitは使用できないのでしょうか? どこが間違っているのかわかりません。 ご教授いただけませんでしょうか。 '--------------------------------------------------------------- On Error Resume Next Set OBJFS01 = CreateObject("Scripting.FileSystemObject") Set CSVTEXT01 =OBJFS01.OpenTextFile("C:\tmp\CSVTEXT.log") Set LOGTEXT01 =OBJFS01.OpenTextFile("C:\tmp\LOGTEXT.log",8,False) '--------------------------------------------------------------- i = 0 Dim HAIRETU(27) Do While i < 6 HAIRETU(27) = Split(CSVTEXT01, ",") LOGTEXT01.WriteLine(HAIRETU(2)) LOGTEXT01.WriteLine(HAIRETU(3)) LOGTEXT01.WriteLine(HAIRETU(4)) LOGTEXT01.WriteLine("----------------") i = i + 1 Loop LOGTEXT01.close CSVTEXT01.close

  • ファイル書き込み

    out.csvファイルに追記していくにはどのように記述すればいいのでしょうか? アドバイス下さい。 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("c:\test.csv") 'objFile.ReadLine Do While Not objFile.AtEndOfStream StrLine = objFile.ReadLine MyString = split(StrLine,",") ' msgbox Mid(MyString(0),2,10) ' MyString = split(objFile.ReadLine,",") if Mid(MyString(0),2,10) = "(PDH-CSV 4" then Set objWFile=objFSO.OpenTextFile("c:\out.csv",2,true) objWFile.write(StrLine) msgbox "!!!" end if ' if Mid(MyString(0),2,10) = DateString then Set objWFile=objFSO.OpenTextFile("c:\out.csv",2,true) objWFile.write(StrLine) ' 'msgbox Mid(MyString(0),2,10) msgbox "???" end if loop objFile.close Set objFSO = Nothing Set objFile = Nothing

  • VBスクリプトでcsvファイルを比較

    別々のCSVファイルがありますが同じ形式にしておいて、 a.csv a,b,c b.csv d,e,f aとd、bとe、cとfと順番に比較する方法を教えて頂けますでしょうか。

  • VBScriptでのcsvデータ処理について

    プログラミング超初心者です。 仕事でwebサイトのPV数の集計をVBSで処理することを任されました。 読み込むcsvファイルはページのアドレスとPV数の他4項目あり、 同一アドレス毎にPV数の項目だけを集計します。 途中まで自分で書いてみましたが、時間が無くなって来ましたので相談させて頂きたいと思います。 とりあえず以下のように書いてみましたが、実際どう書けば良いのでしょうか?今のところstrLine = csvData.ReadLineのところでエラーになってしまいます。基本的に間違っていることが多いと思いますが、どなたかお時間あれば、ご指南頂けないでしょうか! Dim objFSO Dim csvData Dim strLine Dim arrLine Dim i Dim arrAllDate Dim view01 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\Analytics.csv") csvData = objFile.ReadAll Do until csvData.AtEndOfStream   strLine = csvData.ReadLine   arrLine = split(strLine , ",")   Redim Preserve arrAllDate(i+1) arrAllDate(i)=arrLine i = i + 1 Loop Dim url01= arrAllDate(0,i) If url01= "/http://*********/*******/01"+ Then Do until url01 = <>"" view01 = view01 + arrAllDate(1,i) Loop      ・      ・      ・      ・