Как обработать большой текстовый файл - 1Гб?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Dimon111 » 17.12.2009 (Чт) 11:28

alex77755 писал(а):
Prime2. Красивый, но похоже бесконечный. Формирует пустой файл.

У меня работает корректно и в три раза быстрей чем первый(у меня команда4)
Код: Выделить всё
Sub Комманда1_Click()
Dim a, b, c, d, e, f, g, h As String
Dim i
Open "C:\LOG.txt" For Output As 3
Print #3,
Close #3
Open "C:\LOG.txt" For Append As 3
Print #3, "Мой вариант"
Dim FSO, s
  Set FSO = CreateObject("Scripting.FileSystemObject")
  Set f = FSO.GetFile("C:\dat.txt")
  s = f.Name & " занимает " & f.Size & " байт"
Print #3, s
  Print #3, " Начало работы    " & Time
  Set f = Nothing
  Set FSO = Nothing
Open "C:\dat.txt" For Input As 1
Open "C:\test1.txt" For Output As 2
Print #2,
Close #2
Open "C:\test1.txt" For Append As 2
Do While Not EOF(1)
Input #1, a, b, c, d, e, f, g, h
Print #2, a
i = i + 1
DoEvents
Loop
Close #2
Close #1
  Print #3, " обработано строк    " & i
  Set FSO = CreateObject("Scripting.FileSystemObject")
  Set f = FSO.GetFile("C:\test1.txt")
  s = f.Name & " занимает " & f.Size & " байт"
  Print #3, s
  Print #3, " Конец  работы    " & Time
   Set f = Nothing
  Set FSO = Nothing
    Close #3
Комманда4_Click
End Sub

Private Sub Комманда4_Click()
   Dim FSO As New FileSystemObject
   Dim f1 As Object, f2 As Object, f3 As Object
   Dim st As String, i, j As Long, k As Long, m() As String
        k = 0
    Set f1 = FSO.OpenTextFile("c:\dat.txt", ForReading)
        Set f2 = FSO.CreateTextFile("c:\test2.txt", True)
Open "C:\LOG.txt" For Append As 3
  Print #3,
   Print #3, "ФЗО"
Print #3, "начало " & Time
i = Time
        While f1.AtEndOfLine = False
            DoEvents
            If k = 9999 Then
            k = k
            End If
            st = f1.ReadLine
            k = k + 1
            m = Split(Trim(st), " ")
            f2.WriteLine (m(0))
        Wend
            Set f1 = Nothing
    Set f2 = Nothing
         Set FSO = CreateObject("Scripting.FileSystemObject")
  Set f = FSO.GetFile("C:\test2.txt")
  s = f.Name & " занимает " & f.Size & " байт"
       Print #3, "обработано  строк   " & k
          Print #3, s
                    i = Time
                  Print #3, "конец  " & Time
            Print #3,
           Close #3
    Set FSO = Nothing
    Set f3 = Nothing
End Sub

Этот пример обработал файл 1ГБ за 481С. Файл правильный. Я его несколько упростил, но смысл не поменялся.

Код: Выделить всё
Private Sub Prime6()
   Dim FSO As New FileSystemObject
   Dim f1 As Object, f2 As Object
   Dim st As String, j As Long, m() As String
    Set f1 = FSO.OpenTextFile(LogDir, ForReading)
    Set f2 = FSO.CreateTextFile("test2.txt", True)
        While f1.AtEndOfLine = False
            DoEvents
            st = f1.ReadLine
            m = Split(Trim(st), " ")
            f2.WriteLine (m(0))
        Wend
    Set f1 = Nothing
    Set f2 = Nothing
    Set FSO = Nothing

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Dimon111 » 17.12.2009 (Чт) 11:31

alex77755 писал(а):На одном из сайтов упоминается:
50 миллионов строк это да - много.
Замедление на Line Input достаточно серьезное.
Тут возникает вопрос о плате за скорость.
Скажу по-другому: ограничивать ли способы решения средствами VB, или есть готовность ради скорости употребить любые средства?

