Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

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

 

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

Автор вопроса:  ZXC

Ответить

  Ответы Всего ответов: 29  

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



Вопросов: 58
Ответов: 4255
 Профиль | | #16 Добавлено: 28.06.06 16:47
'VS 2005

Imports System.IO
Imports System.Text

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        '// Создай на рабочем столе текстовый файл с твоими
        '// строками (с дубликатами) под именем "ZXCtest.txt"

        Const messageTitle As String = "Find & remove duplicates"

        '// Получаем путь к файлу
        Dim filePath As String = Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, _
                                              "ZXCtest.txt";)

        '// Проверка на наличие файла по указанному пути
        If Not File.Exists(filePath) Then
            Dim errorMessage As String = String.Format("File '{0}'{1}not found!", filePath, vbNewLine)
            MessageBox.Show(errorMessage, messageTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Return
        End If

        '// Объявляем коллекцию
        Dim dataLines As ArrayList

        Try
            '// Задаем кодировку файла.. (иначе не увидишь русских букв)
            Dim currentEncoding As Encoding = System.Text.Encoding.Default

            '// Читаем файл с указанием кодировки и заполняем
            '// коллекцию строками из файла
            dataLines = New ArrayList(File.ReadAllLines(filePath, currentEncoding))
        Catch ex As Exception
            '// Обрабатываем ошибки
            MessageBox.Show(ex.Message, messageTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Return
        End Try

        '// Проверка на то, что файл не пустой
        If dataLines.Count = 0 Then
            Dim errorMessage As String = String.Format("File '{0}'{1}is empty!", filePath, vbNewLine)
            MessageBox.Show(errorMessage, messageTitle, MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return
        End If

        '// ОСНОВНАЯ ЧАСТЬ

        '// Поскольку во время работы цикла у нас будут удаляться
        '// строки, то свойство dataLines.Count будет постоянно
        '// меняться. А это значит, что мы НЕ можем использовать
        '// цикл вида For Each ... Next, так как изменение кол-ва
        '// элементов коллекции будет вызывать ошибку. Обычно, в
        '// таких случаях используют цикл вида:
        '// For I as Int32 = dataLines.Count-1 To 0 Step -1
        '// Что позволяет начать поиск с последнего элемента и
        '// избежать возникновение этой ошибки. Я предлагаю НЕ
        '// привязываться к свойству Count коллекции и использовать
        '// цикл вида Do ... Loop

        '// Индекс текущей строки, который позволит нам
        '// определить конец коллекции
        Dim currentIndex As Int32 = 0

        '// Это первый цикл, который просто перебирает строки
        '// от первой до последней
        Do

            '// Это стартовая позиция поиска. Делаем её на еденицу больше
            '// относительно текущей позиции строки.
            '// К примеру: Ищем строку 5 НАЧИНАЯ со строки 6
            Dim startSearch As Int32 = currentIndex + 1

            '// Это индекс найденной строки
            Dim searchIndex As Int32

            '// Берем из коллекции текущую строку
            Dim searchLine As String = dataLines(currentIndex)

            '// Это второй цикл. В котором непосредственно и происходит
            '// поиск и удаление дубликатов текущей строки
            Do

                '// Ищем этекущую строчку НАЧИНАЯ со стартовой позиции поиска
                '// Если строка найдена, то IndexOf вернет индекс этой строки
                '// который будет больше, либо равен нулю. Если же нет, то вернет -1
                searchIndex = dataLines.IndexOf(searchLine, startSearch)

                '// Если совпадение найдено, то ...
                If searchIndex <> -1 Then
                    '// удаляем эту строчку из коллекции
                    dataLines.RemoveAt(searchIndex)

                    '// Для ускорения поиска смещаем позицию начала поиска
                    '// и делаем ее равной индексу только что найденной строки
                    '// К примеру: Мы имеем 100 строк. Ищем строку 27 начиная
                    '// с позиции 28. И находим совпадение в строке 64
                    '// По логике вещей, следующий поиск мы должны начать со
                    '// строки 65, НО!!! после удаления, та строка которая была 65,
                    '// станет 64-й... А если мы этого не сделаем, то поиск опять
                    '// начнется со строки 28, что сам понимаешь, будет большой
                    '// глупостью. Хочу отметить, что на больших файлах
                    '// этот прием даст существенный выигрыш во времени..
                    startSearch = searchIndex
                End If

                '// Продолжаем цикл до тех пор, пока НЕ будет найдено совпадений
                '// т.е. удаляем ВСЕ строки совпадающие с текущей
            Loop While searchIndex >= 0

            '// Переходим на следущую строчку
            currentIndex += 1

            '// Продолжаем цикл до тех пор, пока не достигнем последней строки
        Loop While currentIndex < dataLines.Count

        '// После работы этого кода в коллекции dataLines
        '// остануться только по 1 экземпляру строк
        '// И дальше уже можешь делать с коллекцией что угодно
        '// Выгрузить в массив, записать обратно в файл и т.д......

    End Sub

End Class

Ответить

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



Вопросов: 30
Ответов: 106
 Профиль | | #17 Добавлено: 28.06.06 18:34
Спасиб за код :) протестил вроде пашет главное правельно совместить, вообщем хочу сделать так: сначало обработать файл этим кодом, а потом тем , т.е сначало удалю все дубликаты, а потом спокойно вытащю то что мне нужно :-) только столкнулся с проблемой
'// После работы этого кода в коллекции dataLines
        '// остануться только по 1 экземпляру строк
        '// И дальше уже можешь делать с коллекцией что угодно
        '// Выгрузить в массив, записать обратно в файл и т.д......


вот как записать результат работы кода? надо dataLines в String переводить? я пробовал но что то не выходит, и правельно ли я понял, что после работы этого кода в переменной dataLines будет уже отсортированный от дубликатов содержание файла в котором искали? подскажи плиззз как сохранить то :-)


P.S а если совмещать с тем кодом, всё работает но както не так, у меня все записи местами переворачиваються...поэтому и решил сделать 2 разные программы

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #18 Добавлено: 28.06.06 19:45
протестил вроде пашет

А ты сомневался????
вообщем хочу сделать так: сначало обработать файл этим кодом, а потом тем

это бред... ты выполнишь кучу лишних телодвижений.. все должно быть в 1 процедуре..
вот как записать результат работы кода?

ничего никуда писать не надо... до тех пор, пока задача не будет выполнена полностью
надо dataLines в String переводить?

ничего переводить не надо.. продолжай работать с коллекцией..
и правельно ли я понял, что после работы этого кода в переменной dataLines будет уже отсортированный от дубликатов содержание файла в котором искали?

понял ты правильно, с небольшой поправкой.. список никто НЕ сортировал.. он в первозданном виде,только без дубликатов..
у меня все записи местами переворачиваються

Если необходимо сохранить последовательность строк, то цикл For Each ... Next замени на обычный For ... Next
поэтому и решил сделать 2 разные программы

даже не думай...

Ответить

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



Вопросов: 30
Ответов: 106
 Профиль | | #19 Добавлено: 28.06.06 21:50
записать обратно в файл и т.д......

я немогу записать в файл! если записываю так
     Using myFileStream As New IO.FileStream("C:\Documents and Settings\ZXC\Рабочий стол\1234.txt", IO.FileMode.Create)
            Dim myStreamWriter As New IO.StreamWriter(myFileStream)
            myStreamWriter.Write(result)
            myStreamWriter.Close()
        End Using


Мне пишет в файл вот что:

System.Collections.ArrayList


Как записать в файл то? я имею ввиду результат как записать в файл?...

Ответить

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



Вопросов: 30
Ответов: 106
 Профиль | | #20 Добавлено: 28.06.06 21:52
блин не то скопировал, вместо
myStreamWriter.Write(result)

Я делал
myStreamWriter.Write(dataLines)

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #21 Добавлено: 28.06.06 22:34
Using myFileStream As New IO.FileStream("C:\Documents and Settings\ZXC\Рабочий стол\1234.txt", IO.FileMode.Create)
            ;Dim myStreamWriter As New IO.StreamWriter(myFileStream)
            myStreamWriter.Write(result)
            myStreamWriter.Close()
        End Using


:-)))))))) вот насмешил... спасибо!!!
Кто тебя так учил файлы писать???

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #22 Добавлено: 28.06.06 22:35
' VS 2005
Imports System.IO

