- ベストアンサー
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
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
はじめまして testAdmin さん みなさまの回答が楽しそうだったのでお邪魔します。 さて、この質問は >どこが間違っているのかわかりません。 >ご教授いただけませんでしょうか。 ですね。それ以上の回答は致しません。新たな疑問ができた場合は新たに質問を立てて下さい。 さて、まずあなたの書いたスクリプトは正しく解釈され正しく実行されています。私から見れば当たり前の結果が当たり前のように出ているだけです。 '--------------------------------------------------------------- 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)'0~27要素の配列の作成 Do While i < 6 HAIRETU(27) = Split(CSVTEXT01, ",")'配列要素27に対し指定値の受け渡し、但しsplitエラー。エラーしたためResume Nextの効果によりこの行は無視して次を処理 LOGTEXT01.WriteLine(HAIRETU(2))'初期化されない変数の代入但しWriteLineの効果により文字列に自動キャスト。結果空文字+Lineの改行=空文字改行の出力 LOGTEXT01.WriteLine(HAIRETU(3))'上記同/ちなみに初期化されない変数に格納されているのは Empty であり。空を意味するキャストされると""になる。 LOGTEXT01.WriteLine(HAIRETU(4))'上記同 LOGTEXT01.WriteLine("----------------") i = i + 1 Loop LOGTEXT01.close CSVTEXT01.close あなたの書いた内容は下記のようになります 二つのテキストストリーム作成 下記処理をループで6回行う 配列27に対してありえない代入をしてスキップさせる 空文字改行を出力するx3 ハイフンの線を出力する ループ テキストを二つとも閉じる さて、こうなります。 「お分かりいただけただろうか?」 と、最近知人が連呼しているのだけれどもまぁ即座に閑話休題。 見ての通りスクリプトは正しく解釈し正しく処理を行っている。 なんら問題ない。 そういえば >Splitは使用できないのでしょうか? なんて言っていましたっけ?いいえ、正しく動作し正しくエラーしていますよ? ・・・。 あぁまさか、splitの動作がなぜエラーするか分からない?って事でしょうか?あえてエラーさせているかと思っているのですが…。 なにせ、On Error Resume Nextを使ってエラーをスキップさせているのですから。本来正しく動作ように組んでいればOn Error Resume Nextは必要ありません。On Error Resume Nextを使うような機会は最初からエラーし得る処理でかつerr値を見て予定通りにエラーした場合中断もしくはリカバリへ変更などに使うのですから。 では、On Error Resume Nextをコメントアウトして実行してみましょう。 「C:\tmp\writecsv.vbs(11, 1) Microsoft VBScript 実行時エラー: オブジェクトでサポートされていないプロパティまたはメソッドです。」 この11行目は「HAIRETU(27) = Split(CSVTEXT01, ",")」 当たり前ですがここでエラーです。さて、では逆になぜこれがエラーしているのが説明しなければなりませんね。 さて、そもそもあなたがなぜsplitをこのように使えば正しく動くと思っているのかは私には分かりません。きっと、生まれた時から「splitはこのように扱うんだ!」と脳に刻まれていたのかも知れません。 ですが残念な事に本当にとてもとても非常に残念ながら私は最初からそんなものを知っているような脳は持ち合わせていませんでした。 では私はどのように知り、あなたの記述が間違っているかを証明せねばなりません。 さてvbsはそもそも何なのでしょうか?google先生に聞いてみたところWSHというものの一つらしいですね。 ではWSHっていうのは?Windows Script Hostというものらしいですよ。 さてWindowsは何処が提供しているのだろう?マイクロソフトらしい。 それでVBSの仕様はマニュアルは?中でも今しりたいsplitの仕様は何処でしょうか?調べてみるとMSDNというところにVBSの仕様が書かれているようです。調べてみましょう。 http://msdn.microsoft.com/ja-jp/library/cc410311.aspx と、ここに説明がありました。 Split(expression[, delimiter[, count[, compare]]]) expression 必ず指定します。文字列と区切り文字を含んだ文字列式を指定します。引数 expression が長さ 0 の文字列 ("") である場合、Split 関数は、要素もデータもない空の配列を返します。 と、あります。 「必ず指定します。文字列…」とあります。そうですね。splitの第一引数はstringつまり文字列でなければならないのです。 「お分かりいただけただろうか?」 ん?文字列(string)を指定したつもり?私にはとてもそうは見えませんが検証して証明しなければなりませんね。 Set CSVTEXT01 =OBJFS01.OpenTextFile("C:\tmp\CSVTEXT.log") Set LOGTEXT01 =OBJFS01.OpenTextFile("C:\tmp\LOGTEXT.log",8,False) wsh.echo typename(CSVTEXT01) 結果 TextStream まぁ当たり前ですが。setで渡せるのは参照値であり実値では在りません。setで作った変数がsplitで処理できるはずはありません。 setが何か分からない場合は下記を参照してください。 http://msdn.microsoft.com/ja-jp/library/cc392465.aspx msgbox http://msdn.microsoft.com/ja-jp/library/cc410277.aspx とある専門家さんが「msgbox(CSVTEXT01)」なんて書いてますがmsgboxに渡せる値もstringでなければならない為どう考えてもこれもエラーします。どうしてこんな事をやらせたのか真意はわかりません。 そしてどうやって >両方とも入っておりませんでした。 と、いう返答ができたのか実は不思議でしょうがありません。 さて、 >Splitは使用できないのでしょうか? 正しく動作します。仮におかしいと感じるのであれば正しく理解していなかっただけでしょう。 >どこが間違っているのかわかりません。 私にも分かりません。記述通り動作しているとおもわれます。 と、なるのですがこれで宜しいでしょうか? 参考URLをぜひ活用してください。 ポイントは要りません。専門家さんにでも振ってあげてください。
- 参考URL:
- http://www.google.co.jp/
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 もうすでに、#2さんがご指摘のようですが、 HAIRETU(27) = Split(CSVTEXT01, ",") そもそも、こんなことは出来ないですね。 Split の受ける側の変数は、あらかじめ決められた配列の変数に順序よく入らないはずです。 もちろん、Buffer を設けて、ひとつずつ入れるというなら別ですが。 それはともかく、このコードは、Do While ~ Loop を使っていますが、CSV は、3行と「----」の線だけの一回きりなのですか?ずっと続くのではないでしょうか? 実際に、動かしてはいませんが、こういうことではないでしょうか? '------------------------------------------- iFName = "C:\tmp\CSVTEXT.log" oFName = "C:\tmp\LOGTEXT.log" '------------------------------------------- Set objFso = CreateObject("Scripting.FileSystemObject") Set CSVTEXT01 = objFso.OpenTextFile(iFName) Set LOGTEXT01 = objFso.CreateTextFile(oFName, 8, True) Do Until CSVTEXT01.AtEndOfStream = True txTmp = CSVTEXT01.ReadLine() HAIRETU = Split(txTmp, ",", -1 , 1) 'TextCompare For i = LBound(HAIRETU) To UBound(HAIRETU) If i > 2 And i < 6 Then flg = True LOGTEXT01.WriteLine (HAIRETU(i)) End If Next If flg Then LOGTEXT01.WriteLine ("----------------") End If flg = False Loop CSVTEXT01.Close LOGTEXT01.Close '-------------------------------------------
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
Dim HAIRETU(27) Do While i < 6 HAIRETU(27) = Split(CSVTEXT01, ",") これだと、HAIRETUの要素27にSplitの結果が格納されます。 Dim HAIRETU Do While i < 6 HAIRETU = Split(CSVTEXT01, ",") このように配列数を指定せずに試してみてください。
- rivoisu
- ベストアンサー率36% (97/264)
i=0 の前に msgbox(CSVTEXT01) と入れてみてください ちゃんと入っていますか?
補足
回答ありがとうございます。 msgbox(CSVTEXT01) msgbox(LOGTEXT01) 両方とも入っておりませんでした。 ということは、Setの時点からNGということなのでしょうか。 そしてSetの何がいけなかったのでしょうか。
補足
おはようございます。 HAIRETU = Split(CSVTEXT01, ",") にすると、改行がなくなり----------------だけになりました。 CSVTEXT01が認識されていない(?)のでしょうか?