Спрашиваю потому, что есть набор функций с префиксом mmio: mmioOpen, mmioRead, mmioClose (там их больше - я только часть привел). Скорость - быстрее не бывает. Но требуется самому управлять буферизацией, дальнейшей разбивкой на строки и пр. Особо ничего сложного, но все же...

Может в эту сторону порыть - mmio?

Я про эти технологии ничего не знаю. Где можно почитать про это?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Andrey Fedorov » 17.12.2009 (Чт) 13:56

Я вот думаю - ленивый человек просто воспользовался бы мастером импорта Access-a.

Вообще нифига кода не надо...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Денис » 17.12.2009 (Чт) 14:30

Andrey Fedorov писал(а):Я вот думаю - ленивый человек просто воспользовался бы мастером импорта Access-a.

Вообще нифига кода не надо...


Где ж ты раньше был!?
Как говорится, умная мысля´ приходит опосля´.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Andrey Fedorov » 17.12.2009 (Чт) 16:41

И еще напомню один способ работы с текстовыми файлами.

Только чуть усложню для наглядности - допустим нам надо взять 4-ре первых колонки из log-файла автора топика и вывести их в другой файл с разделителем-табуляцией и запятой в качестве десятичного разделителя.

Вот код делающий это:

Код: Выделить всё
Option Explicit

Public Sub Main()
    Const sPathIn As String = "D:\Temp\T\"
    Const sPathOut As String = "D:\Temp\T\"
    Const sFileIn As String = "File.txt"
    Const sFileOut As String = "NewFile.txt"

    Dim cn As New ADODB.Connection, r As New ADODB.Recordset, _
        s As String, ss As String, sSchemaIni As String, i As Integer

    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & sPathIn & ";" & _
          "Extended Properties=Text"

    ' Удалим выходной файл
    s = sPathOut & sFileOut
    If FileExists(s) Then Kill s
   
    ' Создадим schema.ini
    sSchemaIni = sPathOut & "schema.ini"
    If FileExists(sSchemaIni) Then Kill sSchemaIni
    ss = "[File.txt]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=FixedLength" & vbCrLf _
        & "DecimalSymbol=." & vbCrLf _
        & "Col1=F1 Long Width 10" & vbCrLf _
        & "Col2=F2 Long Width 11" & vbCrLf _
        & "Col3=F3 Long Width 11" & vbCrLf _
        & "Col4=F4 Float Width 8" & vbCrLf _
        & vbCrLf _
        & "[NewFile.txt]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=TabDelimited" & vbCrLf _
        & "DecimalSymbol=," & vbCrLf _
        & "NumberDigits=3" & vbCrLf _
        & "Col1=F1 Long" & vbCrLf _
        & "Col2=F2 Long" & vbCrLf _
        & "Col3=F3 Long" & vbCrLf _
        & "Col4=F4 Float" & vbCrLf _

    SaveFile sSchemaIni, ss
   
    Dim t As Single
    t = Timer
   
    ' Импортируем данные
    On Error GoTo Err_
    r.Open "SELECT * INTO [" & sFileOut _
                    & "] IN '" & sPathOut & "' [Text;] " _
            & "FROM [" & sFileIn _
            & "]", cn, _
                    adOpenStatic, adLockReadOnly, adCmdText
                   
    Debug.Print "Time: " & Format$(Timer - t, "#,##0.00")
                   
    If FileExists(sSchemaIni) Then Kill sSchemaIni
    Exit Sub

Err_:
    With cn.Errors(0)
        If .NativeError = -329323426 And .Number = -2147467259 Then Resume Next
    End With
    MsgBox Err.Description, vbCritical
End Sub

Private Function FileExists(sFile As String) As Boolean
    On Error Resume Next
    FileExists = ((GetAttr(sFile) And vbDirectory) = 0)
    If Err.Number Then Err.Clear
End Function

Private Sub SaveFile(sFile As String, sText As String)
    Dim iHFile As Integer
   
    iHFile = FreeFile
    Open sFile For Binary As #iHFile
    Put iHFile, , sText
    Close #iHFile
