Страница: 1 | 2 |
Вопрос: ВОПРОС к EROS'у!!!!!!
Добавлено: 08.06.06 20:19
Автор вопроса: ZXC
Раньше когда форум чита видел твой код:
Imports Microsoft.VisualBasic.Interaction
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Const dialogTitle As String = "Find word"
Dim filePath As String
Dim Comparison As StringComparison = StringComparison.CurrentCulture
Dim LinesIn, LinesOut As ArrayList
With New OpenFileDialog
.Title = "Какой файл читаем?"
.Filter = "Текстовый файл (*.txt)|*.txt"
.CheckFileExists = True
.Multiselect = False
.RestoreDirectory = True
If .ShowDialog = Windows.Forms.DialogResult.Cancel Then .Dispose() : Return
filePath = .FileName
.Dispose()
End With
LinesIn = New ArrayList
Try
Dim sr As StreamReader = New StreamReader(filePath, True)
Do While sr.Peek() >= 0
LinesIn.Add(sr.ReadLine())
Loop
sr.Close()
Catch ex As Exception
MessageBox.Show(ex.Message, dialogTitle, MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End Try
If LinesIn.Count = 0 Then MessageBox.Show("File is empty", dialogTitle, _
MessageBoxButtons.OK, MessageBoxIcon.Information) : Return
Dim seachWord As String = InputBox("Введите искомое слово ...", dialogTitle).Trim
If seachWord.Length = 0 Then Return
If MessageBox.Show("Учитывать регистр?", dialogTitle, _
MessageBoxButtons.YesNo, MessageBoxIcon.Question, _
MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.No Then
Comparison = StringComparison.CurrentCultureIgnoreCase
End If
LinesOut = New ArrayList
For Each Line As String In LinesIn
If Line.IndexOf(seachWord, Comparison) >= 0 Then LinesOut.Add(Line)
Next
If LinesOut.Count = 0 Then MessageBox.Show(seachWord & " not found.", dialogTitle, _
MessageBoxButtons.OK, MessageBoxIcon.Information) : Return
MessageBox.Show("Найдено совпадений - " & LinesOut.Count, dialogTitle, _
MessageBoxButtons.OK, MessageBoxIcon.Information)
With New SaveFileDialog
.Title = "Куда будем сохранять?"
.Filter = "Текстовый файл (*.txt)|*.txt"
.OverwritePrompt = True
.DefaultExt = "txt"
.AddExtension = True
.FileName = "Result"
If .ShowDialog = Windows.Forms.DialogResult.Cancel Then .Dispose() : Return
filePath = .FileName
.Dispose()
End With
Try
Dim sw As StreamWriter = New StreamWriter(filePath, False)
For Each Line As String In LinesOut
sw.WriteLine(Line)
Next
sw.Close()
Catch ex As Exception
MessageBox.Show(ex.Message, dialogTitle, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
End Class
Мне тоже нужно сделать аналогичную задачу! НО! нужен сделать чтобы искомые слова брались из файла а не вводилось юзером, т.е есть файл с данными (данные из цифр) нужно как я понял запустить цикл, далее считываем из файла строку, и прогоняем по всему файлу в котором ищем, если нашлось добавляем всю строчку в переменную LinesOut, и опять считываем другую строку и прогоняем по файлу в котором ищем, и т.д....вот реализовать как не знаю :( пробвалл по старинке на VB6 :)))
For i=o to Ubound(arr)-1
Next i
:)) вот таким вот способом...но думаю в .NET есть решение получше :) если не трудно помоги пожалуйста
Ответы
Всего ответов: 29
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 09.06.06 00:23
Тут можно пойти 2-я путями...
1.как ты и предложил-реализовать цикл
2.использовать для поиска регулярные выражения
Разберем 1-й вариант:
тебе понадобятся 2 массива..
-массив строк и искомыми словами(цифрами)
-массив строк в которых осуществляется поиск..
для получения массива строк из файла можно сделать так:
Imports System.IO
далее в программе:
Dim sourceLines() As String = File.ReadAllLines(filePath)
по такому же принципу получаешь второй массив строк..
Пример цикла и поиска подстроки из предыдущего примера
If Line.IndexOf(seachWord, Comparison) >= 0 Then LinesOut.Add(Line)
Next
Это в принципе все, что тебе понадобится.. дальше сообразишь сам (если же нет - свисти... будем разбираться...)
Р.S. Поскольку у тебя цифры, то Comparison тебе не понадобится
Что касается второго варианта, то на сайте есть неплохая статья Павла про регулярные выражения, вот её и почитай, чтоб знал с чем имеешь дело...
(появлюсь теперь не раньше вторника, уехал в Волгоград)
Номер ответа: 2
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #2
Добавлено: 09.06.06 07:54
Не...не догнал чото )) вот цикл
If Line.IndexOf(seachWord, Comparison) >= 0 Then LinesOut.Add(Line)
Next
и в нём надо написать:
И скаждым проходом цикла должно считываться следущая линия...вот как реализовать я чот не понял...жаль что ты уехал
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 11.06.06 23:13
что то я тебя понять не могу.. тебе нужны сами строки или только номера строк???
Ты уж поднапрягись немного и четко опиши, что в конечном итоге у тебя должно получиться...
Номер ответа: 4
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #4
Добавлено: 12.06.06 12:47
Если тебе нужны строки, то можно сднлать так:
'//(реальные данные будешь брать из файлов)
'// массив искомых цифр
Dim sourceLines() As String = New String() {"7", _
"12", _
"57"}
'// массив строк в котором осуществляется поиск
Dim dataLines() As String = New String() {"9 вал", _
"Али-баба и 40 разбойников", _
"12 обезьян", _
"1001 ночь", _
"7 красавиц и чудовище ZXC", _
"Белоснежка и 7 гномов"}
'// Проверка на наличие данных
If sourceLines Is Nothing OrElse _
dataLines Is Nothing OrElse _
sourceLines.Length = 0 OrElse _
dataLines.Length = 0 Then
MessageBox.Show("String array is nothing or empty...", "Error", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Return
End If
'// StringBuilder специально заточен для работы со строками
'// и скорость конкатеации у него на порядок выше,
'// чем у других коллекций.Поэтому использовать для хранения
'// найденных строк будем именно его
Dim output As New System.Text.StringBuilder
For Each data As String In dataLines
For Each source As String In sourceLines
If data.Contains(source) Then
'// добавляем строку в коллекцию
output.AppendLine(data)
'// поскольку совпадение уже найдено, то продолжать
'// перебор дальше не имеет смысла. Поэтому
'// выходим из внутреннего цикла
Exit For
End If
Next
Next
'//Show results
Dim resultMessage As String
If output.Length > 0 Then
resultMessage = output.ToString
Else
resultMessage = "Sorry, matches not found..."
End If
MessageBox.Show(resultMessage, "Result find of matches", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
Номер ответа: 5
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #5
Добавлено: 13.06.06 00:24
Короче есть 2 файла, в первом нужно делать поиск, во втором слова для поиска, берём первое слово из файла со словами для поиска и ищем его в файле, если нашли то, вырезаем всю строку и добавляем в третий файл, и так далее пока не кончаться слова для поиска, ) ну вот собственно и всё что требуется...
P.S в файле со совами для поиска каждое слово на 1 строке, т.е следующее слово на другой строке...
Номер ответа: 6
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #6
Добавлено: 13.06.06 03:16
Всё разобрался )) вопросов нет, EROSу памятник надо ставить при жизни )
ржу нимагу )))
Номер ответа: 7
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #7
Добавлено: 13.06.06 06:57
А вот и вопрос один как тут прогресс бар прикрутить?
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 13.06.06 09:53
ProgressBar1.Value = 0[/B] For Each data As String In dataLines
For Each source As String In sourceLines
If data.Contains(source) Then
'// добавляем строку в коллекцию
output.AppendLine(data)
'// поскольку совпадение уже найдено, то продолжать
'// перебор дальше не имеет смысла. Поэтому
'// выходим из внутреннего цикла
Exit For
End If
Next
[B]ProgressBar1.Value += 1[/B]
Next
Номер ответа: 9
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #9
Добавлено: 13.06.06 15:06
ok спасибо!
Номер ответа: 10
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #10
Добавлено: 27.06.06 17:52
...задолбал я тебя EROS конечно но всёже у меня в искомо файл есть куча дубликатов, одинаковые строки, и они добавляються по многу раз, так вот можноо ли сделать какнибуть чтобы дубликаты не добавлялись? ну или сделать чтобы программа проверила сначало файл в который всё записываеться и если там нету такогоже значения то добавляеться, только вот как сделать это я незнаю мож подскажеш? хотя помоемуэто оч трудно )
Номер ответа: 11
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #11
Добавлено: 27.06.06 22:32
EROS надеюсь ответиш...хотя врятли )))
Номер ответа: 12
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #12
Добавлено: 27.06.06 22:33
не то, чтобы задолбал.. но знаешь.. порой обидно становится. Обидно потому, что я пишу пример, а ты с ним даже не разбираешься!!! возникает вопрос.. а нафига тогда их писать?? чтоб ты их тупо копировал??? так не пойдет... это не правильно..
В ответе №4 есть одно условие..
'// добавляем строку в коллекцию
output.AppendLine(data)
'// поскольку совпадение уже найдено, то продолжать
'// перебор дальше не имеет смысла. Поэтому
'// выходим из внутреннего цикла
Exit For
End If
Как думаешь, что я тут проверял???
вот разберись как следует с примером, и ответь на этот вопрос!!
После этого этого ты будешь сам в состоянии решить свою проблему...
Номер ответа: 13
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #13
Добавлено: 28.06.06 11:43
Да почему не смотрю? я сутки сидела и думал как сделать чтобы не добовлялись дубликаты, просто у меня нету столько знаний и опыта как у тебя, поэтому я не могу реализоватьэту задачу, моих знаний тут нехватает....вот и опять, час думаю что тут сделлать, но не выходит у меня не чего ((
Номер ответа: 14
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #14
Добавлено: 28.06.06 11:45
опечатка )) *сидел
Номер ответа: 15
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #15
Добавлено: 28.06.06 13:31
Ну не могу разобраться, чо тока не пробовал....помоги