[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/09/07(Wed) 18:13
投稿者名:NDK
Eメール:
URL :
タイトル:
文字の置き換えについて
 お世話になります。
今、数千行のCSVファイルをバイナリーモードで開き、
Replaceで「,」を「TAB」に置き換える処理を行なっていますが、
Replaceの処理が遅い様です。 他の方法は無いでしょうか?
よろしくお願い致します。

    iFree = FreeFile
    Open sFile For Binary Access Read As #iFree
        lLen = LOF(iFree)
        
        If (0 < lLen) Then
            ReDim bytArray(lLen - 1)
            Get #iFree, , bytArray
        End If
    Close #iFree

    sCovText = StrConv(bytArray, vbUnicode)
    sCovText = Replace(sCovText, ",", vbTab)

    Kill sText

    iFree = FreeFile
    Open sText For Binary Access Write As #iFree
        Put #iFree, , sCovText
    Close #iFree

投稿時間:2005/09/07(Wed) 18:21
投稿者名:いな
Eメール:
URL :
タイトル:
Re: 文字の置き換えについて
> Replaceの処理が遅い様です。 他の方法は無いでしょうか?

他の方法の1つとして、
「,」を「TAB」に置き換える処理をPerlで行ってはいかがでしょうか?
VBからPerlプログラムを呼び出し実行させるなど
VBダケでやるよりは数倍早いです。

投稿時間:2005/09/07(Wed) 19:09
投稿者名:NDK
Eメール:
URL :
タイトル:
Re^2: 文字の置き換えについて
> > Replaceの処理が遅い様です。 他の方法は無いでしょうか?
>
> 他の方法の1つとして、
> 「,」を「TAB」に置き換える処理をPerlで行ってはいかがでしょうか?
> VBからPerlプログラムを呼び出し実行させるなど
> VBダケでやるよりは数倍早いです。

 いな様 早速ありがとう御座います。
Perlですか〜申し訳ありません。勉強不足でよくわかりません。

投稿時間:2005/09/07(Wed) 19:40
投稿者名:いな
Eメール:
URL :
タイトル:
Re^3: 文字の置き換えについて
> > > Replaceの処理が遅い様です。 他の方法は無いでしょうか?
> >
> > 他の方法の1つとして、
> > 「,」を「TAB」に置き換える処理をPerlで行ってはいかがでしょうか?
> > VBからPerlプログラムを呼び出し実行させるなど
> > VBダケでやるよりは数倍早いです。
>
>  いな様 早速ありがとう御座います。
> Perlですか〜申し訳ありません。勉強不足でよくわかりません。

そうですかぁ、20MBのSUN SNOOP形式のバイナリデータファイルを
加工・デコードするのに、Perlを利用すると、十秒程度で加工でき、
感動した覚えがあったので1例として紹介してみたのですが・・・。

投稿時間:2005/09/07(Wed) 20:31
投稿者名:ガッ
Eメール:
URL :
タイトル:
Re^4: 文字の置き換えについて
うーん…1文字を1文字に置換するだけなら、
Byte()をStringにしてからReplaceをするより
Byte()のまましたほうがいい"かも"しれませんね…

Sub ReplaceBuf(ByRef sbuf() As Byte, ByVal charFind As Byte, ByVal charReplace As Byte)
    
    Dim i       As Long
    
    On Error GoTo ReplaceBuf_Error
    For i = LBound(sbuf) To UBound(sbuf)
        If sbuf(i) = charFind Then sbuf(i) = charReplace
    Next
    
    Exit Sub    
ReplaceBuf_Error:
End Sub

投稿時間:2005/09/07(Wed) 21:00
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 文字の置き換えについて
> 今、数千行のCSVファイルをバイナリーモードで開き、
> Replaceで「,」を「TAB」に置き換える処理を行なっていますが、
> Replaceの処理が遅い様です。

10列×1万行のデータ(673KB)で試してみましたが、瞬時に変換できました。
20列×2万行のデータ(2655KB)で4.6秒でした。
20列×1万行のデータ(1308KB)で1.2秒でした。

データを小分けして、Replace すれば少しは早くなるかも。


実際のデータの詳しいサイズと処理にかかった時間を教えて下さい。

投稿時間:2005/09/08(Thu) 09:51
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
文字の置換(テスト結果)
実験結果

使用データ  20列×2万行(4579KB)

元のコードでの結果  7.4秒

下記のコードでの結果 1.9秒

sCovText = Replace(Mid$(sCovText, 1, 1000000), ",", vbTab) & _
           Replace(Mid$(sCovText, 1000001, 1000000), ",", vbTab) & _
           Replace(Mid$(sCovText, 2000001, 1000000), ",", vbTab) & _
           Replace(Mid$(sCovText, 3000001, 1000000), ",", vbTab) & _
           Replace(Mid$(sCovText, 4000001, LenN - 4000001), ",", vbTab)
上記コードをもう少し工夫すれば、もう少しは早くなるかも。
一度そちらの環境で試して見て下さい。

投稿時間:2005/09/08(Thu) 11:04
投稿者名:NDK
Eメール:
URL :
タイトル:
Re^2: 文字の置き換えについて
> 実際のデータの詳しいサイズと処理にかかった時間を教えて下さい。

お世話になります。
実際のサイズは1,450Kです、約90秒かかっています。

投稿時間:2005/09/08(Thu) 11:49
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 文字の置き換えについて
> 実際のサイズは1,450Kです、約90秒かかっています。

>私のテスト結果 20列×1万行のデータ(1308KB) で 1.2秒 でした。

sCovText = Replace(sCovText, ",", vbTab) の部分だけの処理に
どれくらいかかっていますか?
投稿されたプログラムでは、上記のコードの部分の処理が90%以上です。

OS や メモリ の関係が大きいのでは、それとも他に何か処理しているのでしょうか?

因みに私の環境は、下記です。
WindowsXP(Home SP2) VB6.0(SP6)  Pentium4  1.70GHz  640MB(RAM)

投稿時間:2005/09/08(Thu) 18:28
投稿者名:NDK
Eメール:
URL :
タイトル:
Re^4: 文字の置き換えについて
> OS や メモリ の関係が大きいのでは、それとも他に何か処理しているのでしょうか?
>
> 因みに私の環境は、下記です。
> WindowsXP(Home SP2) VB6.0(SP6)  Pentium4  1.70GHz  640MB(RAM)

 一日、検証でついやしました。
サンプルで教えて頂いた方法等を試しましたが、花ちゃん様のご指摘通り
メモリの関係が大きくディスクスワップが遅い原因です。
ご協力頂いた、いな様、ガッ様、花ちゃん様には感謝致します。
Perlの利用も含め再検討致します。