powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6 - работа с текстовыми файлами
25 сообщений из 31, страница 1 из 2
VB6 - работа с текстовыми файлами
    #32465112
DionX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть такова:
есть текстовый файл с множеством строк одинаковой структуры. Нужно удолить стоки по некоторому признаку. Например, начинающихся с 'бла-бла-бла'. Вся загвозка в том, что файл очь балшой (десятки тысяч строк), а такую обработку приходица делать давольно регулярно. Поэтому простой перебор всех строк не очь удачное решение: долго. Хотелось бы поступить так же как с записями в таблице БД: DELETE FOR Table WHERE Field='бла-бла-бла'... так намного дешевле... Есть варианты? Буду очь благодарен.
З.Ы. Преобразование txt-->>БД-->>txt нежедательно...
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #32465254
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> простой перебор всех строк не очь удачное решение: долго.
> Хотелось бы поступить так же как с записями в таблице БД
Количество байт данных во втором случае больше, чем в первом,
а скорость - выше. Следовательно, в 1-м случае надо использовать другой алгоритм.
> файл очь балшой (десятки тысяч строк)
Он всё равно весь поместится в памяти (возм., виртуальной).
Загони файл в массив строк и используй функции работы со строками.
Если и это "дорого", используй утилиты типа GREP - вызывай её из кода
и получай результат в виде (промежуточного) текстового файла.
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #32465324
DionX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попобую... о результатах сообщу :)
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #32465650
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DionX З.Ы. Преобразование txt-->>БД-->>txt нежедательно...
А и не надо преобразовывать - есть ODBC Microsoft Text Driver (*.txt; *.csv)
Может его и пользовать?
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #32466063
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Marvan:
ODBC Microsoft Text Driver не выбирает записи, он конвертирует один формат в другой.
GREP работает быстрее драйвера: за 30 лет его код вылизан до совершенства.
Обработка не требует SQL-запроса к SQL-серверу.
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #32466182
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Processor
Использовать в своей программе Шароварную утилиту от стороннего разработчика - хоть и продуктивно, но некрасиво.
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #32467340
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Marvan:
В топике не было речи о FreeWare (если не считать'бла-бла-бла'... так намного дешевле)
Речь идёт о методах решения задачи.
Если надо определиться, действительно ли GREP делает то, что нужно , можно воспользоваться и (a la) FreeWare.
Если программер считает, что в данном случае "красивше" самостоятельно запрограммировать то, что делает GREP,
то он использует объект RegExp (GREP=Global Regular Expression Print==>RegExp)
и ручками пропишет и верифицирует код (на ограниченном наборе данных).
Если ему необходимо сделать работу продукта надёжной, полный смысл использовать проприетарный GREP
("от Microsoft" он называется Qgrep, от JGSoft - PowerGREP).
А о том, что GREP решает такие задачи, говорит почти 40-летний возраст этой утилиты.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
VB6 - работа с текстовыми файлами
    #34668604
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжу тему, если позволите.

Есть текстовый файл размером ~300Мб - около 4млн строк
строки представляют собой несколько наборов символов, разделенных vbTab- назовем их "колонки"
Задача:
распарсить файл, а именно выделить одну из "колонок", удалить дубли и записать в файл.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
    Dim tab1 As Integer 'позиция первого таба
    Dim tab2 As Integer 'позиция второго таба

        
    Dim fo As Integer 'свободный номер для открываемого исходного файла
    Dim fs As Integer 'свободный номер для записываемого файла
    Dim quer As String 'строка , выделенная из распарсенной строки
    Dim fname As String 'имя файла вывода

        'открываем файл для чтения
        fo = FreeFile()
        Open "input.txt" For Input As #fo
        
        'открываем- создаем  результирующий файл для записи
        fs = FreeFile()
        Open "output.txt" For Output As #fs
        
        'распарсиваем файл - берем только нужное
        While Not EOF(fo)
            Line Input #fo, textline 'считали строку -ВОТ ЗДЕСЬ ВИСНЕТ
            'нашли первый символ таб-запомнили координату tab1
            'нашли второй символ таб-запомнили координату tab2
            'взяли только то, что между tab1 и tab2
            j = 1 'ищем с первого символа

            tab1 = InStr( 1 , textline, vbTab)
            If tab1 >  0  Then
                j = tab1 +  1  'переместили курсор вправо
                'ищем следующий разделитель
                tab2 = InStr(j, textline, vbTab)
                quer = Mid$(textline, j, tab2 - j)
            Else
                GoTo nextline
            End If
            'запишем quer в файл output.txt
            Print #fs, quer
         
