Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.61.142] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Привет.
1. Задача - из текстового файла, в котором в каждой строке по несколько слов, оставить только первые слова каждой, извините за повторение , строки. Теория (в моем ламерском понимании) - посимвольно проверять каждый знак, когда это пробел, то выделять все от пробела до конца строки и удалять (заменять ""). Зациклить до конца файла. Проблема в исполнении. Private Sub writeword() Dim x As Long Dim z As Long Dim TextLine Open "d:\Docs\latintest.txt" For Input As #1 Open "d:\Docs\latin2.txt" For Output As #2 Do While Not EOF(1) Line Input #1, TextLine Text1.Text = TextLine + "%" 'добавил в конце строки знак %, т.к. не знаю как определить конец строки x = 0 getword Loop Close #1 Close #2 End Sub Private Sub getword() Text1.SelStart = x Text1.SelLength = 1 If Text1.SelText = " " Then 'проверяю каждый символ на наличие пробела Text1.SelStart = x [B]Text1.SelLength = 'вот тут я не знаю что поставить, чтобы достичь конца строки[/B] Text1.SelText = "" 'удаляем нафиг все лишнее Write #2, Text1.Text 'записываю оставшееся в файл Else: x = x + 1 GoTo getword 'если это еще не пробел, перехожу к следующему знаку End If End Sub Ввиду неопытности в VB (как впрочем и в других языках, возраст не тот), сильно прошу помощи! Если у кого получится на другом языке, ехе-шник на griffonn@gmail.com скиньте, пожалуйста. Но лучше, конечно, чтоб раздуплили меня, как сделать на VB. |
Сообщ.
#2
,
|
|
|
У тебя все неправильно. Раз уж читаешь файл построчно, то мог бы там сразу и реализовать разбор по словам.
Посмотри функцию Split. |
Сообщ.
#3
,
|
|
|
Я и не сомневался, что все неправильно. Написал как представил. А функции мне откуда знать?
Спасибо за Split, все получилось. Возник другой вопрос - есть у меня текстовый файл с этими первыми словами в столбик (по одному в строке), но они иногда повторяются. Как их можно сравнить? If и select case не катит, т.к. записей больше 1000. |
Сообщ.
#4
,
|
|
|
Цитата Griffin @ Возник другой вопрос - есть у меня текстовый файл с этими первыми словами в столбик (по одному в строке), но они иногда повторяются. Как их можно сравнить? If и select case не катит, т.к. записей больше 1000. Сортировать и удалять одинаковые соседние, либо перебор пузырьком. |
Сообщ.
#5
,
|
|
|
Отсортировал нормально, но как удалить? в этом и был вопрос)
А про пузырек можно подробнее? ЗЫ Извините за ламерские вопросы, я только начал колупать VB |
Сообщ.
#6
,
|
|
|
Dim iCounter As Integer Dim arrAnimals() As String Dim TextLine Dim TextOut As String Open "d:\Docs\latin.txt" For Input As #1 ' файл откуда читать Open "d:\Docs\latin2.txt" For Output As #2 ' файл куда писать Do While Not EOF(1) ' зациклить пока не конец файла Line Input #1, TextLine ' читаем каждую строку в переменн arrAnimals = Split(TextLine, ",") 'замени запятую на свой разделитель For iCounter = LBound(arrAnimals) To UBound(arrAnimals) 'это самое главное 'если нужно, как в моем случае, первое слово, то ставишь "LBound(arrAnimals) to 0" 'если скажем третье, то "2 to 3" Write #2, arrAnimals(iCounter) 'пишем во второй файл Next Loop Close #1 ' закрываем 1й файл Close #2 ' закрываем 2й файл |
Сообщ.
#8
,
|
|
|
Взял код пузырька, встроил в свою прогу. Вот что получил. НО!
1. Не знаю как удалить ненужные (повторяющиеся) строки 2. Есди цикл с удалением не использовать вообще, то в о=аутпут файл он выдает мне только кавычки в количестве (iCounter)x2 штук(( Dim ard() As String, i As Long Private Sub BubbleSort(pstrArray() As String) Dim plngMaxItem As Long, i As Long Dim fSwitched As Boolean, strTemp As String Do fSwitched = False For i = 1 To plngMaxItem - 1 If pstrArray(i) > pstrArray(i + 1) Then fSwitched = True strTemp = pstrArray(i) pstrArray(i) = pstrArray(i + 1) pstrArray(i + 1) = strTemp End If Next Loop While fSwitched End Sub Private Sub Form_Load() Dim iCounter As Integer Dim arrAnimals() As String Dim TextLine Dim TextOut As String Open "h:\Docs\latin2.txt" For Input As #1 Open "h:\Docs\latin3.txt" For Output As #2 Do While Not EOF(1) Line Input #1, TextLine Call BubbleSort(ard()) For iCounter = 1 To 200 ReDim ard(iCounter) If ard(iCounter) = ard(iCounter + 1) Then '------------------------------------ 'ÒÓÒ ÊÎÄ ÓÄÀËÅÍÈß ÏÎÂÒÎÐßÞÙÈÕÑß ÑÒÐÎÊ '------------------------------------ End If Write #2, ard(iCounter) Next Loop Close #1 Close #2 End Sub А пост выше - это то, что я склепал из ф-ции split. Работает)) |
Сообщ.
#9
,
|
|
|
Цитата Griffin @ Спасибо за Split, все получилось. Возник другой вопрос - есть у меня текстовый файл с этими первыми словами в столбик (по одному в строке), но они иногда повторяются. Как их можно сравнить? If и select case не катит, т.к. записей больше 1000. У тебя код неправильно построен. Нет смысла использовать массив и Split для одной строки. Там InStr + Mid больше подойдет. Split'ом я предлагал воспользоваться для получения массива строк. Тогда сравнение свелось бы к примерно такому коду: Option Base 0 Private Function ProcessArr(ByRef strArrOfStr() As String) As String() Call SortArray(strArrOfStr) 'Здесь какой-нибудь алгоритм сортировки Dim i As Long ReDim ProcessArr(0) As String For i = 1 To UBound(strArrOfStr) If StrComp(strArrOfStr(i), strArrOfStr(i - 1), vbTextCompare) <> 0 Then If UBound(ProcessArr) = 0 And ProcessArr(0) <> vbNullString Then ReDim Preserve ProcessArr(UBound(ProcessArr) + 1) As String End If ProcessArr(UBound(ProcessArr)) = strArrOfStr(i) End If Next i End Function |
Сообщ.
#10
,
|
|
|
На функцию ругается argument not optional.
Вот код: Option Base 0 Private Function ProcessArr(ByRef strArrOfStr() As String) As String() Open "d:\Docs\latin2.txt" For Input As #1 ' Îòêðûâàåì ôàéë Open "d:\Docs\latin3.txt" For Output As #2 Do While Not EOF(1) ' Çàöèêëèâàåìñÿ, ïîêà íå êîíåö ôàéëà Line Input #1, ProcessArr ' ×èòàåì â ïåðåìåííóþ Call Sortarray(strArrOfStr) 'Çäåñü êàêîé-íèáóäü àëãîðèòì ñîðòèðîâêè Dim i As Long ReDim ProcessArr(0) As String For i = 1 To UBound(strArrOfStr) If StrComp(strArrOfStr(i), strArrOfStr(i - 1), vbTextCompare) <> 0 Then If UBound(ProcessArr) = 0 And ProcessArr(0) <> vbNullString Then ReDim Preserve ProcessArr(UBound(ProcessArr) + 1) As String End If ProcessArr(UBound(ProcessArr)) = strArrOfStr(i) End If Next i Close #1 Close #2 End Function Dim ard() As String, i As Long Private Sub Sortarray(pstrArray() As String) Dim plngMaxItem As Long, i As Long Dim fSwitched As Boolean, strTemp As String plngMaxItem = UBound(pstrArray) Do fSwitched = False For i = 1 To plngMaxItem - 1 If pstrArray(i) > pstrArray(i + 1) Then ' If pstrArray(i) < pstrArray(i + 1) Then fSwitched = True strTemp = pstrArray(i) pstrArray(i) = pstrArray(i + 1) pstrArray(i + 1) = strTemp End If Next Loop While fSwitched End Sub Private Sub Form_Load() ProcessArr End Sub |
Сообщ.
#11
,
|
|
|
Цитата Griffin @ Private Sub Form_Load() ProcessArr End Sub Естественно он ругается, где аргумент то? З.Ы. И вообще код какой-то странный и/или неправильный |
Сообщ.
#12
,
|
|
|
Не сомневаюсь что неправильный. Но с моими знаниями ВБ мне нужен не красивый оптимизованный код, а чтоб оно как-нибудь работало)
Че за аргумент и как его писать? (извините за ламерство) |
Сообщ.
#13
,
|
|
|
Цитата Griffin @ Че за аргумент и как его писать? (извините за ламерство) Вах. Ежели написано Цитата Griffin @ Function ProcessArr(ByRef strArrOfStr() As String) As String() то видно, что сие есть ф-я. В нее обязательно надо передавать массив. И она будет возвращать массив. Т.е. надо юзать так: DestArr=ProcessArr(SourArr()) |
Сообщ.
#14
,
|
|
|
Если я правильно понял, то SourArr это алгоритм Sortarray, то есть собственно сортировка. Но если ставить
DestArr=ProcessArr(Sortarray()) Если оставить оригинал приведенного кода, он естественно говорит, что такого саба нет, потому что его таки нет)) |
Сообщ.
#15
,
|
|
|
Цитата Griffin @ Если я правильно понял, то SourArr это алгоритм Sortarray, то есть собственно сортировка. Но если ставить DestArr=ProcessArr(Sortarray()) , то снова та же ошибка, argument not optional. Если оставить оригинал приведенного кода, он естественно говорит, что такого саба нет, потому что его таки нет)) Скобки убери: DestArr=ProcessArr(Sortarray) |