Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: ВОПРОС к EROS'у!!!!!! Добавлено: 08.06.06 20:19  

Автор вопроса:  ZXC
Раньше когда форум чита видел твой код:

Imports System.IO
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 :)))

arr=split(file,vbcrlf)
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 filePath As String = Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, "Source.txt";)
        Dim sourceLines() As String = File.ReadAllLines(filePath)

по такому же принципу получаешь второй массив строк..

Пример цикла и поиска подстроки из предыдущего примера
        For Each Line As String In LinesIn
            If Line.IndexOf(seachWord, Comparison) >= 0 Then LinesOut.Add(Line)
        Next


Это в принципе все, что тебе понадобится.. дальше сообразишь сам (если же нет - свисти... будем разбираться...)

Р.S. Поскольку у тебя цифры, то Comparison тебе не понадобится

Что касается второго варианта, то на сайте есть неплохая статья Павла про регулярные выражения, вот её и почитай, чтоб знал с чем имеешь дело...
(появлюсь теперь не раньше вторника, уехал в Волгоград)

Ответить

Номер ответа: 2
Автор ответа:
 ZXC



Вопросов: 30
Ответов: 106
 Профиль | | #2 Добавлено: 09.06.06 07:54
Не...не догнал чото :-))) вот цикл

  For Each Line As String In LinesIn
            If Line.IndexOf(seachWord, Comparison) >= 0 Then LinesOut.Add(Line)
        Next


и в нём надо написать:
SeachWord='А тут номер линии файла SourceLines


И скаждым проходом цикла должно считываться следущая линия...вот как реализовать я чот не понял...жаль что ты уехал :(

Ответить

Номер ответа: 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у памятник надо ставить при жизни :))

чудовище ZXC

ржу нимагу :))))

Ответить

Номер ответа: 7
Автор ответа:
 ZXC



Вопросов: 30
Ответов: 106
 Профиль | | #7 Добавлено: 13.06.06 06:57
А вот и вопрос один :-) как тут прогресс бар прикрутить?

Ответить

Номер ответа: 8
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 13.06.06 09:53
        [B]ProgressBar1.Maximum = dataLines.Length
        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
...задолбал я тебя EROS конечно но всёже

не то, чтобы задолбал.. но знаешь.. порой обидно становится. Обидно потому, что я пишу пример, а ты с ним даже не разбираешься!!! возникает вопрос.. а нафига тогда их писать?? чтоб ты их тупо копировал??? так не пойдет... это не правильно..
В ответе №4 есть одно условие..
                 If data.Contains(source) Then
                    '// добавляем строку в коллекцию
                    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
Ну не могу разобраться, чо тока не пробовал....помоги

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам