2016-01-20 1 views
-1

У меня есть текстовый файл, содержащий 16 328 530 строк. Каждая строка имеет длину 830 байтов (828 байт данных + 2 байта для crlf). Размер файла - 13 Gig.Как обновить существующий текстовый файл в VB.NET

Я хочу, чтобы иметь возможность читать файл строки за строкой, и если определенное условие соответствует обновлению данных в строке данных, а затем переписать данные в существующий файл.

Есть ли способ сделать это в VB.NET?

Благодаря

+0

для перемотки строки по строке см. https://msdn.microsoft.com/en-us/library/system.io.streamreader.readline(v=vs.110).aspx?cs-save-lang= 1 & cs-lang = vb # code-snippet-2 – lordkain

+2

Вы не редактируете файлы, их нужно воссоздать. Итак, вам нужно выполнить итерацию файла, и если вы найдете нужную вам ситуацию, начните снова, но на этот раз пишите каждую строку в другой файл, и когда вы нажимаете строки, вам нужно отредактировать, внести изменения и написать эту строку в новый файл, а затем продолжить запись каждой строки. – Steve

+0

текстовый файл не является произвольным доступом - вы не можете обновить его только часть. он должен быть полностью издан. Поскольку вы, вероятно, не можете загрузить столько данных в память, вам придется писать в новый файл. что многие данные, вероятно, должны быть в базе данных. – Plutonix

ответ

0

Итак, теперь вот пример кода .... Я испытал это в последние несколько минут (в пустой Sub Main()

Module MainModule 

    <VBFixedString(830)> Public recordBuffer As String 

    Sub Main() 

     Dim fn As Integer = FreeFile() 

     FileOpen(fn, "c:\temp\test.data", OpenMode.Random, OpenAccess.ReadWrite, OpenShare.Shared, 830) 

     For i As Integer = 100000 To 100020 
      ' This ensures the buffer is of correct size, even if file is shorter (= new records will be added) 
      recordBuffer = Space(830) 
      FileGet(fn, recordBuffer, i, True) 
      recordBuffer = recordBuffer.ToUpper() 
      ' Here I cut away all bad things that could happen to a string :-/ 
      FilePut(fn, recordBuffer.Substr(0, 830), i, True) 
     Next i 

     FileClose(fn) 

    End Sub 

End Module 

Я проверил это с файлом, на разных его частях, и файл будет расширен, если вы поместите запись, в которой раньше не было записи (для этого требуется присвоение пространства (830) в recordBuffer до FileGet)