Текстовый файл -> массив

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

Текстовый файл -> массив

Сообщение dimix » 29.09.2005 (Чт) 16:36

Есть текстовый файл. Например, информация такого вида:

Иванов;Иван;Иванович
Петров;Сергей;Федорович
...
...

Мне нужно получать данные из файла, но не обязательно все. Например, получить всех с фамилией Иванов, или всех с именем Сергей. Поскольку все равно придется читать весь файл, наверное имеет смысл прочитать его сразу и запихнуть данные в массив. А потом уже в массиве искать, фильтровать, сортировать.
Но файл не маленький - 20Мб, почти 200 тысяч строк. Какое решение задачи будет наиболее оптимальным?

P.S. Поиском пользовался - классная вещь, всем рекомендую :) , но хочется с вашей помощью выбрать наиболее оптимальный вариант.

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Re: Текстовый файл -> массив

Сообщение lord0n » 29.09.2005 (Чт) 16:40

dimix писал(а):Есть текстовый файл. Например, информация такого вида:

Иванов;Иван;Иванович
Петров;Сергей;Федорович
...
...

Мне нужно получать данные из файла, но не обязательно все. Например, получить всех с фамилией Иванов, или всех с именем Сергей. Поскольку все равно придется читать весь файл, наверное имеет смысл прочитать его сразу и запихнуть данные в массив. А потом уже в массиве искать, фильтровать, сортировать.
Но файл не маленький - 20Мб, почти 200 тысяч строк. Какое решение задачи будет наиболее оптимальным?

P.S. Поиском пользовался - классная вещь, всем рекомендую :) , но хочется с вашей помощью выбрать наиболее оптимальный вариант.


оптимальное решение - база данных
а так геморою не оберешься
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 29.09.2005 (Чт) 16:59

БеДа в том, что с БД я не умею работать. А в чем будет заключаться работа с БД? Обращаться к файлу как к БД, или преобразовать его во что-то? Немного поясню. Хоть я и сказал, что файл не изменяется, но это не совсем так. Просто можно в процессе работы программы не обращать внимания на изменения в этом файле. Но самому вносить в него изменения нельзя.

Info_m.be_free
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 27.02.2003 (Чт) 21:38
Откуда: Ирпень

Сообщение Info_m.be_free » 29.09.2005 (Чт) 17:07

...
А в чем будет заключаться работа с БД? Обращаться к файлу как к БД, или преобразовать его во что-то? Немного поясню. Хоть я и сказал, что файл не изменяется

Для рекомендаций подробней по ситуации...
Быстрее, проще & полезней научится работать с базами данных :o , удачи

Ем вилкой...

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 29.09.2005 (Чт) 17:36

Быстрее, проще & полезней

Не думаю, что научиться работать с БД быстрее, чем запихнуть текстовый файл в массив. А на счет пользы - на самолете летать тоже полезно научиться, мало ли когда пригодится. Я пишу программы на VB чисто для себя, и досконально изучать VB просто нет времени. Поэтому давайте будем считать, что до самого оптимального варианта я еще не дорос. А какой тогда вариант самый оптимальный из оставшихся неоптимальных?

Info_m.be_free
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 27.02.2003 (Чт) 21:38
Откуда: Ирпень

Сообщение Info_m.be_free » 29.09.2005 (Чт) 17:46

Загружаешь свой файл в переменную, смотришь какой у тебя в файле разделитель - split (переменная , разделитель)
пишу программы на VB чисто для себя

досконально изучать VB просто нет времени

у тебя наверное много денег ... тогда в чем вопрос? :D
Почему так упираешься образовываться?- это плохая примета... Научится производить необходимые тебе действия недолго...

Ем вилкой...

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 29.09.2005 (Чт) 18:23

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


:D Дело не в деньгах. Просто VB не имеет никакого отношения к моей работе. Просто люблю программить.

Образовываться не упираюсь. Я вообще просто ни с того ни с сего скачал VB и начал в него врубаться. А по поводу БД - мне так никто и не ответил, в чем же эта базоданность будет заключаться в моем случае?

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 29.09.2005 (Чт) 18:27

Загружаешь свой файл в переменную, смотришь какой у тебя в файле разделитель - split (переменная , разделитель)


Это я знаю. Оно даже работает :)
Но вот насколько критично все 200 тысяч строк кидать в один массив? И какой это должен быть массив - обычный двумерный? Динамический? А есть еще коллекции. Или это уже не в ту степь? Мне нужен толчок в нужном направлении, чтобы потом не переделывать.

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 659
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 29.09.2005 (Чт) 20:42

