英数字以外の削除の仕方(高速処理法)(VB6.0)_1  (No.1の個別表示) [スレッド一覧へ] |  
- 日時: 2011/04/05 13:16
- 名前: 花ちゃん
  
  - ***********************************************************************************
 * カテゴリー:[文字列処理][アルゴリズム][基本コード]                           * * キーワード:高速化,検索,文字列の連結,置換え,配列処理,                           * ***********************************************************************************
  ----------------------------------------------------------------- Re: 英数字以外の削除の仕方 - 花ちゃん  2004/06/01-08:19 No.9107  -----------------------------------------------------------------
  この場合の処理は文字列の連結に99.5%かかっており、比較の部分は0.5%しかかかって いません。 従って、文字列の連結をいかに早くするかにあります。 文字列が短い場合は連結も時間はかからないのですが、長くなると極端に遅くなります。 そこである程度までは、都度連結し、ある程度長くなったら連結をつなぎ変えます。 説明するより下記を試して見て下さい。 私のマシンでは、48.6 秒→ 1.1 と極端に早くなりました。 (あまりにも早いので間違っていないか心配ですが!。(^_^) )
  Option Explicit Private Declare Function timeGetTime Lib "winmm.dll" () As Long
  Private Sub Command1_Click() Dim lngStartTime    As Long   Dim strOneLineDat As String   Dim strTemp       As String   Dim strTemp1       As String   Dim intLoop       As Integer   Dim intAsc        As Integer   Dim dat As String
    Dim i As Integer      strOneLineDat = "aAcd-0324-PあOI*POいL\AA"   lngStartTime = timeGetTime   strTemp = ""  strTemp1 = ""     For i = 1 To 10000         For intLoop = 1 To Len(strOneLineDat)             dat = Mid$(strOneLineDat, intLoop, 1)             intAsc = Asc(dat)             If (intAsc >= 97 And intAsc <= 122) _                 Or (intAsc >= 65 And intAsc <= 90) _                 Or (intAsc >= 48 And intAsc <= 57) Then                 strTemp1 = strTemp1 & dat                 If Len(strTemp1) > 50 Then                     strTemp = strTemp & strTemp1                     strTemp1 = ""                 End If             End If         Next intLoop     Next i     strOneLineDat = strTemp & strTemp1     Label1.Caption = "timeGetTime  : " & (timeGetTime - lngStartTime) / 1000 End Sub
   
  |  
  英数字以外の削除の仕方(高速処理法)(VB6.0)_2  (No.2の個別表示) [スレッド一覧へ] |  
- 日時: 2011/04/05 13:16
- 名前: 花ちゃん
  
  - ***********************************************************************************
 * カテゴリー:[文字列処理][アルゴリズム][基本コード]                           * * キーワード:高速化,検索,文字列の連結,置換え,配列処理,                           * ***********************************************************************************
  ----------------------------------------------------------------- Re^2: 英数字以外の削除の仕方 - LESIA  2004/06/01-09:07 No.9109  ----------------------------------------------------------------- 文字列の連結は遅いので、置き換えるようにするともっと速くなります。 私のマシンでは花ちゃんの方法でも5秒くらい掛かりましたが、この方法だと0.5秒に なりました(^^)
  Private Sub Command2_Click()   Dim lngStartTime  As Long   Dim strOneLineDat As String   Dim strTemp As String   Dim intLoop As Integer   Dim intAsc As Integer   Dim dat As String   Dim i As Integer   Dim n As Integer       strOneLineDat = "aAcd-0324-PあOI*POいL\AA"   lngStartTime = timeGetTime   strTemp = Space$(Len(strOneLineDat))     For i = 1 To 10000         n = 1         For intLoop = 1 To Len(strOneLineDat)             dat = Mid$(strOneLineDat, intLoop, 1)             intAsc = Asc(dat)             If (intAsc >= 97 And intAsc <= 122) _                 Or (intAsc >= 65 And intAsc <= 90) _                 Or (intAsc >= 48 And intAsc <= 57) Then                 Mid$(strTemp, n, 1) = dat                 n = n + 1             End If         Next intLoop     Next i     strOneLineDat = Left$(strTemp, n)     Label2.Caption = "timeGetTime  : " & (timeGetTime - lngStartTime) / 1000 End Sub
   
  |  
  英数字以外の削除の仕方(高速処理法)(VB6.0)_3  (No.3の個別表示) [スレッド一覧へ] |  
- 日時: 2011/04/05 13:16
- 名前: 花ちゃん
  
  - ***********************************************************************************
 * カテゴリー:[文字列処理][アルゴリズム][基本コード]                           * * キーワード:高速化,検索,文字列の連結,置換え,配列処理,                           * ***********************************************************************************
  ------------------------------------------------------------------ Re^4: 英数字以外の削除の仕方 - Renard  2004/06/01-13:40 No.9113  ------------------------------------------------------------------
  配列をうまく使えれば、これが一番速かったです。
  Private Sub Command4_Click()     Dim lngStartTime    As Long     Dim strOneLineDat As String     Dim strTemp(1 To 10000)       As String     Dim intLoop       As Integer     Dim dat As String     Dim i As Integer          strOneLineDat = "aAcd-0324-PあOI*POいL\AA"     lngStartTime = timeGetTime          For i = 1 To 10000         For intLoop = 1 To Len(strOneLineDat)             dat = Mid$(strOneLineDat, intLoop, 1)             If dat Like "[0-9A-Za-z]" Then                 strTemp(i) = strTemp(i) & dat             End If         Next intLoop     Next i     strOneLineDat = Join(strTemp, "")     Label4.Caption = "timeGetTime  : " & (timeGetTime - lngStartTime) / 1000      End Sub
   
  |  
  |