ASP / VB Classic очистить строку из файла - PullRequest
1 голос
/ 15 августа 2011

У меня есть файл, который выглядит следующим образом:

Alpha,25,SomeBrand,Info
Gamma,2039,Crisps,Foobar
Epic,240,Win,Post

И я хочу очистить определенную строку в этом файле, скажем, строку 2, чтобы она выглядела так:

Alpha,25,SomeBrand,Info

Epic,240,Win,Post

Как я могу эффективно сделать это?Этот файл содержит более 18000 строк, и я попытался прочитать весь файл и записать обратно, но это было слишком медленно.

Ответы [ 2 ]

0 голосов
/ 16 августа 2011

Я не знаю, какой у вас размер файла, но я написал, что скрипт (asp) выполняется в течение 2,5 секунд.Размер текстового файла составляет 35 миллионов байт, и он имеет 35 000 строк.

Здесь:

<%@Language = VBScript %>
<%
Option Explicit

Dim oFso, oFile, arrLns, arrLNums, strOut, e
arrLNums = Array(15) '15th [and nnth] line(s) will be cleared

Set oFso = CreateObject("Scripting.FileSystemObject")
Set oFile = oFso.OpenTextFile("C:\old.txt", 1)

    strOut = Replace(oFile.ReadAll(), vbCr, "")
    arrLns = Split(strOut, vbLf)
    For Each e In arrLNums : arrLns(e - 1) = "" : Next
    strOut = Join(arrLns, vbCrLf)
    oFso.CreateTextFile("C:\cleared.txt", True)_
    .Write(strOut) 'Saved

oFile.Close
Set oFile = Nothing
Set oFso = Nothing
%>
0 голосов
/ 15 августа 2011

Поскольку вы не можете использовать приемы перемещения указателя файла, чтобы изменить файл «на диске» в VBScript, вам придется переписать его. Вы проверяли, достаточно ли быстро вы используете .ReadAll () и .Write? Если да, мы могли бы обсудить способ эффективного изменения. Первый вопрос: Вы хотите удалить ошибочную строку или заменить ее пустой?

Следующий шаг:

Этот код VBScript:

  Dim goFS      : Set goFS     = CreateObject( "Scripting.FileSystemObject" )

  Dim sDir      : sDir         = "..\testdata\editlargefile"
  Dim sSrcFSpec : sSrcFSpec    = goFS.BuildPath( sDir, "lines.txt" )
  Dim nLine     : nLine        = 5
  Dim nSize     : nSize        = goFS.GetFile( sSrcFSpec ).Size
  WScript.Echo nSize, "bytes in", sSrcFSpec

  ReDim aHead( nLine - 2 )
  Dim oTS, nIdx, sTail

  Set oTS = goFS.OpenTextFile( sSrcFSpec )
  For nidx = 0 To UBound( aHead )
      aHead( nIdx ) = oTS.ReadLine()
  Next
  oTS.ReadLine
  sTail = oTS.ReadAll()
  oTS.Close

  WScript.Echo Left( Join( aHead, vbCrLf ) & vbCrLf & vbCrLf & Left( sTail, 100 ), 150 )

  Set oTS = goFS.CreateTextFile( sSrcFSpec, True )
  oTS.Write Join( aHead, vbCrLf )
  oTS.Write vbCrLf & vbCrLf
  oTS.Write sTail
  oTS.Close

выход:

20888896 bytes in ..\testdata\editlargefile\lines.txt
This is line 1
This is line 2
This is line 3
This is line 4

This is line 6
This is line 7
This is line 8
This is line 9
This is line 10
Thi
=====================================================
xplfs.vbs: Erfolgreich beendet. (0) [11.42188 secs]

демонстрирует самый быстрый способ VBScript, который я могу себе представить. Псевдокод для языка, способного делать трюки с указателями файлов, будет

Open the file in read+write mode
Loop over the head lines to keep
If Delete
   Skip line to delete
   Reset write file pointer to end of previous line
   Block write to file pointer till end
Else
   Fill line to delete with spaces
End
Close the file

Какой язык вы планируете использовать?

...