End Sub


У меня выполняется за 190 секунд для файла 1,2Gb...

P.S
Естественно ничего не мешает писать сразу в базу, к примеру...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение alex77755 » 18.12.2009 (Пт) 0:37

А на результаты смотрел?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Andrey Fedorov » 18.12.2009 (Пт) 8:46

alex77755 писал(а):А на результаты смотрел?


Вообще-то результаты соответствуют заданию

Код: Выделить всё
1894   8   0   -26,316
-1394   42   0   26,315
-2833   108   0   26,315
-1567   149   0   -26,316
1393   24   0   26,315
2568   -369   0   -26,316
-275   -900   -1   -26,316
-2650   -1153   -3   26,315
-549   -745   -5   26,315
2421   206   -8   26,315


Выведены именно числа через vbTav - это если смущает отсутствие плюсиков... Нет проблем вывести и строки - надо просто указать нужный тип поля...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение alex77755 » 18.12.2009 (Пт) 9:41

Отправил 2 сообщения, но что -то не дошли.
Я не разобрался с текстом кода. Где искать результаты? По строке
Код: Выделить всё
Const sFileOut As String = "NewFile.txt"

у меня
"+1894 +8 +0 -26.316 999999.00 2531.484 0.0000947"
"-1394 +42 +0 26.315 999999.00 2531.484 0.0001893 0.000"
"-2833 +108 +0 26.315 999999.00 2531.484 0.0002839 0.000"
"-1567 +149 +0 -26.316 999999.00 2531.484 0.0003783 0.000"
"+1393 +24 -0 26.315 999999.00 2531.484 0.0004726 0.000"
"+2568 -369 -0 -26.316 999999.00 2531.484 0.0005669 0.000"
"-275 -900 -1 -26.316 999999.00 2531.484 0.0006610 0.000"
"-2650 -1153 -3 26.315 999999.00 2531.484 0.0007551 0.000"
"-549 -745 -5 26.315 999999.00 2531.484 0.0008491 0.000"
"+2421 +206 -8 26.315 999999.00 2531.484 0.0009429 0.000"

Я не разобрался где указывается номера и количество импортируемых столбцов?

А по времени для одного и того же файла мой вариант немного быстрей.
Мой вариант
dat.txt занимает 5 175 590 310 байт
Начало работы 0:15:49
обработано строк 67650000
test1.txt занимает 420 762 707 байт
Конец работы 0:25:45

вариант с ADO
dat.txt занимает 5 175 590 310 байт
Начало работы 0:30:37
обработано строк
ACC.txt занимает 4 110 481 946 байт
Конец работы 0:42:48

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Andrey Fedorov » 18.12.2009 (Пт) 10:07

alex77755 писал(а):Отправил 2 сообщения, но что -то не дошли.
Я не разобрался с текстом кода. Где искать результаты? По строке
Код: Выделить всё
Const sFileOut As String = "NewFile.txt"


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

alex77755 писал(а):у меня


Оригинальный файл File.txt (не теряем начальные пробелы!):

Код: Выделить всё
     +1894         +8         +0 -26.316 999999.00 2531.484 0.0000947 0.000
     -1394        +42         +0 26.315 999999.00 2531.484 0.0001893 0.000
     -2833       +108         +0 26.315 999999.00 2531.484 0.0002839 0.000
     -1567       +149         +0 -26.316 999999.00 2531.484 0.0003783 0.000


Файл результата NewFile.txt:

Изображение

alex77755 писал(а):Я не разобрался где указывается номера и количество импортируемых столбцов?


Ну это вообще просто, если внимательно на код посмотреть...

alex77755 писал(а):А по времени для одного и того же файла мой вариант немного быстрей.


По времени не сравнивал, но более универсальный вариант всегда будет потише чем оптимизированный под конкретную задачу.
Я, кстати, могу легко поменять порядок столбцов или сделать группировку по одному из них. Ну и прочее...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение alex77755 » 18.12.2009 (Пт) 11:08

