Как читать из текстового файла и хранить данные, чтобы изменить позже - PullRequest
0 голосов
/ 02 сентября 2011

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

У меня есть список URL в текстовом файле. Это достаточно просто, чтобы открывать и читать построчно, но как я могу сохранить дополнительные данные из файла и запросить данные?

например. Текстовый файл:

http://link1.com/ - 0
http://link2.com/ - 0
http://link3.com/ - 1
http://link4.com/ - 0
http://link5.com/ - 1

Тогда я прочитаю данные с:

Private Sub ButtonX2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonX2.Click
        OpenFileDialog1.Filter = "*txt Text Files|*.txt"
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            Dim AllText As String = My.Computer.FileSystem.ReadAllText(OpenFileDialog1.FileName)
            Dim Lines() = Split(AllText, vbCrLf)
            Dim list = New List(Of Test)
            Dim URLsLoaded As Integer = 0
            For i = 0 To UBound(Lines)
                If Lines(i) = "" Then Continue For
                Dim URLInfo As String() = Split(Lines(i), " - ")
                If URLInfo.Count < 6 Then Continue For
                list.Add(New Test(URLInfo(0), URLInfo(1)))
                URLsLoaded += 1
            Next
            DataGridViewX1.DataSource = list
            LabelX5.Text = URLsLoaded.ToString()
        End If
    End Sub

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

Теперь вот моя проблема, я хочу иметь возможность запрашивать данные, например, Выберите * из URL-адресов, ГДЕ активно = '1' (слишком используется для PHP + MySQL!)

Где 1 - это соответствующий 1 или 0 после URL в текстовом файле.

В приведенном выше примере данные хранятся в простом классе, как показано ниже:

Public Class Test
    Public Sub New(ByVal URL As String, ByVal Active As Integer)
        _URL = URL
        _Active = Active
    End Sub

    Private _URL As String
    Public Property URL() As String
        Get
            Return _URL
        End Get
        Set(ByVal value As String)
            _URL = value
        End Set
    End Property

    Private _Active As String
    Public Property Active As String
        Get
            Return _Active
        End Get
        Set(ByVal value As String)
            _Active = value
        End Set
    End Property

End Class

Правильно ли я поступаю неправильно при сохранении данных после импорта из текстового файла?

Я новичок в VB.NET и все еще изучаю основы, но мне гораздо легче учиться, играя перед тем, как поразить огромные книги!

Ответы [ 3 ]

1 голос
/ 02 сентября 2011

Рабочий пример:

Dim myurls As New List(Of Test)
myurls.Add(New Test("http://link1.com/", 1))
myurls.Add(New Test("http://link2.com/", 0))
myurls.Add(New Test("http://link3.com/", 0))

Dim result = From t In myurls Where t.Active = 1

For Each testitem As Test In result
    MsgBox(testitem.URL)
Next

Кстати, LINQ - это волшебство.Вы можете сократить код загрузки / анализа до 3 строк кода:

Dim Lines() = IO.File.ReadAllLines("myfile.txt")
Dim myurls As List(Of Test) = (From t In lines Select New Test(Split(t, " - ")(0), Split(t, " - ")(1))).ToList
DataGridViewX1.DataSource = myurls

Первая строка читает все строки в файле в массив строк.Вторая строка разбивает каждую строку в массиве, создает тестовый элемент, а затем преобразует все эти результирующие элементы в список (из Test).

Конечно, это может быть использовано глупо, если сделать егоone-row: er:

DataGridViewX1.DataSource = (From t In IO.File.ReadAllLines("myfile.txt") Select New Test(Split(t, " - ")(0), Split(t, " - ")(1))).ToList

, который бы отображал вашу функцию загрузки так, чтобы она содержала только следующие 4 строки:

If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
        DataGridViewX1.DataSource = (From t In IO.File.ReadAllLines("myfile.txt") Select New Test(Split(t, " - ")(0), Split(t, " - ")(1))).ToList
        LabelX5.Text = ctype(datagridviewx1.datasource,List(Of Test)).Count
End If
1 голос
/ 02 сентября 2011

Вы можете запросить свой класс с помощью LINQ, если он относится к соответствующему типу коллекции, например List(of Test). Я не полностью знаком с синтаксисом VB для LINQ, но это будет что-то вроде ниже.

list.Where(Function(x) x.Active == "1").Select(Function(x) x.Url)

Тем не менее, это на самом деле ничего не хранит в базе данных, что, я думаю, ваш вопрос может задавать?

0 голосов
/ 02 сентября 2011

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

Существует множество причин, по которым вы должны просто использовать существующую БД:

  • Ваш код будет менее проверен и, следовательно, с большей вероятностью будет иметь ошибки.
  • Ваш код будет менее оптимизирован и, вероятно, будет работать хуже. (Вы планировали внедрить оптимизатор запросов и механизм индексирования для повышения производительности, верно?)
  • Ваш код не будет иметь столько функций (блокировка, ограничения, триггеры, резервное копирование / восстановление, язык запросов и т. Д.)
  • Существует множество бесплатных опций СУБД, поэтому использование существующей системы может оказаться даже дешевле, чем тратить время на написание более низкой системы.

Тем не менее, если это просто академическое упражнение, сделайте это. Однако я бы не стал делать это для реальной системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...