nextline:
        Wend
        Close #fo 'закрыли исходный файл
        Close #fs 'закрыли результ. файл

Не подскажете, как оптимизировать код?
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34669001
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sv375Не подскажете, как оптимизировать код?
Эта задача элеметарно решается с помощью DTS. Если у вас, конечно, есть SQL Server.
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34669020
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql сервера нет.
Хотелось бы обойтись без серверов.
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34669057
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот другой код, считываю файл не построчно, а целиком в строку.
Получаю другую ошибку "Не хватает места в строке"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
            Dim textline As String
            Dim inputarr() As String, k As Integer

            fo = FreeFile()
            Open "input.txt" For Input As #fo
            fs = FreeFile()
            Open "output.txt" For Output As #fs
            textline = Input(LOF(fo), #fo)   '         ВОТ ЗДЕСЬ ОШИБКА
            inputarr = Split(textline, vbCrLf)
            j =  1  
            n =  0  
            For k = LBound(inputarr) To UBound(inputarr)
                tab1 = InStr( 1 , inputarr(k), vbTab)
                If tab1 >  0  Then
                    j = tab1 +  1  
                    tab2 = InStr(j, inputarr(k), vbTab)
                    quer = Mid$(inputarr(k), j, tab2 - j)
                Else
                GoTo nextline
                End If
                
                Print #fs, quer
               
            

nextline:
            Next
        Close #fo 
        Close #fs 
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34669230
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что то я не помню чтобы для чтения файлов определял номер как fo = FreeFile()
Делал просто fo = FreeFile

вот кусочек кода для чтения файла и запихивания его в dbf табличку
глянь, может поможет

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Dim strTmpCombo As String
Dim Fn As Long
Fn = FreeFile
Open CD1.FileName For Input As Fn
Do While Not EOF(Fn)
Line Input #Fn, strTmpCombo
strFullString = Split(strTmpCombo, "|", - 1 , vbTextCompare)
With rsProverka
.AddNew
.Fields("FIRST_NAME") = strFullString( 2 )
.Update
End With
Loop
Close #Fn

С уважением, Николай.
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34669272
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
marvan DionX З.Ы. Преобразование txt-->>БД-->>txt нежедательно...
А и не надо преобразовывать - есть ODBC Microsoft Text Driver (*.txt; *.csv)
Может его и пользовать?

Можно использовать OLEDB. Строка подключения навроде:

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

При этом может оказаться полезно почитать про файлик schema.ini.
Далее - все примитивно.
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34669511
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понял, приведенный код считывает файл построчно, преобразует строку в массив и добавляет один из элементов в таблицу.

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

Непонятно почему в string не лезет 300Мб.
тип string вроде должен вмещать до 2млрд.символов
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34669847
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой код тоже виснет???
Попробуй поискать по FSO...
А может все таки прога не виснет, а пытается открыть файл размером в 300 метров, и у тебя просто не хватает терпения???
Просто у меня была похожая задача, там текстовый файл был примерно 100 метров и таким вот способом открытия он на очень продолжительное время подвешивал машину.

И сразу вопрос старым и мудрым....
Заметил такую странность если открывать такие вот огромные файлы при помощи блокнота то он тупо сдыхает, однако внутренний просмотрщик встроенный в тотал командер открывает (в режиме read only) файлы моментом и поиск строки тоже осуществляется очень быстро. С чем это может быть связано?

С уважением, Николай.
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34669991
sv375
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gjghjc
А может все таки прога не виснет, а пытается открыть файл размером в 300 метров, и у тебя просто не хватает терпения???
Просто у меня была похожая задача, там текстовый файл был примерно 100 метров и таким вот способом открытия он на очень продолжительное время подвешивал машину.


Сразу при запуске переходит в "не отвечает".
Ждал минут 10-так и не проснулась.

Меж тем Akelpad открывает его по F4 секунд за 40.
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34670200
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sv375Непонятно почему в string не лезет 300Мб.

Исчерпывается свободная память.
Или, думаешь, что переменная обязана свопиться на диск?
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34670226
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gjghjcИ сразу вопрос старым и мудрым....
Заметил такую странность если открывать такие вот огромные файлы при помощи блокнота то он тупо сдыхает, однако внутренний просмотрщик встроенный в тотал командер открывает (в режиме read only) файлы моментом и поиск строки тоже осуществляется очень быстро. С чем это может быть связано?

Разный подход - в одном случае примитивный, когда все грузится в память (ту же переменную), а в другом все читается посегментно, что чуть посложней но позволяет работать с любым размером файла.
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34670340
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFРазный подход - в одном случае примитивный, когда все грузится в память (ту же переменную), а в другом все читается посегментно, что чуть посложней но позволяет работать с любым размером файла.
Я так понимаю что примитивный подход это так как предложено мной и sv375 :) А вот по поводу чтения посегментно хотелось бы почитать подробней.
Если есть ссылочки буду благодарен. Потому как чует мое сердце скоро мне опять прийдется резать 100-метровые файлы :)
С уважением, Николай.
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34670421
JaneDoe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Х3..
может через msaccess ? залинковать txt как таблицу БД? а потом отсиквелить её (всмысле БД).
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34670532
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gjghjcЯ так понимаю что примитивный подход это так как предложено мной и sv375 :) А вот по поводу чтения посегментно хотелось бы почитать подробней.

А что там сложного? С диска в память читается только та часть файла что выводится в данный момент на экран (ну или несколько больше). Для редактирования/просмотра используется не TextBox, а свой редактор на основе того же PictureBox-a.

Исходников у меня сейчас нет. Но делал как-то Hex-редактор на подобном принципе...
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34670545
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaneDoeХ3..
может через msaccess ? залинковать txt как таблицу БД? а потом отсиквелить её (всмысле БД).

Вообще-то Access не волшебник - он использует стандартный провайдер OLEDB или ODBC о которых уже говорилось выше. Так что можно и без него, если умеючи...
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34670608
JaneDoe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да я не спорю... просто Аксес удобная тулза
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34670949
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaneDoeда я не спорю... просто Аксес удобная тулза

Да, для чайников он удобен...
...
Рейтинг: 0 / 0
VB6 - работа с текстовыми файлами
    #34670985
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не для полных чайников - держите пример импорта записей из одного текстового файла с экспортом в другой (я его делал по подобному вопросу в какой-то конференции):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
Public Sub Main()
    Const sPathIn As String = "C:\Temp\"
    Const sPathOut As String = "C:\Temp\"
    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"

    ' Создадим файл откуда берем данные для теста
    For i =  0  To  100 
        s = Mid$(Format$(Rnd, ".0000000"),  2 )
        ss = ss & Mid$(s,  1 ,  1 ) & "," & Mid$(s,  2 ,  1 ) & "," & Mid$(s,  3 ,  1 ) & "." & CInt(Mid$(s,  4 ,  3 )) & "," & Mid$(s,  7 ,  1 ) & vbCrLf
    Next i
    s = sPathOut & sFileIn
    If FileExists(s) Then Kill s
    SaveFile s, ss
    
    ' Удалим выходной файл
    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=Delimited(,)" & vbCrLf _
        & "DecimalSymbol=." & vbCrLf _
        & "Col1=F1 Integer" & vbCrLf _
        & "Col2=F2 Integer" & vbCrLf _
        & "Col3=F3 Float" & vbCrLf _
        & "Col4=F4 Integer" & vbCrLf _
        & vbCrLf _
        & "[NewFile.txt]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=Delimited(,)" & vbCrLf _
        & "DecimalSymbol=." & vbCrLf _
        & "NumberDigits=4" & vbCrLf _
        & "Col1=F1 Integer" & vbCrLf _
        & "Col2=F2 Integer" & vbCrLf _
        & "Col3=F3 Float" & vbCrLf _
        & "Col4=F4 Integer" & vbCrLf
        
    SaveFile sSchemaIni, ss
    
    ' Импортируем данные
    On Error GoTo Err_
    r.Open "SELECT * INTO [" & sFileOut _
                    & "] IN '" & sPathOut & "' [Text;] " _
            & "FROM [" & sFileIn _
            & "] ORDER BY 1,2,3,4", cn, _
                    adOpenStatic, adLockReadOnly, adCmdText
    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

И еще - полезная ссылочка на данную тему:

http://msdn2.microsoft.com/en-us/library/ms709353.aspx
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6 - работа с текстовыми файлами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]