• ベストアンサー

ADODB.Streamで開いたファイルに追記する

VBScriptでCSVファイルをADODB.Streamを使って開き ファイルの最終行に1レコード追加する処理を行いたいのですが、 開く際に"追記"を指定することはできないようです。 (FileSystemObjectでは開く際に"追記"を指定することが出来ますが) CSVファイルの形式がUTF-16BEであるため ADODB.Streamを使用して開きます。 どのようにすれば追記が可能でしょうか?

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

  • ベストアンサー
回答No.1

Option Explicit Dim objStream Set objStream = CreateObject("ADODB.Stream") 'UTF-BEと入力し続けて誤りに気づけず、時間を食った。ヒドイです、先生(何。 objStream.CharSet = "UNICODEFEFF" objStream.type = 2 ' Openの第一引数にファイルパスの文字列与えたらエラーが起きて書けなかった。 objStream.Open() '前述の通り直接ファイルを開けなかったのでファイルの中身を全て読み込むことに。質問者さんの環境ではうまくいくのかなぁ? 'ファイルにはabcと書かれている。 objStream.LoadFromFile("D:\aaa.txt") 'setEOSでうまくいくかと思いきや、Positionが0のままだったので、 'しょうがないからこの方向で。 objStream.Position = objStream.size objStream.WriteText("def") objStream.Flush() '先ほどのファイルaaa.txtに書き込めなかったので '別ファイルに書き込むことに。 '結果:ファイルが期待通りabcdefに。ねんがんのabcdefをてにいれたぞ! '質問者さんの環境が俺と同じく、aaa.txtに書き込めないなかったら別のファイルを作る。 'もし、同名のファイルにしておきたかったら、別名ファイルを作っておいて、新しいファイルに書いて '古い方削除して、新しい方をリネームみたいな手法になるだろうか。 objStream.SaveToFile("D:\aaa2.txt") '閉じる。 objStream.Close() '合図がないと実行されたのかよくわからなかったから。 Msgbox("End") 'CSVとして読んだわけじゃないから(あまり考え方としては好きではない。 '文字列データ内に改行があるケースは考えてないし、 '読み込んだ元データの最後に改行がないとかいうケースは考えりゃどうにかなるだろう。 'ただ、本当はExcelやOOo Calcで"CSVとして読みこんで"、マクロで(テキストファイルとしてではなく)CSVとしていじるって方が好き 'この辺は俺が「正規表現でXMLやHTMLのソースをいじる回答に間違いが多い」ことや、 '結果的に「エスケープ」や「ヴァリデート」ではなく「サニタイズ」を考ることの一貫性が取れないことにイライラする 'あたりから来ているんだろうな、多分。

superss28
質問者

お礼

ご回答ありがとうございます。 ファイルの中身はLoadFromFileで全て読み込む方法で良いと思います。 ↓この一行でPositionを最後に移動させるのがポイントでした。 objStream.Position = objStream.size あとはWrite処理を行うことでファイルの最後に 追記することができました。

関連するQ&A

  • ADODB.Streamで開いたファイルに追記

    「ADODB.Streamで開いたファイルに追記する」を参考に以下を作成しました。 c:\test.txtファイルを検索し、regEx.Patternで指定した一行を既存のC:\test_new.txtに追記したいと考えています。ちなみにファイルはUTF-8なのでADODB.Streamを使用しています。 C:\test_new.txtの最後の行にregEx.Pattern = "aaa"で指定した行が追記されることは確認していますが、C:\test_new.txtにc:\test.txtがコピーされて最後の行にregEx.Patternが追記されます。 試行錯誤しましたが初心者なため上手く動作しません。 既存のC:\test_new.txtに指定した一行を追記するにはどうしたら良いでしょうか。 お手数ですが、何方かご回答よろしくお願いします。 Option Explicit Dim objStream,regEx,testLine,tempLine Const adSaveCreateOverWrite = 2 Set objStream = CreateObject("ADODB.Stream") objStream.CharSet = "UTF-8" objStream.Open() objStream.LoadFromFile("c:\test.txt") Set regEx = New RegExp regEx.Pattern = "aaa" Do Until objStream.eos tempLine = objStream.readtext(-2) If regEx.Test(tempLine) Then testLine = tempLine End If Loop objStream.Position = objStream.size objStream.WriteText(testLine) objStream.SaveToFile("C:\test_new.txt"),adSaveCreateOverwrite objStream.Close() Msgbox ("End")

  • VBSで特定の文字で始まるファイルを開く

    VBSで"ADODB.Stream"オブジェクトを作成した場合、 LoadFromFileで開くファイルを指定するものだと思いますが、 このとき、特定の文字で始まるファイルを開く場合 どのように指定すれば良いのでしょうか? Set iSt = CreateObject("ADODB.Stream") ist.Charset = "UTF-16BE" ist.Open ist.LoadFromFile(?) オブジェクトがFileSystemObjectであれば *を使用してファイルを開くことができたのですが、 文字コードが"UTF-16BE"であるため ADODB.Streamを使うよう制限されています。

  • ADODB.Streamを使って新規にファイルを作

    ADODB.Streamを使って新規にファイルを作成することは可能ですか? --------------------------------------------- Sub test1() Dim n As Long n = FreeFile Open "C:\sample.html" For Output As #n Print #n, "テキスト" Close #n End Sub これで、新規にhtmlファイルを作れるのですが --------------------------------------------- Sub test2() Dim st As Object Dim Sample As String Set st = CreateObject("ADODB.Stream") オブジェクトに保存するデータの種類を文字列型に指定する st.Type = adTypeText 文字列型のオブジェクトの文字コードを指定する st.Charset = "UTF-8" st.Open 'オブジェクトのインスタンスを作成 st.WriteText Sample, adWriteLine 'ココでエラー オブジェクトの内容をファイルに保存 st.SaveToFile ("c:\sample.html"), adSaveCreateOverWrite オブジェクトを閉じる st.Close メモリからオブジェクトを削除する Set st = Nothing End Sub --------------------------------------------- この方式で新規にファイルを生成して保存することは可能ですか? 該当部分でエラーが発生します。

  • Adodbの改行コードについて

    お世話になります。 クライアントにAccessが無いのでAccessモドキを作るのが目的で CSVを読み込み編集しCSVを書き出すhtaを作成しているのですがAdodbで躓いてしまいました。 読み込んだCSVの仕様に準拠して書き出すのですが、 どうしても改行コードが上手く出力出来ず悪戦苦闘中です。 WriteTextで行区切り文字を指定していますが 指定していないとLFが出力されており、 現在の指定でもCRLFの後にLFが吐き出されています。 LFが邪魔で仕方ないのですが必ず出力されてしまうものなのでしょうか? 回答お待ちしております。 CSVの仕様 ・UTF-8 ・セル内改行コード:LF ・行区切り:CRLF ・全セル「"」括り 書き込みデータ ・配列:textArray (「"」括り、「,」区切り済み、1要素1レコード) /* * @param file : ファイルフルパス * @param textArray : 書き込み配列 * return boolean : 成功判定(失敗時エラーコード) */ function adodbLineout(file, textArray){ try{ var adbStrm = new ActiveXObject("ADODB.Stream"); adbStrm.Charset = 'UTF-8'; adbStrm.lineSeparator = -1; for(i=0;i<textArray.length;i++){ if(textArray[i] == ""){continue;} adbStrm.WriteText(textArray[i], 1); } adbStrm.SaveToFile(file); adbStrm.Close(); return false; }catch(e){ return e; } } 因みに疑似システムはマクロで既に組み上げていたりするので 「Excelで作れ」など別システムの推奨はご遠慮下さいませ。 (読み込みファイルはそのExcelで作成しています。)

  • Excel VBS、ADODB.Streamで改行

    助けてください。 Excel VBAでテキストファイル出力をしているのですが、改行をどのように書き込めばいいのかわかりません。 ネットで調べても、改行コードを設定できる情報ばかりで、改行自体を書き入れる方法がわかりませんでした。 \n \r\n などと入力しても文字列としてそのまま出力されていまいます。 Windows 7 64 bit Excel 2007 書き出すファイルが UTF-8 のため、普通の出力ではなくADODB.Streamを使っています。 よろしくお願いします。

  • バッチファイルでcsvファイルに追記していきたい

    C:\log\abc のディレクトリの中に、 log.csv log1.csv log2.csv log3.csv.... という複数のファイル(最終番号は絶えず変動する)があり、 それぞれは1行4カラム記載されています。 やりたいことは、バッチファイルにより log.csvのカラム内容 log1.csvのカラム内容 log2.csvのカラム内容 log3.csvのカラム内容 が最終番号のcsvファイルまで1つのlogR.csvに纏まることです。 下記のバッチファイルを組んでみたのですが、 C: CD \log\abc COPY log.csv logR.csv type log1.csv >> logR.csv type log2.csv >> logR.csv type log3.csv >> logR.csv これだと、追記が2行目3行目とならず、1行目の横にずっと広がって追記されてしまいます。 また、バッチファイルの指示が番号指示になってしまいますので、この指示番号から外れた ファイルがあった場合は、書き込みがされなくなります。 やりたいことは、 ●行として追記されること。 ●logの番号.csvを全て自動で読みだして追記することです。 http://okwave.jp/qa/q1371517.html の方法は試したのですが、どうもうまくいきませんでした。 お手数をおかけいたしますが宜しくお願い致します。

  • ADODB.Streamを使用してUTF-8を出力

    こんちには。VBA初心者です。 Excelのワークシートの値をUTF-8形式のテキスト(.csvで保存します)形式でエクスポートするため、以下のようなコードを書いてみたのですが、「.Type = adTypeText」のところで、「実行時エラー 3001:引数が間違った型、許容範囲外、または競合しています。」のエラーになってしまいます。 ADO関係はほとんど知識がなく、「http://msdn.microsoft.com/ja-jp/library/cc408239.aspx」こういうところで調べても、よく理解できないことが多いので困っています。 どなたか助言をいただけないでしょうか。 (後学のために多少の解説もいただけると助かります) Sub exportToCsv() Dim myBook As String Dim mySheet As String Dim myLastRow As Long Dim i As Integer myBook = "sample.xlsm" mySheet = "sample" Workbooks(myBook).Worksheets(mySheet).Activate myLastRow = Cells.SpecialCells(xlLastCell).Row Set myStream = CreateObject("ADODB.Stream") With myStream .Type = adTypeText .Charset = "UTF-8" .Open .WriteText End With For i = 1 To myLastRow myStream.WriteText Cells(i, 1) & vbLf Next i myStream.SaveToFile "D:\sample.csv" myStream.Close Set myStream = Nothing End Sub

  • 【VBA】保存したcsvファイルをメモ帳でUTFに変換する方法を教えてください。

    VBAの初心者です。 皆様のお力をお借りしたい次第です。 今私はデスクトップに保存したcsvファイルをUTFに変換し、 windowsメールでアドレスのインポートをしようとしていますが、 csvファイル自体をUTFに変換すると文字化けをしてしまうため、 メモ帳でUTFに変換→csv保存をしたいと思っております。 メモ帳をExcelから命令するにはどうしたらいいでしょうか? 以下はUTFに変換する際に使用させてもらったものです。 Dim JIS, UTF Set JIS = CreateObject("ADODB.Stream") JIS.Open JIS.Type = 2 JIS.Charset = "shift_jis" JIS.LoadFromFile "C:\~\JIS.csv" Set UTF = CreateObject("ADODB.Stream") UTF.Open UTF.Type = 2 UTF.Charset = "utf-8" JIS.CopyTo UTF UTF.SaveToFile "C:\~\UTF.csv", 2 JIS.Close Set JIS = Nothing UTF.Close Set UTF = Nothing

  • 「VBScript」ADODB.Streamにおけるファイル読み込みについて(他

    以下の解決方法をご教授願えませんでしょうか。 宜しくお願いいたします。 前提:ギガバイト単位のテキストファイル(サーバのログファイル)を扱うスクリプトを作成したい。 必須機能:grep機能、動作が軽快で早い事  また、できるだけ外部ツールを使用したくない事(サーバ上に載せる事も視野に入る為) 私が行った事: 1. まずテキストファイルとしてgrepするスクリプトを作成。  方法(1) ReadLineで1行ずつ読み込み、正規表現にてマッチする行を変数に格納  その後、その変数をファイルに書き出ししてみた。   ⇒処理速度が遅すぎて使い物にならない。  方法(2) &演算に処理を食い、速度が遅くなる為、一度ファイルを読み込み  正規表現にてマッチしない行を1度に削除し、新しいファイルに書き出してみた   ⇒テストファイルだと狙った通りに処理がかなり早くなったが、実ファイルが    ギガバイト単位の為、メモリオーバーフローを起こし使い物にならない    (ま、そりゃそうだよねorz)  方法(3) &演算に処理を食うのは避けたい為、ReadLineにて行毎に読み込み、  正規表現にてマッチした行をWriteLineにてファイルに書き出し。   ⇒(1)よりは早くなり、ひとまず完成。ただし、それでも処理が遅いのと    CPUパワーを使う為に処理中他の作業がし辛いのが問題。 2. そこで、1度捨てた(2)の方法を何とか使えないかと思案し、ファイルを   適当なサイズで分割する形にしようかと思い、以下の分割用スクリプトを作成   ⇒でも、結局LoadFromFileにてメモリ上にファイルを展開する為、    メモリオーバーフローを起こす事に。 要は、c言語のfreadみたいな事ができれば解決できると思うのですが… この方法に限らず、何かいい案があればアドバイスをお願いいたします。 以下、バイナリーにて分割するスクリプト Option Explicit Const FilePath = "分割対象ファイルパス" Const ReadLen = 134217728 Dim bytData, intX intX = 0 With CreateObject("ADODB.Stream")  .Open  .Type = 1  .LoadFromFile(FilePath)  .Position = 0  Do Until .EOS   bytData = .Read(ReadLen)   With CreateObject("ADODB.Stream")    .Open    .Type = 1    .Write(bytData)    .SaveToFile FilePath & "." & CStr(intX), 1    .Close   End With   intX = intX + 1  Loop  .Close End With

  • VBScript で ADO Streamオブジェクトの Writeを使いたい

    VBScriptでバイナリファイルを書き込みたいのですが、以下のコードで Writeしようとするとコンパイルエラーとなります。 なぜですか? Option Explicit Dim stream Dim i Dim line Set stream = CreateObject("ADODB.Stream") stream.Open stream.Type = 1 line = Array(61,0,13,0,10,0) stream.Write line stream.SaveToFile "bbb.txt", 2 stream.Close Set stream = Nothing

専門家に質問してみよう