Вот это мне понятно:
Код: Выделить всё
Input #1, a, B, c, d, e, f, g, h
  Print #2, Trim(a)

прочитали 8 переменных из файла1. Первую взяли в файл2. Надо другую или несколько - нет проблем

Ну это вообще просто, если внимательно на код посмотреть...


Код: Выделить всё
        & "Col1=F1 Long Width 10" & vbCrLf _
        & "Col2=F2 Long Width 11" & vbCrLf _
        & "Col3=F3 Long Width 11" & vbCrLf _
        & "Col4=F4 Float Width 8" & vbCrLf _

Я думал здесь, но оставляя только
Код: Выделить всё

----------------------------------------
& "Col1=F1 Long Width 10" & vbCrLf _
-------------------------
      & "Col1=F1 Long" & vbCrLf _

я всё раво получал точно такой же файл:(Не знаю как здесь вставить картинку)
исходный фаил взят с этой страницы
переменные описаны так:
Код: Выделить всё
    Const sPathIn As String = "C:\"
    Const sPathOut As String = "C:\"
    Const sFileIn As String = "dat.txt"
    Const sFileOut As String = "ACC.txt"
Последний раз редактировалось alex77755 18.12.2009 (Пт) 11:21, всего редактировалось 1 раз.

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение alex77755 » 18.12.2009 (Пт) 12:02

Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Andrey Fedorov » 18.12.2009 (Пт) 21:51

alex77755 писал(а):я всё раво получал точно такой же файл:(Не знаю как здесь вставить картинку)
исходный фаил взят с этой страницы
переменные описаны так:
...


Нескромный вопрос - а в формируемом system.ini ты имена файлов поправил?

А вообще сделай там лучше так:

Код: Выделить всё
    ss = "[" & sFileIn & "]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=FixedLength" & vbCrLf _
        & "DecimalSymbol=." & vbCrLf _
        & "Col1=F1 Long Width 10" & vbCrLf _
        & "Col2=F2 Long Width 11" & vbCrLf _
        & "Col3=F3 Long Width 11" & vbCrLf _
        & "Col4=F4 Float Width 8" & vbCrLf _
        & vbCrLf _
        & "[" & sFileOut & "]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=TabDelimited" & vbCrLf _
        & "DecimalSymbol=," & vbCrLf _
        & "NumberDigits=3" & vbCrLf _
        & "Col1=F1 Long" & vbCrLf _
        & "Col2=F2 Long" & vbCrLf _
        & "Col3=F3 Long" & vbCrLf _
        & "Col4=F4 Float" & vbCrLf
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение alex77755 » 18.12.2009 (Пт) 23:56

Код: Выделить всё
Нескромный вопрос - а в формируемом system.ini ты имена файлов поправил?

Имелся в виду "schema.ini"?.
Я с таким вариантом доступа ещё не работал и думал, что программа написана таким образом, что достаточно поменять здесь.
Код: Выделить всё
  Const sFileIn As String = "File.txt"
Const sFileOut As String = "NewFile.txt"

А остальное сделается программно. А что нет? щас буду проверять.

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение alex77755 » 19.12.2009 (Сб) 0:44

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

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Andrey Fedorov » 19.12.2009 (Сб) 1:21

alex77755 писал(а):Ну вот так более-менее понятно. Правда не совсем. Зачем простое задание так усложнять.
Просто принять к сведению, что такой имееся такой вариант работы с текстовыми файлами.


Что-же тут сложного-то? Стандартная работа с текстовыми файлами от Microsoft. Можно и запросы по нескольким файлам писать...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение alex77755 » 19.12.2009 (Сб) 10:07

Стандартная работа с текстовыми файлами от Microsoft. Можно и запросы по нескольким файлам писать

Этот мелкософт всегда всё усложняет. По мне так проще просто открыть фаил(или несколько), считать переменные и выбрать нужные.
А по технологии мелкософта нужно ещё создать .ini файл, в котором указать ещё и дополнительные данные: и ширину столбцов и тип данных(если я правильно понял) и тип разделителя.Использовать дополнительную библиотеку. И при этом сохранить правильную структуру ini файла.
Не забыть удалить дополнительный файл. И при всём при этом код будет работать медленнее...
Куда проще без всяких лишних извращений считать напрямую из файла(или из нескольких): Input #1, a, B, c, d, e, f, g, h

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Twister » 19.12.2009 (Сб) 10:19

Почему-то ни кто в ходе обсуждения не подумал использовать FileMapping. Теоритически, скорость должна повыситься. Оперативки, правда, будет не мало израсходовано...
А я все практикую лечение травами...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Хакер » 19.12.2009 (Сб) 10:34

Не должна.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Mikle » 19.12.2009 (Сб) 11:29

Не пойму, о чём речь вообще. Я уже выдал рабочий вариант (до 2 Гб, что и требовалось), который в разы быстрее.

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение alex77755 » 19.12.2009 (Сб) 11:42

FileMapping
Это кто? Пачему не знаю?
Есть, что поискать

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение alex77755 » 19.12.2009 (Сб) 12:14

Mikle писал(а):Не пойму, о чём речь вообще. Я уже выдал рабочий вариант (до 2 Гб, что и требовалось), который в разы быстрее.

А разве кто-то сказал хоть раз, что код рабочий, кроме того, что быстрый? Он быстро печатает кашу. При тестировании из 300 метрового файла источника он создал файл 2048 М и вылетел с ошибкой переполнения.
Put #nf2, , d2() вот тут он и впечатывает в файл сразу 4095 строки из четырёх цифр( 1894, 1394, 2833, 1567 в цикле)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Viper » 19.12.2009 (Сб) 13:34

alex77755 писал(а):
FileMapping
Это кто? Пачему не знаю?
Есть, что поискать
В Кирпичах поищи.
Весь мир матрица, а мы в нем потоки байтов!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Mikle » 19.12.2009 (Сб) 15:38

alex77755 писал(а):А разве кто-то сказал хоть раз, что код рабочий, кроме того, что быстрый? Он быстро печатает кашу.

Dimon111 писал(а):Файл 1ГБ обработал за 24с. Сформировал правильный файл.
Самый быстрый вариант. Жаль неправильно обрабатывет файл 4,31ГБ. В дальнейшем попробую разобратся.

Хакер писал(а):Ты гарантируешь, что объём не выйдет за границы положительных значений Long-а? Точно гарантируешь? А то с критериями границ столбца ты уже прогарантировался.

Dimon111 писал(а):Гарантирую.

Так что, alex77755, поищи, где ты неправильно скопипастил образец исходного файла.

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение alex77755 » 19.12.2009 (Сб) 20:32

Исходный файл "C:\1.txt":(данные первого столбца заканчиваются десятым символом)
+5395 -2159 +349 -0.169 999999.00 2462.244 -0.1395413 0.000
+1738 +3664 +338 -0.066 999999.00 2462.244 -0.1395383 0.000
-3597 +5112 +329 0.027 999999.00 2462.244 -0.1395353 0.000
-3670 +292 +323 -0.047 999999.00 2462.244 -0.1395324 0.000
+1534 -4248 +320 -0.121 999999.00 2462.244 -0.1395294 0.000
+4928 -2387 +322 -0.183 999999.00 2462.244 -0.1395264 0.000
+1849 +3283 +327 -0.080 999999.00 2462.244 -0.1395234 0.000
-3623 +4979 +335 0.002 999999.00 2462.244 -0.1395205 0.000
-4201 +279 +346 -0.059 999999.00 2462.244 -0.1395175 0.000
+980 -4575 +359 -0.116 999999.00 2462.244 -0.1395146 0.000
+5395 -2159 +349 -0.169 999999.00 2462.244 -0.1395413 0.000
+1738 +3664 +338 -0.066 999999.00 2462.244 -0.1395383 0.000
-3597 +5112 +329 0.027 999999.00 2462.244 -0.1395353 0.000
-3670 +292 +323 -0.047 999999.00 2462.244 -0.1395324 0.000
+1534 -4248 +320 -0.121 999999.00 2462.244 -0.1395294 0.000
+4928 -2387 +322 -0.183 999999.00 2462.244 -0.1395264 0.000
+1849 +3283 +327 -0.080 999999.00 2462.244 -0.1395234 0.000
-3623 +4979 +335 0.002 999999.00 2462.244 -0.1395205 0.000
-4201 +279 +346 -0.059 999999.00 2462.244 -0.1395175 0.000
+980 -4575 +359 -0.116 999999.00 2462.244 -0.1395146 0.000
+5395 -2159 +349 -0.169 999999.00 2462.244 -0.1395413 0.000
+1738 +3664 +338 -0.066 999999.00 2462.244 -0.1395383 0.000
-3597 +5112 +329 0.027 999999.00 2462.244 -0.1395353 0.000
-3670 +292 +323 -0.047 999999.00 2462.244 -0.1395324 0.000
+1534 -4248 +320 -0.121 999999.00 2462.244 -0.1395294 0.000
+4928 -2387 +322 -0.183 999999.00 2462.244 -0.1395264 0.000
+1849 +3283 +327 -0.080 999999.00 2462.244 -0.1395234 0.000
-3623 +4979 +335 0.002 999999.00 2462.244 -0.1395205 0.000

код скопипасченный и адаптированный:
Код: Выделить всё
Private Sub Form_Load()
  Dim nf1 As Integer, d1(16385) As Byte, a1 As Long, p1 As Long
  Dim nf2 As Integer, d2(4095) As mType, a2 As Long
  Dim i As Long
  Show
  Caption = "Wait..."
  For a2 = 0 To 4095
    d2(a2).b(6) = 13
    d2(a2).b(7) = 10
  Next a2
  nf1 = FreeFile
  Open "C:\1.txt" For Binary As #nf1
  nf2 = FreeFile
  Open "C:\2.txt" For Binary As #nf2
  Close #nf2
  Kill "C:\2.txt"
  Open "C:\2.txt" For Binary As #nf2
  p1 = 1
  a2 = 0
  Do
    a1 = 0
    Get #nf1, p1, d1()
    Do
      For i = 0 To 5
        d2(a2).b(i) = d1(a1 + i + 5)
      Next i
      a2 = a2 + 1
      If a2 = 4096 Then
        a2 = 0
        Put #nf2, , d2()
      End If
      a1 = a1 + 74
      If d1(a1) <> 10 Then
        a1 = a1 + 1
        If d1(a1) <> 10 Then
          a1 = a1 + 1
          If d1(a1) <> 10 Then Exit Do
        End If
      End If
      If a1 > 16385 - 76 Then p1 = p1 + a1: Exit Do
    Loop
  Loop Until EOF(1)
  Close #nf2
  Close #nf1
  Caption = "Ok!"
End Sub

Результат: Вылет с ошибкой переполнения: на строке Put #nf2, , d2() (и об этом уже пмсали)
результат: "C:\2.txt"
+5395
+1738
+5395
+1738
+5395
+1738
+5395
+1738
+5395
+1738
+5395
+1738
+5395
+1738
+5395
+1738
+5395
+1738
+5395
+1738
+5395
+1738
+5395
+1738
+5395
+1738
+5395
+1738
+5395
+1738

Где что не так?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Хакер » 19.12.2009 (Сб) 20:34

Кто не будет пользоваться спецтегами для оформления моноширинных таблиц, тот будет наказан.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Mikle » 19.12.2009 (Сб) 21:37

alex77755
Прочти ещё раз:
viewtopic.php?f=1&t=41178&st=0&sk=t&sd=a&start=60#p6734306
посмотри файл по ссылке, сравни со своим.
Там каждая строка начинается с пробелов!

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение alex77755 » 19.12.2009 (Сб) 22:39

Кто не будет пользоваться спецтегами для оформления моноширинных таблиц, тот будет наказан.

