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

先日タブ区切りをカンマ区切りにするVBSを教えて頂き、それに少し手を加えタブ区切りをカンマ区切りには出来たのですが、変換後の項目の両端にブランクが入ったり、全角が化けてしまいました。解決方法を教えていただけますでしょうか?

変換イメージは下記の通りです。

1  20130201  1   8411  旅費交通費  100  0  忠
2  20130201  1 2 1111  現金  0  100  タクシー

               ↓

1,20130201,"1","","8411","旅費交通費",100,0,"忠"
2,20130201,"1","2","1111","現金",0,100,"タクシー"

下記プログラムを実行した後

1 , 2 0 1 3 0 2 0 1 ," 1 "," "," 8 4 1 1 "," ナeサ研N製・ 1 0 0 "," 0 "," 濱 "
2 , 2 0 1 3 0 2 0 1 ," 1 "," 2 "," 1 1 1 1 "," sム・ 0 "," 1 0 0 "," "," ソ0ッ0キ0・"

Dim fso, beforeFile, afterFile
Dim strLine, strColumn
Dim aryColumns(), aryBuff
Dim i

Set fso = CreateObject("Scripting.FileSystemObject")
Set beforeFile = fso.OpenTextFile("before.txt", 1)
Set afterFile = fso.OpenTextFile("after.txt", 2, True)

strLine=beforeFile.ReadLine
Do While beforeFile.AtEndOfLine = False
strLine=beforeFile.ReadLine
aryBuff = Split(strLine,Chr(9))
i = 0
For Each strColumn In aryBuff
ReDim Preserve aryColumns(i)
if i = 0 or i =1 Then
aryColumns(i) = strColumn
Else
aryColumns(i) = """" & strColumn & """"
End if
i=i+1
Next
afterFile.WriteLine(Join(aryColumns, ","))
Erase aryBuff
Erase aryColumns
Loop

A 回答 (2件)

FileSystemObjectでは、文字エンコーディングの変換はできません。


文字エンコーディングの変換が必要な場合、ADODB.Streamを利用します。
そこらへんからパクってきて、極力形を崩さずコードし直しました。

Dim beforeFile, afterFile
Dim strLine, strColumn
Dim aryColumns(), aryBuff
Dim i

beforeFile = "before.txt"
afterFile = "after.txt"

'入力ストリームの生成・設定(テキスト、UTF-16LE)
Dim inStream
Set inStream = CreateObject("ADODB.Stream")
inStream.Type = 2' 1:バイナリデータ 2:テキストデータ
inStream.Charset = "UTF-16"
Call inStream.Open()
Call inStream.LoadFromFile(beforeFile)

'出力ストリームの生成・設定(テキスト、SJIS)
Dim outStream
Set outStream =CreateObject("ADODB.Stream")
outStream.Type = 2' 1:バイナリデータ 2:テキストデータ
outStream.Charset = "SJIS"
Call outStream.Open()

Do While inStream.EOS = False
'読み込んだレコードをカンマ区切りで配列に格納
strLine = inStream.ReadText(-2)'-1:全部読み込む -2:一行読み込む
aryBuff = Split(strLine, Chr(9))
i = 0
For Each strColumn In aryBuff
ReDim Preserve aryColumns(i)
if i = 0 or i =1 or i =6 or i =7 Then
aryColumns(i) = strColumn
Else
aryColumns(i) = """" & strColumn & """"
End if
i=i+1
Next
'必要な情報を出力ストリームへ書き出す
Call outStream.WriteText(Join(aryColumns, ","), 1)'0:文字列のみ書き込む 1:文字列+改行を書き込む
Erase aryBuff
Erase aryColumns
Loop

' ファイル書き出し
Call outStream.SaveToFile(afterFile, 2)' 1:上書きしない 2:上書きする

'ストリームを閉じる
inStream.Close
outStream.Close

'オブジェクトを解放
Set inStream = Nothing
Set outStream = Nothing
    • good
    • 0
この回答へのお礼

とても詳しくご回答頂きありがとうございました。勉強にもなりましたし本当に助かりました。
感謝感謝です。

お礼日時:2013/03/13 17:23

10行目はいりません。

(ループ内で再度読み直す為、1行目が出力されませんでした)
× strLine=beforeFile.ReadLine
○ 'strLine=beforeFile.ReadLine

17行目の判定が足りません。
× if i = 0 or i =1 Then
○ if i = 0 or i =1 or i =6 or i =7 Then

それを考慮した上で実行したところ、WindowsXP上だと正しく結果が出力されました。
1,20130201,"1","","8411","旅費交通費",100,0,"忠"
2,20130201,"1","2","1111","現金",0,100,"タクシー"


どのような環境で実行したのかわかりませんが、恐らくは
表示させた際のファイルの文字エンコーディングがbefore.txtと
異なっているのではないでしょうか。

Windows7上で実行したとしても、そもそもbefore.txtの
文字エンコーディングが、after.txtと同一なら問題ない
ように思います。多分。


と思い、試しにbefore.txtをUTF-16LE(BOMなし)で保存した状態でvbsを実行したところ、
after.txtは以下のようになりました。
1 , 2 0 1 3 0 2 0 1 ," 1 "," "," 8 4 1 1 "," ナeサ研N製・ 1 0 0 ", 0 , 濱

2 , 2 0 1 3 0 2 0 1 ," 1 "," 2 "," 1 1 1 1 "," sム・ 0 ", 1 0 0 , ソ0ッ0キ0・


再現されたので、やはりbefore.txtの文字エンコーディングが怪しいでしょう。
after.txtはShift_JISで出力されるはずなので、before.txtの文字エンコーディングを
Shift_JISで保存した状態で実行しましょう。

この回答への補足

お察しの通り、before.txtの文字コードはUnicodeで作成されております。
このinputから変換してShift_JISで出力したいのですが、VBSで何とか出来ないでしょうか?
一連の処理を自動で行ないたいので、手作業で文字コードを変えて保存は出来ないのです。

よろしくお願いします。

補足日時:2013/03/13 15:48
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています