none
Низкая скорость работы vbs с файлами, в чем причина? RRS feed

  • Вопрос

  • добрый день!

    есть файл, с порядка 20т записей - строк. обычный текстовый. надо создать на его основе новый, исключающий дублирование строк. написал простейший скрипт, открываю исходный файл на чтение, делаю его копию тоже открываю на чтение, далее беру циклом построчно из файла 1, и сравниваю циклом по 2 файлу (его копии). первое совпадение пишу в новый файл. время его выполнение чудовищно. пк 2 ядра, ОС 7. 

    Dim fso1, strLine1, strLine2, targetDir, targetF, dub_count, first_string, second_string
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    
    Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
    targetDir = InputBox ()
    targetF = InputBox ()
    
    '	MsgBox targetDir&"\"&targetF
    	If fso1.FileExists(targetDir&"\"&targetF) Then
    
    
    fso1.CopyFile targetDir&"\"&targetF,targetDir&"\"&Search_Space(targetF,".")&"n.txt"
    
    
     Set TxtStream = fso1.OpenTextFile(targetDir & "\" & targetF, ForReading,False)
    
     Set TempStream = fso1.CreateTextFile(targetDir & "\" & Search_Space(targetF,".")&"d.txt",ForWriting,False)
    
    '*********************************************************
     Do Until TxtStream.AtEndofStream	
     
     	number_line1 = TxtStream.Line
    
     	first_string = TxtStream.ReadLine 
    
    
    	Set ExtStream = fso1.OpenTextFile(targetDir&"\"&Search_Space(targetF,".")&"n.txt", ForReading,False)
     
    
     	dub_count = 0
    
    '**********************************************************
    
    	Do Until ExtStream.AtEndofStream
    
    	number_line2 = ExtStream.Line
    	 
    
    
    	second_string = ExtStream.ReadLine		
    
    	If number_line1 =< number_line2 Then
    
    
    			If first_string = second_string Then	
    			dub_count = dub_count + 1	
    
    						if dub_count = 1 Then	
    								TempStream.WriteLine first_string
    			
    						End If
    			End If
    	End If
    		
    	Loop
    
    ExtStream.Close
    
    	first_string = ""
    	second_string = ""
    	number_line2 = 0
    	
    Loop
    
    TxTStream.Close
    TempStream.Close
    
    End If
    
     
    Function Search_Space(str,simb)
    Dim s, wr_str, i1
    
    	i1 = 1
    
    	Do until s = simb
    
    	s = mid(str,i1,1)
    	
    ' ÷èòàåì äî ïðîáåëà
    		
    		If s <> simb then
    			wr_str = wr_str + s	
    		End If	
    		
    	i1 = i1 +1
    							 				
    	Loop
    Search_Space = wr_str
    
    End function

Ответы

  • Как это, как это... самый настоящий vbscript :), даже не поленился, проверил, что работает.

    '+++++

    Const adOpenStatic = 3
    Const adLockOptimistic = 3
    Const adCmdText = &H0001

    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordSet = CreateObject("ADODB.Recordset")

    strPathToTextFile = "C:\Scripts\"
    strFile = "Test.txt"

    objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & strPathtoTextFile & ";" & _
              "Extended Properties=""text;HDR=NO;FMT=Delimited"""

    objRecordSet.Open "Select DISTINCT * FROM " & strFile, _
        objConnection, adOpenStatic, adLockOptimistic, adCmdText

    Do Until objRecordSet.EOF
        Wscript.Echo objRecordSet.Fields.Item(0).Value  
        objRecordSet.MoveNext
    Loop

    '+++++

    Преимущество такой работы с текстовым файлом состоит в том, что вы просматриваете файл не скриптом, а средствами Microsoft Jet, который, по определению, будет работать эффективнее, чем скрипт.

    Если очень кратко, вариант с регулярными выражениями состоит в применении объекта RegExp к файлу, при этом в свойстве Pattern указывается такая структура

    http://www.regular-expressions.info/duplicatelines.html

     

    Модератор
  • Vladsky30, обратите внимание также на вариант использования словаря объектом Scripting.Dictionary

    http://blogs.technet.com/b/heyscriptingguy/archive/2007/12/13/hey-scripting-guy-how-can-i-remove-duplicate-values-from-a-pair-of-text-files.aspx

    хотя вариант с ADO, безусловно, компактнее, нагляднее и, вероятно, быстрее


    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.
    Модератор

Все ответы

  • Посмотрите скрипт, "подключающийся" к текстовому файлу как к базе данных:

    http://blogs.technet.com/b/heyscriptingguy/archive/2005/08/19/how-can-i-remove-all-duplicate-lines-from-a-text-file.aspx

    Еще один вариант может быть разработан на основе регулярных выражений.

    Модератор
  • вариант по ссылке не понял, вернее это не vbscript. а что за вариант срегулярными выражениями?
  • Как это, как это... самый настоящий vbscript :), даже не поленился, проверил, что работает.

    '+++++

    Const adOpenStatic = 3
    Const adLockOptimistic = 3
    Const adCmdText = &H0001

    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordSet = CreateObject("ADODB.Recordset")

    strPathToTextFile = "C:\Scripts\"
    strFile = "Test.txt"

    objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & strPathtoTextFile & ";" & _
              "Extended Properties=""text;HDR=NO;FMT=Delimited"""

    objRecordSet.Open "Select DISTINCT * FROM " & strFile, _
        objConnection, adOpenStatic, adLockOptimistic, adCmdText

    Do Until objRecordSet.EOF
        Wscript.Echo objRecordSet.Fields.Item(0).Value  
        objRecordSet.MoveNext
    Loop

    '+++++

    Преимущество такой работы с текстовым файлом состоит в том, что вы просматриваете файл не скриптом, а средствами Microsoft Jet, который, по определению, будет работать эффективнее, чем скрипт.

    Если очень кратко, вариант с регулярными выражениями состоит в применении объекта RegExp к файлу, при этом в свойстве Pattern указывается такая структура

    http://www.regular-expressions.info/duplicatelines.html

     

    Модератор
  • Vladsky30, обратите внимание также на вариант использования словаря объектом Scripting.Dictionary

    http://blogs.technet.com/b/heyscriptingguy/archive/2007/12/13/hey-scripting-guy-how-can-i-remove-duplicate-values-from-a-pair-of-text-files.aspx

    хотя вариант с ADO, безусловно, компактнее, нагляднее и, вероятно, быстрее


    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.
    Модератор