• ベストアンサー

VB6.0 改行コードのないファイルの読み込み

VB6.0で改行コードが無く、半角と全角文字が入り混じっているファイルの読み取り方法を教えて下さい。 通常の一行読み込みの範囲を大幅に超えている文字列です。 他のサイトで以下のようなプログラム(20バイトずつ切り取って読む)を見つけたのですが、 Dim InFileNo As Integer Dim Buf As string * 10 Dim LINE As Long InFileNo = FreeFile Open "C:\test.txt" For Random As #InFileNo Len = 20 LINE = 1 Do Until EOF(InFileNo) Get #InFileNo, LINE, buf LINE = LINE + 1 Loop これだと、半角と全角が混じっている箇所で文字化けを起こしてしまいます。 以上です。よろしくお願い致します。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

文字数指定の読み込みはInput(文字数,ファイル番号)という文を 使います。但し、EOFを超えるとエラーになるので、TextStreamの 方が楽かも知れません。以下はその例です。 Dim FSO, Txs Dim Buf As String Dim LINE As Long Set FSO = CreateObject("Scripting.FileSystemObject") Set Txs = FSO.OpenTextFile("C:\test.txt", 1) '1 は入力モード Do Until Txs.AtEndOfStream     LINE = LINE + 1     Buf = Txs.Read(20) '20文字という意味 Loop Txs.Close Readメソッドは残りが20文字未満の場合、エラーにならず、残りの 文字列を返します。Input文では残りが指定文字数未満だとエラーに なります。但し、EOF検出後にReadメソッドを実行すると、さすがに エラーになります。

その他の回答 (2)

  • yama1718
  • ベストアンサー率41% (670/1618)
回答No.2

それは、20バイト固定にしたらおかしくなりますよね。 横着しないで、頭から文字コードを1文字ずつ抜き出して、 半角文字と全角1バイト目の文字(0x80~0x9Fと0xE0~0xFC)と2バイト目の文字を判定するべきです。 その他にヌル0x00や改行コードなどの制御文字コードをどうするかの処理も必要です。 それで、20バイト目が全角1バイト目の文字コードになるなら、 その文字はキャンセルして、頭から19文字だけ使用します。 次の読み込みでは、前回の最後の文字+次に読み込んだ20文字にして また、頭から見ていきます。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

どの程度の大きさのファイルなのでしょう? Binaryモードで読み込んでStrConvなどで文字列に変換 なんて方法もありますよ Dim arBin() as byte, ss as String Open "C:\Test.txt" For Binary Access as #1 Redim arBin( LOF(1)-1 ) Get #1,, arBin Close #1 ss = strConv(arBin, vbUnicode) といった具合です