Поищи на форуме посты про DBF... Очень рекомендую.. и таблица простая получится и коннект к ней не сложный + если все по уму сделать то и инсталлятор не понадобится (за исключением Win98) А уже из DBF при помощи запросов все данные выдернешь очень просто

Например "SELECT * FROM baza WHERE IMYA= ""СЕРГЕЙ"" " :)
Если нужна будет помощь то в ЛС + аська :) УСПЕХОВ
Утро добрым не бывает!

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 29.09.2005 (Чт) 21:40

Private Sub doComma_Click()
Open commaName.Text For Input As #1
'Do While Not EOF(1)
Line Input #1, textline
pos = InStr(1, textline, ",") 'Ищем запятую,
total = 0
results.Text = textline + Chr(13) + Chr(10)

While pos > 0
parseleft = Left(textline, pos - 1) ' Get left word.
parseleft = Trim(parseleft)
parseNum = Val(parseleft)
total = total + parseNum
textline = Right(textline, Len(textline) - pos)
results.Text = results.Text + textline + Chr(13) + Chr(10)
pos = InStr(1, textline, ",") ' Find ,
Wend

textline = Trim(textline)
parseNum = Val(textline)
total = total + parseNum
results.Text = results.Text + Chr(13) + Chr(10) + "the total is : " + Str(total)
'Loop
Close #1
End Sub

Или еще вариант

Private Sub doIni_Click()
Open ininame.Text For Input As #1
Do While Not EOF(1)
Line Input #1, textline
rawOutput = rawOutput + textline + Chr(13) + Chr(10)
pos = InStr(1, textline, "=") ' Find =
If pos Then
parseleft = Left(textline, pos - 1) ' Get left word.
parseleft = Trim(parseleft)
parseright = Right(textline, Len(textline) - pos) ' Get right word.
parseright = Trim(parseright)
resultOutput = resultOutput + parseleft + " is " + parseright + Chr(13) + Chr(10)
End If
Loop
results.Text = rawOutput + Chr(13) + Chr(10) + resultOutput

Close #1
End Sub
Вариантов - море. Я взял первый попавшийся в поиске..
PS! Chr(13)+Chr(10) -это конец строки ( перевод строки)

Короче- Разбираем шаг за шагом файл на строки и каждую строку проверяем:
if InStr(1, textline, "Иванов,Иван,Иванович"")>0 then _
MyString=mid(textline,1,Len(textline)-2) 'Len(textline)-длина строки без двух последних непечатных символов Chr(13) + Chr(10)

Обработка пройдет достаточно быстро, Но.. я бы воспользовался Access или его таблицами. Поиск - поиском, а вот дальнейшая обработка, хранение. А если шнур из розетки выскочил? Access мог бы выручить
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 30.09.2005 (Пт) 7:24

dimix писал(а):
у тебя наверное много денег ... тогда в чем вопрос?


:D Дело не в деньгах. Просто VB не имеет никакого отношения к моей работе. Просто люблю программить.

Образовываться не упираюсь. Я вообще просто ни с того ни с сего скачал VB и начал в него врубаться. А по поводу БД - мне так никто и не ответил, в чем же эта базоданность будет заключаться в моем случае?


я бы сделал по другому:
открыл текстовый файл как базу
ИХМО работать с ним станет приятнее :)
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 30.09.2005 (Пт) 10:42

gjghjc писал(а):Поищи на форуме посты про DBF... Очень рекомендую.. и таблица простая получится и коннект к ней не сложный + если все по уму сделать то и инсталлятор не понадобится (за исключением Win98) А уже из DBF при помощи запросов все данные выдернешь очень просто


Нельзя мне изменять исходный файл. И создавать его копию, конвертировать в DBF тоже нельзя. Ибо он может в любой момент измениться (не мной) и мне нужно будет его перечитать. Предполагаю, кнопочкой "Обновить". Тогда я очищу свой массив и заново прочитаю в него txt. Если для каждого обновления конвертить файл в DBF... :roll:

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 30.09.2005 (Пт) 10:49

dimix писал(а):
gjghjc писал(а):Поищи на форуме посты про DBF... Очень рекомендую.. и таблица простая получится и коннект к ней не сложный + если все по уму сделать то и инсталлятор не понадобится (за исключением Win98) А уже из DBF при помощи запросов все данные выдернешь очень просто


Нельзя мне изменять исходный файл. И создавать его копию, конвертировать в DBF тоже нельзя. Ибо он может в любой момент измениться (не мной) и мне нужно будет его перечитать. Предполагаю, кнопочкой "Обновить". Тогда я очищу свой массив и заново прочитаю в него txt. Если для каждого обновления конвертить файл в DBF... :roll:


если откроешь файл как базу, то будет еще проще
но это я повторяюсь

массив размером 20 метров - мама :shock:
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 30.09.2005 (Пт) 10:50

SergT писал(а):While pos > 0
parseleft = Left(textline, pos - 1) ' Get left word.
parseleft = Trim(parseleft)
parseNum = Val(parseleft)
total = total + parseNum
textline = Right(textline, Len(textline) - pos)
results.Text = results.Text + textline + Chr(13) + Chr(10)
pos = InStr(1, textline, ",") ' Find ,
Wend


Зачем в цикле искать запятую? Разве не легче использовать Split?

А если шнур из розетки выскочил? Access мог бы выручить

Да пофигу, пусть выскакивает. Когда открываешь файл ТОЛЬКО НА ПРОСМОТР разве не пофигу? Мне нужно только читать файл, осуществлять сортировку данных, фильтрацию. Но БЕЗ сохранения как исходного файла, так и результата работы с ним.

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 30.09.2005 (Пт) 10:54

если откроешь файл как базу, то будет еще проще
но это я повторяюсь


lord0n, прости, не успел отреагировать на твой пост, отвечал на предыдущий. Но больше всего заинтересовал именно твой. Поясни, плиз, что означает "открыть файл как базу"? Не обязательно кодом, хочу суть понять. (Если и код будет все равно не обижусь :) ).

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 30.09.2005 (Пт) 10:56

[quote="dimix"] .... осуществлять сортировку данных, фильтрацию. [quote]

когда сделаешь - напиши как?
по моему мнению с этим будут еще те проблемы :roll:
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 30.09.2005 (Пт) 11:06

lord0n писал(а):когда сделаешь - напиши как?

Не вопрос, обязательно напишу. Но все же хотелось узнать, как открывать текстовый файл "как базу". В смысле, что это означает?

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 30.09.2005 (Пт) 11:12

dimix писал(а):
lord0n писал(а):когда сделаешь - напиши как?

Не вопрос, обязательно напишу. Но все же хотелось узнать, как открывать текстовый файл "как базу". В смысле, что это означает?


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

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

Set db = New ADODB.Connection
Set RS = New ADODB.Recordset

db.CursorLocation = adUseClient
db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\txtFilesFolder\;Extended Properties=""text;HDR=Yes;FMT=Delimited"""


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

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 30.09.2005 (Пт) 11:19

Спасибо, буду врубаться.

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 30.09.2005 (Пт) 11:23

вот те еще в помощь:
http://www.connectionstrings.com/
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 30.09.2005 (Пт) 16:18

Блин! Че-то у меня не получается... Причем сам не знаю, что именно :(

Для начала я пишу:
Код: Выделить всё
    Dim db As Connection
    Dim RS As Recordset
    Set db = New ADODB.Connection
    Set RS = New ADODB.Recordset


Потом идет

Код: Выделить всё
db.CursorLocation = adUseClient


Попутно вопрос: зачем это и что мне использовать Client, Server или None, если у меня обычный txt?

А вот дальше не пашет:
Код: Выделить всё
db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\1.txt;Extended Properties=""text;FMT=Delimited"""


Говорит, что строка 'D:\1.txt' задает ошибочный путь. Я так понимаю, дело в Extended Properties. Когда я его убираю и остается
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\1.txt", пишет, что нераспознаваемый формат базы данных. Оно и понятно. Если добавляю Extended Properties - облом :(

Что я делаю не так?

P.S. В MSDN нашел пример, он аналогичный. И тоже не работает. Изменение HDR не помогает.

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 30.09.2005 (Пт) 19:12

Надо же, получилось! Просто убрал имя файла из ConnectionString и использовал имя файла уже в:

RS.Open "SELECT * FROM 1.txt"

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 30.09.2005 (Пт) 19:42

Ну вот. Новая проблема.

Почему если у моего файла расширение txt, то все хорошо, а если другое, например ttt, то на RS.Open ругается:

Обновление невозможно. База данных или объект доступны только для чтения.


:?:


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

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

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

    TopList