アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になっております。
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

A 回答 (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 …
と、ここに説明がありました。
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 …


msgbox
http://msdn.microsoft.com/ja-jp/library/cc410277 …
とある専門家さんが「msgbox(CSVTEXT01)」なんて書いてますがmsgboxに渡せる値もstringでなければならない為どう考えてもこれもエラーします。どうしてこんな事をやらせたのか真意はわかりません。
そしてどうやって
>両方とも入っておりませんでした。
と、いう返答ができたのか実は不思議でしょうがありません。


さて、
>Splitは使用できないのでしょうか?
正しく動作します。仮におかしいと感じるのであれば正しく理解していなかっただけでしょう。
>どこが間違っているのかわかりません。
私にも分かりません。記述通り動作しているとおもわれます。

と、なるのですがこれで宜しいでしょうか?
参考URLをぜひ活用してください。
ポイントは要りません。専門家さんにでも振ってあげてください。

参考URL:http://www.google.co.jp/
    • good
    • 0

こんばんは。



もうすでに、#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

'-------------------------------------------
    • good
    • 0

Dim HAIRETU(27)


Do While i < 6
HAIRETU(27) = Split(CSVTEXT01, ",")

これだと、HAIRETUの要素27にSplitの結果が格納されます。

Dim HAIRETU
Do While i < 6
HAIRETU = Split(CSVTEXT01, ",")

このように配列数を指定せずに試してみてください。

この回答への補足

おはようございます。
HAIRETU = Split(CSVTEXT01, ",")
にすると、改行がなくなり----------------だけになりました。
CSVTEXT01が認識されていない(?)のでしょうか?

補足日時:2009/12/02 07:10
    • good
    • 0

i=0


の前に
msgbox(CSVTEXT01)
と入れてみてください
ちゃんと入っていますか?

この回答への補足

回答ありがとうございます。
msgbox(CSVTEXT01)
msgbox(LOGTEXT01)
両方とも入っておりませんでした。
ということは、Setの時点からNGということなのでしょうか。
そしてSetの何がいけなかったのでしょうか。

補足日時:2009/12/02 00:38
    • good
    • 0

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