関連するQ&A

  • Excelで作成されたCSVのVBでの読み込み

    いつもお世話になっております。 Excel2K、2002を使用しております。 Excelで作成されたCSVファイルをVBAで読み込もうと、以下の関数を作成しました。 Public Function CsvRead(ByVal FileName As String)   Dim IntFileNum As Integer 'ファイル番号   Dim TmpStr As String '   IntFileNum = FreeFile   Open FileName For Input As #IntFileNum 'CSVファイルのオープン   Do Until EOF(IntFileNum)     Input #IntFileNum, TmpStr     '     '~その他の処理~     '   Loop   Close End Function その他の処理中で特定の列に対し、特殊な処理を行う必要があるのですが ExcelでCSVファイルを作成する場合、16行単位でカンマの変動が起こりえますので、 http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B400253 正確な列が取れません。 そこで1行読み込んでカンマで分解すればよいかと思い、 以下のように読み込んでみたのですが、、   Dim TmpStr() As String '   Dim LineStr As String   IntFileNum = FreeFile   Open FileName For Input As #IntFileNum 'CSVファイルのオープン   Do Until EOF(IntFileNum)     Line Input #IntFileNum, LineStr     TmpStr = Split(LineStr, ",")     '     '~その他の処理~     '   Loop 値にカンマが存在する場合も区切ってしまうので これも正しく取れませんでした。 値のカンマは区切り文字として判定せず、 正しく値を取得するにはどのようにすればよいでしょうか。 上記のことをふまえた判定をすべて行うしかないでしょうか。 ご教授のほど、よろしくお願いいたします。

  • ExcelVBAのLineInput取得値の置換等

    ExcelのVBAでLine Inputで取得した内容について、 いくつかの処理を行いたいのですが記述が分かりません。 どうか教えて頂きたく思います。 Sub test() Dim buf As String Open "D:\test.txt" For Input As #1 Do Until EOF(1) Line Input #1, buf 「ここに入る処理の記述」 Loop Close #1 End Sub 知りたい記述の処理内容 Bufの中を先頭から1文字1文字確認して… 1.もしBufの先頭と行末にスペースがあれば、スペースを削除(全角・半角・タブを対象) 2.もしBufに2文字以上の連続スペースがあれば、それが1文字になるまで削除(1文字だけは残す) 3.もしBufに半角英大文字があれば半角英小文字にする(または半角英小文字を半角英大文字にする) 4.もしBufに全角数字があれば、半角数字に置換する 5.もしBufに全角漢字(都道府県市区町村名等)しか無かった場合、特定の文字の後に全角スペースを入れる(県と市) 6.もしBufに数字の後に続く半角ハイフンがあった場合(2-5-301号室等)ハイフンを全角にする 7.もしBufに"郵便番号"或いは"〒"の文字があった場合、該当する文字のみを削除 8.もしBufに"東京都""沖縄県""大阪府""北海道""福岡県"以外の文字があった場合、該当する文字以外を削除 9..もしBufが47都道府県以外の文字で始まった場合、Bufの先頭に"都道府県名エラー"と加える 全て別々の処理として教えて頂きたく思います。 分かる部分だけで構いませんので、どうぞ宜しくお願い致します。

  • VBAにより作成した関数の返り値をセル内で改行したいのですが、どうした

    VBAにより作成した関数の返り値をセル内で改行したいのですが、どうしたら良いのでしょうか? Private Function txtdate(filepass As String) Dim fileNo As Integer Dim count As Integer Dim outline As String Dim buf fileNo = FreeFile Open filepass & ".txt" For Input As #fileNo ' Do Until EOF(fileNo) Line Input #fileNo, buf If count = 0 Then outline = outline & buf MsgBox outline Else outline = outline & vbLf & buf MsgBox outline End If count = count + 1 Loop Close #fileNo txtdate = outline End Function このような形でテキストファイルの中身を読み込んでセルに反映させるという事をおこないたいのですが、テキストの内容が2行以上の場合、帰ってくる値に改行を入れたいと思っております。 17行目にそれらしくvblfを追加したのですがセルに上手く反映されません。msgboxで確認したところmsgboxでは問題無く改行が反映されているようなのですが… エクセルセル内で「=txtdate("適当なテキストファイルのパス名")」という形で関数を呼び出しています。 どなたか対処法教えていただければ幸いです。よろしくお願い致します。

  • VBAフォルダ内ファイル入出力について

    Accessで特定のフォルダ内にあるcsvファイルを全て読み込み、別のcsvファイルへ 出力するという処理を作りたいのですが、最近からVBAを始めたばかりで どうすればよいか分かりません。 とりあえず、特定のファイルをひとつ読み込み、別ファイルへ出力することはできました。 Option Compare Database Private Sub Button_Click() Dim No As Integer Dim buf No = FreeFile Open "C:\test1.csv" For Input As #1 Open "C:\test2.csv" For Output As #2 Do Until EOF(No) Line Input #1, buf Print #2, buf Loop MsgBox "処理終了" Close #1 Close #2 End Sub 読み込み対象を「特定のフォルダ内のファイル全て」 にする方法が知りたいです。 ちなみに出力先のファイルはひとつにまとめてもそれぞれ別のファイルに 出力でもどちらでも構いません。 できれば両方教えていただければ有難いです。 宜しくお願いします。

  • エクセルにてテキストファイル読み込みでエラー  

    いつもお世話になっております。 テキストファイル (test.txt)をエクセルマクロにてセルへの読み込みを したいのですが、なぜか エラーになります。 Cells(n, 1) = buf  でエラーのようです。 理由がわかりません。 教えてもらえないでしょうか 普通の文章なら読み込みできるのですが =  を使っているとエラーがでるようです。 test.txtの画像を添付します。 エクセルのマクロの内容は次の通り Sub テキストファイルをセルに転記() Dim buf As String, n As Long Open "C:\Users\a\Desktop\test.txt" For Input As #1 Do Until EOF(1) Line Input #1, buf n = n + 1 Cells(n, 1) = buf Loop Close #1 End Sub

  • エクセルVBA:テキストデータ(txt)の読込(改行が変なところでされる)

    勉強しながら、エクセルVBAを組んでみたのですが うまくいきません。 テキストデータを以下のようなプログラムで読んだのですが (100行のデータを縦に並ぶように100個のセルの書き出す) 読み込みデータに「↓」で改行されているところでは 「↓」の間は同一行と見なされてしまうのですが どのようにしたら一行で一つのデータと見てくれるのでしょうか? 分かる方がいましたら教えて下さい。 よろしくお願いします。 Sub pon() '*** 変数の宣言 *** Dim filenum As String Dim i As Integer Dim num As Integer, ms As String, cnt As Integer Dim BookName As String, PathName As String Dim ca As String cnt = 1 i = 1 ca = Cells(1, 56) PathName = "C:\" textpath = Dir(PathName & "pon" & ca & ".txt") BookName = Dir(PathName & "pon" & ca & ".txt") Open PathName & BookName For Input As #1 'ファイルを開きます Do While Not EOF(1) Line Input #1, ms cnt = cnt + 1 Cells(1, 57) = BookName 'データの書き出し Cells(cnt, 56) = ms 'データの書き出し Loop Close #1 End Sub

  • VB6 「Line Input」でのリークについて

    VB6での「Line Input」命令使用時のメモリリークについて教えて下さい。 1分毎に3600行のCSVファイルを読み込むプログラムを作成しています。  (CSVファイルは1行500文字程度) 以下の【パターン1】は作成したプログラムの1部ですが、 (1)を3600回ループ時にパフォーマンスモニタでの「Private Bytes」が増加してしまいます。   (1ループ毎に増加せず、数十回ループする毎に増加します。) 試しに【パターン2】を作成し、CSVファイルはオープンのみ行い、 読み込みは行わずに、500文字の文字列が入った変数をコピーした場合は、 「Private Bytes」は増加しません。 基本的に違いは(1)と(2)の箇所だけなのですが、 「Line Input」命令の使用方法などで間違っている箇所があるのでしょうか? ご存知の方、教えて下さい。お願いします。 【パターン1】 Private Sub read_Timer() Dim i As Long Dim CsvDataBuf(3600) As String 'CSV読込み変数 Dim FP As Integer 'ファイル番号 (省略) : FP = FreeFile Open "C:\test.csv" For Input As #FP i = 0 Do While Not EOF(FP) And i <= (3600 - 1) Line Input #FP, CsvDataBuf(i)     ←(1) i = i + 1 Loop Close #FP : (省略) 【パターン2】 Private Sub read_Timer() Dim i As Long Dim CsvDataBuf(3600) As String 'CSV読込み変数 Dim tempBuf As String Dim FP As Integer 'ファイル番号 (省略) : tempBuf = "~500文字の文字列~" FP = FreeFile Open "C:\test.csv" For Input As #FP i = 0 Do While Not EOF(FP) And i <= (3600 - 1) CsvDataBuf(i) = tempBuf       ←(2) i = i + 1 Loop Close #FP : (省略)

  • webBrowser変数Aじゃだめなの?

    例文 Dim filenumber As Integer filenumber = FreeFile Dim A As Integer A = 1 Open "\accsess.dat" For Input As filenumber Do Until EOF(filenumber) Input #filenumber, accsess WebBrowserA.Navigate accsess A = A + 1 Loop accsess.datからURLを読み込んでbrowserに表示したいのですが、webbrowserAの変数Aの部分が邪魔してうまくいきません。 表示するだけなら、他にも色んな方法があると思いますが できれば変数としてBrowserをあやつりたいです。 どうすればいいのでしょうか?

  • VB2008で全角半角の判定

    VB2008で全角半角の判定 VB6 では下記のようにして判定していましたが、VB2008では どのようにすればよいのかお教えください。  dim moji as string dim zhN as integer  zhN = LenB(StrConv(moji, vbFromUnicode)) mojiには1文字格納されており、  半角なら zhN = 1 全角なら zhN = 2 となる。  これをVB2008で実現する方法がわかりません。  よろしくお願いします。

  • VBA-読み込んだテキストファイルを並び替えて書き出したい

    VBA-読み込んだテキストファイルを並び替えて書き出したい ch1=FreeFile Open A for Input as ch1 ch2=FreeFile Open B for Input as ch2 DO while Not EOF(ch1) Line Input #ch1,buf Print #ch2,buf Loop Close #ch1,#ch2 で読み込み、書き出すことはできました。 やりたいことは、書き出す時に、項目を並べ替えたいのです。 例 にんじん りんご ねこ だいこん バナナ いぬ ↓ りんご ねこ にんじん バナナ いぬ だいこん よろしくお願いいたします。 区切りはタブです。

専門家に質問してみよう