Я понял, что это относится ко мне. Вот только не знаю какими тегами их оформлять. Элемент списка? " [*] " Исправлюсь.
Там каждая строка начинается с пробелов!

я же написал:
Исходный файл "C:\1.txt":(данные первого столбца заканчиваются десятым символом)

по тому, что при вставке пробелы перед символами удаляются. Немного выше есть скрин C:\dat.txt. Там видно, что строка начанается с 5, 6 иногда даже с 7 пробелов, но всегда первая цифра заканчивается на 10 символе. Поэтому и предлагалоси считывать по 11 символов, а остальное игнорировать.
Пробовал на файлах разного размера(от 30Mбт до 1Гбт) . Результат один: Создаётся файл размером 2048 Мбт и дальше ошибка
В файле - цикл
Если не забанят - вот ссылка на файл. Не могу понять что не так. Самому хочется понять и разобраться.
http://webfile.ru/4175127

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Хакер » 19.12.2009 (Сб) 22:43

Я понял, что это относится ко мне. Вот только не знаю какими тегами их оформлять. Элемент списка? " [*] " Исправлюсь.

Я тебе давал ссылку на FAQ. Какого черта ты приплетаешь сюда списки?
Код: Выделить всё
                                                   пробелы не удаляются
                                                   пробелы не удаляются

Сложно, да?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение Andrey Fedorov » 20.12.2009 (Вс) 0:59

alex77755 писал(а):
Стандартная работа с текстовыми файлами от Microsoft. Можно и запросы по нескольким файлам писать

Этот мелкософт всегда всё усложняет. По мне так проще просто открыть фаил(или несколько), считать переменные и выбрать нужные.
А по технологии мелкософта нужно ещё создать .ini файл, в котором указать ещё и дополнительные данные: и ширину столбцов и тип данных(если я правильно понял) и тип разделителя.Использовать дополнительную библиотеку. И при этом сохранить правильную структуру ini файла.
Не забыть удалить дополнительный файл. И при всём при этом код будет работать медленнее...
Куда проще без всяких лишних извращений считать напрямую из файла(или из нескольких): Input #1, a, B, c, d, e, f, g, h


У вас лишь частный случай.

А, system.ini может быть создан один раз для всех файлов лежащих в папке, причем не из программы а просто ручками. Удалять его совершенно не обязательно - где написано что его надо обязательно создавать именно в коде и потом обязательно удалять? Итого в коде и останется лишь один запрос...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как обработать большой текстовый файл - 1Гб?

Сообщение iGrok » 20.12.2009 (Вс) 2:38

Andrey Fedorov писал(а):У вас лишь частный случай.

А, system.ini может быть создан один раз для всех файлов лежащих в папке, причем не из программы а просто ручками. Удалять его совершенно не обязательно - где написано что его надо обязательно создавать именно в коде и потом обязательно удалять? Итого в коде и останется лишь один запрос...

И таки schema.ini, а не system.ini. Разные вещи, однако.

Если это какие-то постоянные регулярные неизменные действия - то да. Можно один раз создать, и не париться.

В противном случае есть минусы:
1) Нехорошо сорить файлами, если это разовый иморт/экспорт. Я, к примеру, за thums.db-то убить готов, а за такие вещи так и вообще.
2) В личной практике, при помощи SELECT INTO [TEXT] в текстовых файлах создавались отчёты. Эти отчёты были свободно редактируемыми.
После каждой правки набора полей или порядка их следования приходилось прибивать файлик, или хотя бы соответствующую секцию в файлике.
Учитывая, что файлик создавался не на сервере, а на локальном диске машинок, а машинок в сети было около 500, это было весьма некстати.
В итоге, поступили просто. Перед созданием отчёта стали автоматом прибивать соответствующую секцию в файле.

Когда перешли на Висту стало ещё хуже. По неведомой причине, ado не могло создать этот файлик на "c:\" (с правами всё в порядке, uac отключено), и приходилось создавать его самому программно перед выполнением запроса.. В общем, тот ещё геморрой..
label:
cli
jmp label

Пред.След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 53

    TopList