Загрузка из текстового файла

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

Загрузка из текстового файла

Сообщение KPEATOP » 10.06.2013 (Пн) 10:09

Имеется текстовый файл 111.txt
Его содержимое:

Дата Время Давление Температура Удельное эл. сопротивление жидкости Давление Температура Удельное эл. сопротивление жидкости
Date Time P T E P T E
19.02.11 19:00:33 963.000 26444.000 1022.000 340.000 25287.000 1023.000
19.02.11 19:01:33 963.000 26444.000 1022.000 339.000 25288.000 1023.000
19.02.11 19:02:33 962.000 26443.000 1022.000 339.000 25288.000 1023.000
19.02.11 19:03:33 963.000 26445.000 1022.000 340.000 25288.000 1023.000
ствтрвпртвапттыатыа
19.02.11 19:04:33 963.000 26445.000 1022.000 339.000 25288.000 1023.000
19.02.11 19:05:33 962.000 26444.000 1022.000 340.000 25289.000 1023.000
19.02.11 19:06:33 962.000 26444.000 1022.000 340.000 25289.000 1023.000
19.02.11 19:07:33 962.000 26444.000 1022.000 339.000 25289.000 1023.000

Мне нужно загрузить в какой-нибудь массив данные (без текстовых строк).
Во-первых: не известно количество столбцов. Если количество столбцов известно, тогда данные можно считывать при помощи:
Input #1, A(1,1), A(1,2), A(1,3), A(1,4), A(1,5), A(1,6), A(1,7), A(1,8)
В данном случае столбцов 8, но может быть и меньше и больше.
Так вот Первый вопрос: КАК ОПРЕДЕЛИТЬ КЛИЧЕСВО СТОЛБЦОВ?

Во-вторых: в начале файла и между строк могут иногда попадаться текстовые строки.
Так вот Второй вопрос: КАК ИХ ИГНОРИРОВАТЬ ПРИ ЗАГРУЗКЕ ДАННЫХ?

В общем, мне необходимо загрузить в массив или в разные массивы (без разницы) только данные.

Заранее сенкс!
Вечность пахнет нефтью

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 10.06.2013 (Пн) 11:02

Читай строки и делай Split.

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Re: Загрузка из текстового файла

Сообщение KPEATOP » 10.06.2013 (Пн) 12:08

А как работает Split ? Может кто-нибудь кратко разъяснить? Никогда не пользовался.
Вечность пахнет нефтью

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 10.06.2013 (Пн) 12:38

KPEATOP писал(а):А как работает Split ? Может кто-нибудь кратко разъяснить? Никогда не пользовался.

http://msdn.microsoft.com/ru-ru/library/6x627e5f(v=vs.90).aspx
http://kbyte.ru/ru/Programming/Guides.aspx?id=40&mode=show

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Re: Загрузка из текстового файла

Сообщение KPEATOP » 10.06.2013 (Пн) 13:08

Понял как использовать Split, спасибо.
Теперь у меня другая проблема. Мой Visual Basic 5.0 не воспринимает Split.
Например:

Код: Выделить всё
    Dim strok As String
    Dim MyArray() As String

    Open Way1 For Input As #1
    Do While Not EOF(1)
         Line Input #1, strok
         MyArray = Split(strok)
    Loop
    Close #1


Выделяет Split и выдает ошибку:
Compile error:
Sub or Function not defined

Что это может быть?

[Хакер] :: КРЕАТОР, если ты не будешь пользоваться тегом code для оформления, ты будешь наказан.
Вечность пахнет нефтью

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 10.06.2013 (Пн) 13:53

Split случайно не в VB6 появился? По одной из ссылок так написано...

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

Re: Загрузка из текстового файла

Сообщение Хакер » 10.06.2013 (Пн) 13:53

Qwertiy писал(а):Split случайно не в VB6 появился? По одной из ссылок так написано...

Именно так.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Re: Загрузка из текстового файла

Сообщение KPEATOP » 10.06.2013 (Пн) 13:59

Жаль. А где можно качнуть VB6 ?
Вечность пахнет нефтью

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 10.06.2013 (Пн) 14:12

KPEATOP писал(а):Жаль. А где можно качнуть VB6 ?

Где найдёшь ;)

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Загрузка из текстового файла

Сообщение The trick » 10.06.2013 (Пн) 17:53

KPEATOP писал(а):Жаль. А где можно качнуть VB6 ?

В интернете можно.
UA6527P

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re: Загрузка из текстового файла

Сообщение aleksmir » 13.06.2013 (Чт) 5:18

Я тоже пользуюсь VB5, т.к. дистрибутив программы на VB5 более компактен, чем на VB6.

Вместо функции Split использую свою самописную процедуру (может вам пригодится):

Код: Выделить всё
' ПРОЦЕДУРА: делит строку на подстроки по указанному разделителю
' strText - исходная строка
' strSp - разделитель (если не задан, то делит по всем возможным разделителям)
' varMas() - массив с результатом
Public Sub SplitSeparator(strText As String, strSp As String, varMas() As String)
  ' Переменные
    Dim intLen As Integer  ' длина строки
    Dim strRez As String   ' строка результата
    Dim intPos As Integer  ' позиция разделителя
    Dim intBeg As Integer  ' позиция налача поиска
    Dim intSp As Integer   ' длина разделителя
    Dim intChr As Integer  ' счётчик символов
  ' Код
    ' инициализация массива
    ReDim varMas(0)
    ' определение длины текста
    intLen = Len(strText)
    ' выход, если длина равна нулю
    If intLen = 0 Then Exit Sub
    ' определение длины разделителя
    intSp = VBA.Len(strSp)
    ' инициализация строки результата
    strRez = ""
    ' инициализация позиции начала поиска
    intBeg = 1
    ' формирование массива
    Do While True
      ' поиск разделителя
      If intSp = 0 Then
        For intChr = 32 To 47
          intPos = VBA.InStr(intBeg, strText, VBA.Chr(intChr))
          If intPos <> 0 Then Exit For
        Next
        If intPos = 0 Then
          For intChr = 58 To 63
            intPos = VBA.InStr(intBeg, strText, VBA.Chr(intChr))
            If intPos <> 0 Then Exit For
          Next
        End If
      Else
        intPos = VBA.InStr(intBeg, strText, strSp)
      End If
      ' выход, если ничего не найдено
      If intPos = 0 Then Exit Do
      ' добавление подстроки в массив
      ReDim Preserve varMas(UBound(varMas()) + 1)
      varMas(UBound(varMas())) = Mid(strText, intBeg, intPos - intBeg)
      ' перемещение указателя начала поиска
      intBeg = intPos + VBA.IIf(intSp = 0, 1, intSp)
      ' выход, если конец строки
      If intBeg > intLen Then Exit Do
    Loop
    ' добавление последней подстроки
    If intBeg <= intLen Then
      ReDim Preserve varMas(UBound(varMas()) + 1)
      varMas(UBound(varMas())) = Right(strText, intLen - intBeg + 1)
    End If
End Sub

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.06.2013 (Чт) 6:56

aleksmir писал(а):VBA.InStr

Почему?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Загрузка из текстового файла

Сообщение alibek » 13.06.2013 (Чт) 8:21

aleksmir писал(а):ReDim Preserve varMas(UBound(varMas()) + 1)

Это ужасно.
Изменяй массив блочно If N > UBound(array) Then ReDim Preserve array(UBound(array)+50).
По окончании цикла можешь изменить размер массива на актуальный ReDim Preserve array(N).
Lasciate ogni speranza, voi ch'entrate.

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re:

Сообщение aleksmir » 13.06.2013 (Чт) 9:46

Qwertiy писал(а):
aleksmir писал(а):VBA.InStr

Почему?

Потому что был случай, когда к проекту подключил библиотеку, у которой некоторые имена совпадали с именами из библиотеки VBA. Было весело. С того момента стараюсь указывать - чьего модуля функция, процедура или метод.

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re: Загрузка из текстового файла

Сообщение aleksmir » 13.06.2013 (Чт) 9:47

alibek писал(а):
aleksmir писал(а):ReDim Preserve varMas(UBound(varMas()) + 1)

Это ужасно. Изменяй массив блочно If N > UBound(array) Then ReDim Preserve array(UBound(array)+50).
По окончании цикла можешь изменить размер массива на актуальный ReDim Preserve array(N).


Ну тоже самое) оптимизация кода - забота автора проекта. Я поделился тем, что у меня было.

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Re: Загрузка из текстового файла

Сообщение KPEATOP » 13.06.2013 (Чт) 10:04

aleksmir , я примерно такой же код с разделителями написал. У меня в текстовом файле много строк и поэтому очень долго работает (520000 строк за 52 минуты, почти час). Как думаешь, долго будет твой код работать с таким количеством строк? Может у тебя быстрее будет? Строки не длиные примерно по 50-55 символов. Если у тебя быстрее будет чем у меня , тогда можно твой код использовать. Могу дать файл с 520000 строками, чтоб ты попробовал время засечь?
Вечность пахнет нефтью

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re: Загрузка из текстового файла

Сообщение aleksmir » 13.06.2013 (Чт) 10:23

KPEATOP писал(а):aleksmir , я примерно такой же код с разделителями написал. У меня в текстовом файле много строк и поэтому очень долго работает (520000 строк за 52 минуты, почти час). Как думаешь, долго будет твой код работать с таким количеством строк? Может у тебя быстрее будет? Строки не длиные примерно по 50-55 символов. Если у тебя быстрее будет чем у меня , тогда можно твой код использовать. Могу дать файл с 520000 строками, чтоб ты попробовал время засечь?


Время ты сам засекай. Я всего лишь привел пример подпрограммы, заменяющей функцию Split.
Я бы в твоем случае сразу писал значения в таблицу базы данных (ну или хотя бы в другой текстовый файл уже с разделителями). Так было бы быстрее, за счет того, что оперативка не будет переполняться раздутым массивом.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.06.2013 (Чт) 10:37

KPEATOP писал(а):я примерно такой же код с разделителями написал

Приведённый тут код длинный и весьма маловероятно, что он быстро работает...
А штука с увеличение размера массива на 1 в таком варианте вообще будет жрать уйму времени, более того, может сказаться и на последующей работе программы, т. к. вызывает фрагментацию памяти.
Традиционное решение - с удваиваием числа элементов и начала с 8 или 16.

aleksmir писал(а):Потому что был случай, когда к проекту подключил библиотеку, у которой некоторые имена совпадали с именами из библиотеки VBA. Было весело. С того момента стараюсь указывать - чьего модуля функция, процедура или метод.

Хм.. Не знал, что эти функции относятся к библиотеке VBA...

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re:

Сообщение aleksmir » 13.06.2013 (Чт) 10:42

Qwertiy писал(а):Хм.. Не знал, что эти функции относятся к библиотеке VBA...

Да, я вспомнил. Подключил библиотеку какого-то кассового аппарата. В ней тоже есть функция Date(), которая совсем не означает текущую дату, а что-то другое. Компилятор Visual Basic создал exe-файл без проблем. Но сам по себе решил, что теперь функция Date() относится к левой библиотеки, а не к библиотеке VBA. Я ни о чем не подозревая обновил программу у заказчика... там все в панике. Программа вместо текущей даты начала выдавать странные значения. Сам долго не мог понять что случилось. Хорошо, что в Visual Basic есть пошаговая отладка строк... этим он мне и нравится.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.06.2013 (Чт) 10:52

aleksmir писал(а):Хорошо, что в Visual Basic есть пошаговая отладка строк... этим он мне и нравится.

Хм.. Что-то не представляю, а где её нет?

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re:

Сообщение aleksmir » 13.06.2013 (Чт) 10:57

Qwertiy писал(а):
aleksmir писал(а):Хорошо, что в Visual Basic есть пошаговая отладка строк... этим он мне и нравится.

Хм.. Что-то не представляю, а где её нет?

Уже конкретно не помню. Собираюсь с VB переходить на PHP, был бы рад, если бы нашёлся такой же удобный редактор как в VB5 например (пошаговое выполнение с точками остановка, отображение значений переменных и функций во всплывающих подсказках, внизу окно отладки и окно просмотра локальных переменных). Было бы нормально. Также сюда можно добавить переход к функции через Shift+F2, возврат через CTRL+SHIFT+F2, просмотр свойств, методов и событий через Object Browser (F2).

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.06.2013 (Чт) 11:14

aleksmir писал(а):Собираюсь с VB переходить на PHP

Не, php-редакторов не видел и на php никогда не писал...
Вроде там есть какие-то средства отладки, точно не знаю.

aleksmir писал(а):такой же удобный редактор как в VB5 например (пошаговое выполнение с точками остановка, отображение значений переменных и функций во всплывающих подсказках, внизу окно отладки и окно просмотра локальных переменных).

После того, что в VS2010, редактор VB6 и VBA кажется жутко неудобным...
А вот когда начинал писать на VB6, то по сравнениию BC3, казалось что там очень хорошо :)

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re:

Сообщение aleksmir » 13.06.2013 (Чт) 12:03

Qwertiy писал(а):После того, что в VS2010, редактор VB6 и VBA кажется жутко неудобным...
А вот когда начинал писать на VB6, то по сравнениию BC3, казалось что там очень хорошо :)

Понятно :)

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Re:

Сообщение KPEATOP » 13.06.2013 (Чт) 12:20

Qwertiy писал(а):Традиционное решение - с удваиваием числа элементов и начала с 8 или 16.


Не совсем понял как это???
Вечность пахнет нефтью

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.06.2013 (Чт) 12:25

KPEATOP писал(а):Не совсем понял как это???

Заводим массив из 8 элементов и переменную N=0. Когда надо добавить элемент, помещаем его в N'ю позицию и увеличиваем N. Если вдруг размер массива оказался недостаточным, удваиваем размер массива перед добавлением элемента. Когда сделали всё что надо, обрезаем массив по числу содержащихся в нём элементов.

KPEATOP писал(а):я примерно такой же код с разделителями написал

А тебе зачем такой же, можно же сразу вырезать строку, конвертить в число и записывать в результат, без промежуточного строкового массива.

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Re: Загрузка из текстового файла

Сообщение KPEATOP » 13.06.2013 (Чт) 12:51

С этим я вроде разобрался, теперь у меня другая проблема. Данные из 500 000 строк с тремя столбцами в MSFlexGrid не пихаются. VB жалуется на память. Наверно у MSFlexGrid ограничена память. Как то надо эту проблемку решить, чтоб мне мне все данные просмотреть можно было. Про это я вообще то в другой теме вопрос поднимал.
Вечность пахнет нефтью

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Загрузка из текстового файла

Сообщение alibek » 13.06.2013 (Чт) 13:29

Ты правда думаешь, что кому-то нужно видеть полмиллиона строк на экране для редактирования?
Lasciate ogni speranza, voi ch'entrate.

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Re: Загрузка из текстового файла

Сообщение KPEATOP » 13.06.2013 (Чт) 13:58

alibek писал(а):Ты правда думаешь, что кому-то нужно видеть полмиллиона строк на экране для редактирования?


Если понадобятся какие нибудь строки, как их увидеть. Например загрузил я в MSFlexGrid 80 000 строк (больше у MSFlexGrid памяти не хватает). Полоса прокрутки у MSFlexGrid прокрутит только до 80 000 - ой строки. А как мне другие строки посмотреть, если понадобятся, из массива загружать другие 80 000, потом другие 80 000 и т.д. ?
Вечность пахнет нефтью

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Загрузка из текстового файла

Сообщение alibek » 13.06.2013 (Чт) 14:15

KPEATOP писал(а):Если понадобятся какие нибудь строки, как их увидеть.

Ты хочешь сказать, что у тебя монитор высотой полтора километра?

KPEATOP писал(а):А как мне другие строки посмотреть, если понадобятся, из массива загружать другие 80 000, потом другие 80 000 и т.д. ?

Ты хочешь сказать, что у тебя монитор высотой 250 метров?
На экране умещается одна или две сотни строк. Вот и нужно отображать только те строки, которые в данный момент выводятся на экран.
А при скроллинге определять позицию первой отображаемой записи, количество выводимых записей и загружать в грид только их.
Потом можно прикрутить всякие оптимизации типа read-ahead, но для начала научись загружать только то, что действительно нужно.
Lasciate ogni speranza, voi ch'entrate.

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Re: Загрузка из текстового файла

Сообщение KPEATOP » 13.06.2013 (Чт) 15:02

alibek писал(а):На экране умещается одна или две сотни строк. Вот и нужно отображать только те строки, которые в данный момент выводятся на экран.
А при скроллинге определять позицию первой отображаемой записи, количество выводимых записей и загружать в грид только их.
Потом можно прикрутить всякие оптимизации типа read-ahead, но для начала научись загружать только то, что действительно нужно.


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

След.

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

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

Сейчас этот форум просматривают: Google-бот и гости: 5

    TopList