特殊文字変換について

解決


JULIO  2005-06-09 18:40:00  No: 90339  IP: [192.*.*.*]

テキストファイルに書き込まれている特殊文字をエディタで見ると
文字コードの関係か文字化けしてしまいます。
これを文字化けしない文字に変換したいと思っています。
一応、下記のコードで実現できたのですが、なんせ1バイトづつ処理
しているため100MBもあったりするファイルだと処理に時間がかかり
過ぎてしまいます。
他に方法があればご教授お願いします。

Open WorkFile1 For Binary Access Read Write As #1

Counter = 1
Do While Not EOF(1)
    Get #1, Counter, ByteData     
        Select Case ByteData
        Case 64:    ByteData = 35
        Case 129:   ByteData = 92
        Case 135:   ByteData = 92
        Case 164:   ByteData = 35
        Case 167:   ByteData = 94
        Case 134:   ByteData = 33
        Case 137:   ByteData = 37
        Case 187:   ByteData = 62
        Case 128:   ByteData = 32
        Case 0:     ByteData = 64
        End Select
    Put #1, Counter, ByteData
    Counter = Counter + 1
Loop
Close #1

編集 削除
ガッ  2005-06-09 19:11:04  No: 90340  IP: [192.*.*.*]

時間が掛かるのは1バイトずつ読み込んで書き込んでいるからですね。
100KBずつ読み込んで変換して書き込んだり、Select-Caseで置換するのではなく、
変換する置換列(ただの配列か…)を使ってみるとか。

編集 削除
クラゲ  URL  2005-06-10 00:39:04  No: 90341  IP: [192.*.*.*]

ファイルI/Oを入力・出力に分ければどうでしょうか?
これだけでも、若干、スピードアップはします。

    Dim iFno1 As Integer
    Dim iFno2 As Integer
    Dim lCounter As Long
    Dim ByteData As Byte

    iFno1 = FreeFile
    Open "D:\Test.txt" For Binary Access Read As iFno1
    
    iFno2 = FreeFile
    Open "D:\Test_OK.txt" For Binary Access Write As iFno2


    lCounter = 1
    Do While Not EOF(iFno1)
        Get #iFno1, lCounter, ByteData
            Select Case ByteData
                Case 64:    ByteData = 35
                Case 129:   ByteData = 92
                Case 135:   ByteData = 92
                Case 164:   ByteData = 35
                Case 167:   ByteData = 94
                Case 134:   ByteData = 33
                Case 137:   ByteData = 37
                Case 187:   ByteData = 62
                Case 128:   ByteData = 32
                Case 0:     ByteData = 64
            End Select
        Put #iFno2, lCounter, ByteData
        lCounter = lCounter + 1
    Loop
    
    Close iFno2
    Close iFno1

遅いようであれば、100バイトくらいのバッファを
ByteDataを配列データとして扱い、
次のループで置換・保存と行うことになります。
ただ、ループ数が2倍になるので、あまり意味がないかもです。

編集 削除
JULIO  2005-06-16 20:16:45  No: 90342  IP: [192.*.*.*]

ガッさん、クラゲさんありがとうございました。
配列を使うことでかなり改善しました。

編集 削除