先日タブ区切りをカンマ区切りにする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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) FileSearch2007に変わる構文について 1 2022/12/16 16:57
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「""」付にならないよ 1 2022/08/27 12:17
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) Excel VBAについて、 フォルダ内のファイルを全て開きたい場合、 FSOを使えば、Dirは使わ 1 2023/01/27 13:18
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
VBScriptで、ファイルから任意の行のみ取り出す方法について
その他(プログラミング・Web制作)
-
文字列からタブコードを取り除きたい
Visual Basic(VBA)
-
VBScriptでCSVファイルを読み出したい
その他(プログラミング・Web制作)
-
-
4
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
5
エクセルでファイルを開かずに文字を検索し、行を抽出したい
Excel(エクセル)
-
6
VBSでカンマ区切り
Visual Basic(VBA)
-
7
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelでdatファイルを作成??
-
batファイル処理でのテキストフ...
-
テキストファイルの文字色に色...
-
一気にずばっと複数のメールを...
-
複数のテキストファイルをexcel...
-
ファイル名の特定文字だけ削除...
-
バッチファイルが作成できない
-
Atokのユーザー辞書に、複数の...
-
ヘルプファイルの翻訳
-
windowsへscp
-
複数のファイルを同時検索し、...
-
文字列抜出しソフト
-
VBSでテキストファイルのタブ区...
-
Access2003で「オブジェクト'○○...
-
1フォルダに保存できるファイル...
-
Microsoft Access エラー 3051
-
FileExitsについて
-
Webサイト アプリのコンパイル他
-
バッチによるショートカットの...
-
VB(6.0)で作成したDLLをVB(.Net...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでdatファイルを作成??
-
複数のテキストファイルをexcel...
-
batファイル処理でのテキストフ...
-
バッチファイルが作成できない
-
テキストファイルの文字色に色...
-
複数のファイルを同時検索し、...
-
一気にずばっと複数のメールを...
-
ファイル名の特定文字だけ削除...
-
マクロでメモ帳に貼り付け
-
VBSでテキストファイルのタブ区...
-
ヘルプファイルの翻訳
-
CADでグラフ作成
-
パイソン(コラボラレイトリー...
-
文字の頭文字順に自動移動
-
Excel2003でマクロを使用してtx...
-
インデザインのテキスト流し込み
-
CDの曲名をテキストファイルで...
-
ExcelVBA テキストファイルから...
-
エクセルにpdfのテキストを表示...
-
エクセルVBA テキストファイ...
おすすめ情報