Public Class Form1

    '// Массив искомых цифр
    Private sourceLines() As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        '// ------------------- ЗАГЛУШКИ -------------------
        '// Реальные данные будешь брать из файлов

        sourceLines = New String() {"7", _
                                    "12", _
                                    "57"}

        '// Массив строк в котором осуществляется поиск ( WITH DUPLICATES )
        Dim dataLines() As String = New String() {"9 вал", _
                                                  "Али-баба и 40 разбойников", _
                                                  "12 обезьян", _
                                                  "1001 ночь", _
                                                  "7 красавиц и чудовище ZXC", _
                                                  "Белоснежка и 7 гномов", _
                                                  "12 обезьян", _
                                                  "9 вал", _
                                                   "12 обезьян", _
                                                  "1001 ночь", _
                                                  "7 красавиц и чудовище ZXC", _
                                                  "Белоснежка и 7 гномов", _
                                                  "12 обезьян", _
                                                  "9 вал", "12 обезьян", _
                                                  "1001 ночь", _
                                                  "7 красавиц и чудовище ZXC", _
                                                  "Белоснежка и 7 гномов", _
                                                  "12 обезьян", _
                                                  "9 вал", _
                                                  "7 красавиц и чудовище ZXC"}

        '// ------------------- ОСНОВНОЙ КОД -------------------

        '// Удаляем дубликаты
        Dim arrayData As New ArrayList(dataLines)
        Dim currentIndex As Int32 = 0
        Do
            Dim startSearch As Int32 = currentIndex + 1
            Dim searchIndex As Int32
            Dim searchLine As String = dataLines(currentIndex)
            Do
                searchIndex = arrayData.IndexOf(searchLine, startSearch)
                If searchIndex <> -1 Then
                    arrayData.RemoveAt(searchIndex)
                    startSearch = searchIndex
                End If
            Loop While searchIndex >= 0
            currentIndex += 1
        Loop While currentIndex < arrayData.Count

        '// Смотрим что осталось в коллекции
        PrintResult(arrayData) '// MUST BE DELETE !!!
        '// 9 вал
        '// Али-баба и 40 разбойников
        '// 12 обезьян
        '// 1001 ночь
        '// 7 красавиц и чудовище ZXC
        '// Белоснежка и 7 гномов
        '// ДУБЛИКАТОВ НЕТ

        '// Возвращаем данные в исходный массив строк
        dataLines = arrayData.ToArray(GetType(String))

        '// Через делегата ищем все строки содержащие любое из значений sourceLines
        dataLines = Array.FindAll(dataLines, AddressOf ExistsWord)

        '// Смотрим что из всего этого получилось
        PrintResult(dataLines) '// MUST BE DELETE !!!
        '// 12 обезьян
        '// 7 красавиц и чудовище ZXC
        '// Белоснежка и 7 гномов

        '// Теперь в массиве dataLines содержаться строки,
        '// удовлетворяющие твоему условию
        '// МОЖЕШЬ ПИСАТЬ ИХ НА HDD

        '// Задаем путь к файлу
        Dim filePath As String = Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, _
                                              "Results.txt";)
        Try
            File.WriteAllLines(filePath, dataLines, System.Text.Encoding.Default)
        Catch ex As Exception
            '// Обрабатываем ошибки
            MessageBox.Show(ex.Message, "ZXC", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

    '// ByVal match As System.Predicate(Of T)
    Private Function ExistsWord(ByVal Line As String) As Boolean

        For Each searchWord As String In sourceLines
            If Line.Contains(searchWord) Then Return True
        Next

        Return False

    End Function

    Private Sub PrintResult(ByVal Lines As System.Collections.ICollection)

        '// MUST BE DELETE !!!

        '// Вспомогательная процедура для контроля данных
        '// Выводит содержимое ICollection в окно Output
        '//

        For Each Line As String In Lines
            Console.WriteLine("'// " & Line)
        Next
        Console.WriteLine(String.Empty)
    End Sub

End Class

Ответить

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



Вопросов: 30
Ответов: 106
 Профиль | | #23 Добавлено: 28.06.06 22:36
На другом форуме :-))))) ну покажи как надо :) ну блин, как записать отсортированный результат то???? :)

Ответить

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



Вопросов: 30
Ответов: 106
 Профиль | | #24 Добавлено: 28.06.06 22:47
мы однавременно состовляли сообщение :)) я неувидал твой код, щас гляну

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #25 Добавлено: 28.06.06 22:57
На другом форуме :-)))))

предатель!!!!

Ответить

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



Вопросов: 30
Ответов: 106
 Профиль | | #26 Добавлено: 28.06.06 23:04
ха всё крутоо! :) но ещё вопрос :-))))) как поставить фильтры? т.е есть строки которые НУЖНО оставить и ни поторяються много раз, а прога их заитрает тем самым в файле всё здвигаеться и становиться нефига непонятно :-)) если типо нетрудно подскажи, я пока гляжу пример

предатель!!!!

Это было давноооо и неправда :-)

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #27 Добавлено: 28.06.06 23:09
у меня тоже один вопрос... простенький..
СКОКА ДЕНИХ????

Ответить

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



Вопросов: 30
Ответов: 106
 Профиль | | #28 Добавлено: 28.06.06 23:15
чего скоко? :-))) что такое ДЕНИХ? )

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #29 Добавлено: 28.06.06 23:19
:-))))
денег, говорю, сколько платишь????

Ответить

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

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



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