先日タブ区切りをカンマ区切りにする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
No.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
No.1
- 回答日時:
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で何とか出来ないでしょうか?
一連の処理を自動で行ないたいので、手作業で文字コードを変えて保存は出来ないのです。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
都道府県穴埋めゲーム
都道府県の名前を1人1つずつ投稿してください。全ての都道府県が出たら締め切ります!
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
文字列からタブコードを取り除きたい
Visual Basic(VBA)
-
カンマ( , )をタブに置換したい。
PowerPoint(パワーポイント)
-
VBScriptでCSVファイルを読み出したい
その他(プログラミング・Web制作)
-
-
4
エクセルでファイルを開かずに文字を検索し、行を抽出したい
Excel(エクセル)
-
5
VBScriptで、ファイルから任意の行のみ取り出す方法について
その他(プログラミング・Web制作)
-
6
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelでdatファイルを作成??
-
バッチファイルが作成できない
-
複数のテキストファイルをexcel...
-
テキストファイルの文字色に色...
-
batファイル処理でのテキストフ...
-
複数のファイルを同時検索し、...
-
エクセルにpdfのテキストを表示...
-
ExcelVBA テキストファイルから...
-
インデザインのテキスト流し込み
-
1フォルダに保存できるファイル...
-
フォルダ参照ではなくファイル...
-
エクセルVBA フォームを開く時...
-
処理を別ファイルに書きたいん...
-
FFFTPでサーバに新規フォルダが...
-
fopenでNULLを返されるがGetLas...
-
Excel-VBA 撮影日時の取得
-
HDDのクローン作成時の素朴な疑...
-
カノンロックのTAB譜
-
ダウンロード不可PDFファイルは...
-
動的に生成したVSBファイルへデ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでdatファイルを作成??
-
複数のテキストファイルをexcel...
-
テキストファイルの文字色に色...
-
batファイル処理でのテキストフ...
-
バッチファイルが作成できない
-
複数のファイルを同時検索し、...
-
一気にずばっと複数のメールを...
-
マクロでメモ帳に貼り付け
-
CADでグラフ作成
-
ファイル名の特定文字だけ削除...
-
windowsへscp
-
インデザインのテキスト流し込み
-
VBSでテキストファイルのタブ区...
-
ExcelVBA テキストファイルから...
-
テキストファイルを開かずに中...
-
CDの曲名をテキストファイルで...
-
VBAからファイルをzip化したい
-
WORD VBAでテキストファイルを...
-
アクセスログのテキストファイ...
-
複数テキストファイルをエクセ...
おすすめ情報