• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBSでテキストファイルのタブ区切りをカンマ区切り)

VBSでテキストファイルのタブ区切りをカンマ区切り

このQ&Aのポイント
  • VBSを使用して、テキストファイルのタブ区切りをカンマ区切りに変換する方法について教えてください。
  • 変換後の項目の両端にブランクが入ったり、全角が化けてしまうなどの問題が発生しています。この問題の解決方法も教えてください。
  • 変換イメージの例として、元のテキストファイルのデータと変換後のデータを示しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答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

kawa2400
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答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で保存した状態で実行しましょう。

kawa2400
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • テキストファイルのタブをカンマに変える方法

    バッチファイルか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,"タクシー"

  • 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

  • vbscript ファイルのマージ

    VB初心者です。 C:\test配下の複数のファイルをマージする便利ツールを只今作成中なのですが、 下記プログラムを実行すると「If aryStrings(3) = "yes" Then」の行に対し、 「Subscript out of range」というエラーメッセージが表示されます。 マージの対象としているファイルの中身は次のようなイメージです。 100,101,102,yes,104,105,106,107,108,109,110,111 101,101,102,no,104,105,106,107,108,109,110,111 102,101,102,yes,104,105,106,107,108,109,110,111 103,101,102,no,104,105,106,107,108,109,110,111 104,101,102,yes,104,105,106,107,108,109,110,111 出力データ(output.txt)を見ると正常に処理されているようなのですが なぜこのようなメッセージが表示されるのかご教授いただきたいです。 お手数ですが宜しくお願い致します。 プログラム -------------------------------------------------------------------------------------------------------------------------- Dim FileName Dim fso,baseFolder Dim frFile,toFile Dim mFile Dim strLine1,strLine Dim aryStrings Dim msg FileName = InputBox("ファイル名を入力してください","ファイル名入力","output") Set fso = CreateObject("Scripting.FileSystemObject") Set baseFolder = fso.GetFolder("C:\test") Set toFile = fso.OpenTextFile("C:\test\" & FileName & ".txt" ,2 , True) For Each mFile In baseFolder.Files Set frFile = fso.OpenTextFile("C:\test\" & mFile.Name , 1) Do While frFile.AtEndOfStream <> True strLine1 = frFile.ReadLine() aryStrings = Split(strLine1, ",") If aryStrings(3) = "yes" Then strLine = aryStrings(0) +" "+ aryStrings(1) +" "+ aryStrings(9) +" "+ aryStrings(10) +" "+ aryStrings(11) toFile.Write strLine & vbCrLf Else End If Loop frFile.Close Set frFile = nothing Next toFile.Close msg = "処理終了" MsgBox msg --------------------------------------------------------------------------------------------------------------------------

  • ダブルクォートで囲まれたCSVファイルについて

    CSVを読みこんで配列変換するロジックを考えていますがうまくいきません。 ソースは以下の通りです。 Dim objFs Dim objSm Dim strLine Dim arySplit Set objFs = CreateObject("Scripting.FileSystemObject") Set objSm = objFs.OpenTextFile(C:\sample.csv, 1) Do Until objSm.AtEndOfStream strLine = objSm.ReadLine strLine = Right(strLine, Len(strLine) - 1) strLine = Left(strLine, Len(strLine) - 1) arySplit = Split(strLine, "\"\",\"\"") MsgBox UBound(arySplit) Loop Set objSm = Nothing Set objFs = Nothing ※読み込むCSVファイルはダブルクォートが付いています。 ※正常に配列に変換できたかを確認する為、MsgBoxで配列の要素数を表示しようとしています。 やりたい事は 1.まずは先頭と最後のダブルクォートを除外。 2.区切り文字(\",\")で配列に変換。  ※なぜカンマで配列に変換しないかというとダブルクォートで囲まれた値の中にカンマ文字がある為、このような事をしています。 3.変数に変換した配列を格納。 申し訳ありませんがご教授いただけませんでしょうか。 またどうか皆さんのお知恵を私にお貸しいただけませんでしょうか。 何卒、宜しくお願い致します。

  • VBS 改行無しのファイル抽出方法

    いつもお世話になっております。 WindowsXP環境にある下記のようなVBSがあります。 コード------------------------------------------------------------------ path = "a.txt" Set FSO = WScript.CreateObject( "Scripting.FileSystemObject" ) '全行読み込み処理 (改行を1行単位として) Set f = FSO.OpenTextFile( path ) Do Until f.AtEndOfStream line = f.ReadLine() i_line = f.Line - 1 Loop WScript.Echo "全件数= " & i_line '最終行-5読み込み処理 Set f = FSO.OpenTextFile( path ) For i=1 To i_line - 6 f.SkipLine Next LAST5 = f.ReadLine() MOJI = Mid(LAST5,20,5) WScript.Echo "文字 = " & MOJI コード------------------------------------------------------------------ 上記VBSの簡単な流れは・・・ (1)改行で1行とみなす a.txt を全行取得。 (2)全件数を表示 (3)最終行から5行前の行まで移動。 (4)(3)の行から20文字からの5文字を取得。 (5)5文字を表示。 とこんな感じです。 しかし、これだと改行有のファイルにのみ有効で 改行無には対応出来ません。 例えば120文字で1行とみなすファイルでも同様の 取得がしたいのです。 ご存知の方がいれば、ご教授願いませんでしょうか? 何卒、宜しくお願い致します。

  • ファイル書き込み

    out.csvファイルに追記していくにはどのように記述すればいいのでしょうか? アドバイス下さい。 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("c:\test.csv") 'objFile.ReadLine Do While Not objFile.AtEndOfStream StrLine = objFile.ReadLine MyString = split(StrLine,",") ' msgbox Mid(MyString(0),2,10) ' MyString = split(objFile.ReadLine,",") if Mid(MyString(0),2,10) = "(PDH-CSV 4" then Set objWFile=objFSO.OpenTextFile("c:\out.csv",2,true) objWFile.write(StrLine) msgbox "!!!" end if ' if Mid(MyString(0),2,10) = DateString then Set objWFile=objFSO.OpenTextFile("c:\out.csv",2,true) objWFile.write(StrLine) ' 'msgbox Mid(MyString(0),2,10) msgbox "???" end if loop objFile.close Set objFSO = Nothing Set objFile = Nothing

  • 【VBScript】ディレクトリ内のファイルを、リストを読み込んで分割

    【VBScript】ディレクトリ内のファイルを、リストを読み込んで分割 ■プログラム及びファイルに関する備考 .\test\     = 分割を行いたいファイルが格納されたディレクトリ Dir_FileList.txt = testディレクトリ内のファイルをリスト化したもの。           相対パスにて、1行ずつ改行して記述する。 ■やりたい事 Dir_FileList.txtという、.\test\内に配置されたファイルをリスト化したtxtを 1行ずつ読み込み、読みこんだファイルに対し、10行毎に分割処理を行いたいと思っています。 分割したファイルは、分割元のファイルが格納されたディレクトリと同じ、.\test\ディレクトリに作成し、 分割前の元ファイルを最後に削除するという処理をリストに書かれた全てのファイルに対して行いたいです。 下記のようにコーディングをしたのですが、 どうも「Do Until ( fILE1.AtEndOfStream )」のループ文の処理が行われていない?ようで、 testディレクトリ内部のファイルが分割されません。 色々試したのですが、VBScriptを触るのは初めてでなかなか上手くいきませんでした。 どこが間違っていて、どのように修正すれば動くようになるでしょうか? お手数ですが、ご教授をお願い致します。 ---------------------------------------- Option Explicit Dim flReadFSO, flReadFSO2, fFolder, fILE, flrSubFolder Set flReadFSO = CreateObject("Scripting.FileSystemObject") Set flReadFSO2 = WScript.CreateObject("Scripting.FileSystemObject") Set fFolder = flReadFSO2.GetFolder(".") Dim name1, fILE1 name1 = fFolder & "\Dir_FileList.txt" Set fILE1 = flReadFSO.OpenTextFile(name1) Dim oneLineTxt oneLineTxt ="" Dim FSO set FSO = WScript.CreateObject("Scripting.FileSystemObject") Do Until ( fILE1.AtEndOfStream ) oneLineTxt = fILE1.ReadLine WScript.Echo oneLineTxt arg = ".\test\test01.txt" set fin = FSO.OpenTextFile(arg, 1) fbn = FSO.GetBaseName(arg) fen = FSO.GetExtensionName(arg) nf=0 set fout = FSO.OpenTextFile(".\test\" & fbn & "_" & nf & "." & fen, 2, true) nl=0 Do While Not fin.AtEndOfStream fout.WriteLine fin.ReadLine nl=nl+1 if nl>9 then fout.Close nf=nf+1 if nf>9 then exit do set fout = FSO.OpenTextFile(".\test\" & fbn & "_" & nf & "." & fen, 2, true) nl=0 end if Loop fin.Close FSO.DeleteFile arg, True Loop fILE1.Close ----------------------------------------

  • VBScriptでのcsvデータ処理について

    プログラミング超初心者です。 仕事でwebサイトのPV数の集計をVBSで処理することを任されました。 読み込むcsvファイルはページのアドレスとPV数の他4項目あり、 同一アドレス毎にPV数の項目だけを集計します。 途中まで自分で書いてみましたが、時間が無くなって来ましたので相談させて頂きたいと思います。 とりあえず以下のように書いてみましたが、実際どう書けば良いのでしょうか?今のところstrLine = csvData.ReadLineのところでエラーになってしまいます。基本的に間違っていることが多いと思いますが、どなたかお時間あれば、ご指南頂けないでしょうか! Dim objFSO Dim csvData Dim strLine Dim arrLine Dim i Dim arrAllDate Dim view01 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\Analytics.csv") csvData = objFile.ReadAll Do until csvData.AtEndOfStream   strLine = csvData.ReadLine   arrLine = split(strLine , ",")   Redim Preserve arrAllDate(i+1) arrAllDate(i)=arrLine i = i + 1 Loop Dim url01= arrAllDate(0,i) If url01= "/http://*********/*******/01"+ Then Do until url01 = <>"" view01 = view01 + arrAllDate(1,i) Loop      ・      ・      ・      ・

  • テキストファイルに記載されているか調べるには。スクリプト

    Jスクリプトの質問です。 県名のみ記載されている jusho.txt があります。 この中からある県名が記載されているか調べるスクリプトを作ろうとしてますがうまくできません。 登録県名があったらアラートで表示させるにはどうすればいいですか。 途中まで考えましたがわからなくなりました。 -------------------------------------------- //調べたい県名をここで入力 kenmei="愛知県" //登録住所か調べる。 var fso = WScript.CreateObject("Scripting.FileSystemObject"); var stream = fso.OpenTextFile("jusho.txt",1); //1は読み専用 while (stream.AtEndOfStream="false"){ var jusho = stream.ReadLine(); if(kenmei=jusho){alert ("登録されてます")}; }; ----------------------------------------- jusho.txt と スクリプトは同じフォルダにあります。

  • CSVでタブ区切り

    はじめまして。エクセル2003を使用中です。 データのやり取りをする際に 「エクセルのデータをCSVでタブ区切り」に変換して送って欲しい と言われました。 保存時に 「名前を付けて保存」→「ファイルの種類」で「CSV」を選択すると「カンマ(,)」で区切られますよね? これを簡単にタブ区切りにしたいのですが・・そんな方法はありますでしょうか? 現在、試作の段階では一旦TXT形式で保存し、ファイル名を直接「CSV」に変更しています。 実は常時この作業を行う者が私よりPCに詳しくない為、この手順だと不安だと言います。 出来る限りわかりやすく作業を行いたいのです。 不明点があれば補足させていただきますので アドバイス等ございましたらどうぞよろしくお願いします。

両面印刷のやり方
このQ&Aのポイント
  • 【DCPーj982n】での両面印刷のやり方を教えてください。
  • パソコンで使用している【DCPーj982n】の両面印刷方法についてのトラブルを解決するための情報です。
  • 【DCPーj982n】の両面印刷の方法や設定についての質問です。
回答を見る

専門家に質問してみよう