VB хранить список записей в текстовом файле и читать обратно - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть программа VB в VS2017. Он читает много файлов Excel и сохраняет соответствующие данные в Dim total_sessions As New List(Of Session_CSV_file) Большой список (~ 10 КБ) и включает в себя около 20 полей каждое.

Есть ли способ в VB сохранить его в файле в одной команде и прочитать его позже легко., не читая и не записывая каждое поле?

Часто мне нужно отлаживать более позднюю часть. Я предпочитаю делать это без перезапуска всей первой части. Или в Visual Studio есть способ остановить запуск в определенной точке и сохранить эту точку в файле дампа, как это часто делают симуляторы? (чтобы потом можно было запустить симуляцию с этого момента)

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Добавьте атрибут Serializable к классу. Я добавил параметризованный конструктор для облегчения построения моего списка, но вы должны предоставить конструктор без параметров, чтобы это работало. Таким образом, пустое Sub New.

<Serializable()>
Public Class Session_CSV_file

    Public Property ID As Integer
    Public Property Name As String
    Public Property Type As String

    Public Sub New()

    End Sub

    Public Sub New(SessID As Integer, SessName As String, SessType As String)
        ID = SessID
        Name = SessName
        Type = SessType
    End Sub

End Class

Добавление Imports System.Xml.Serialization в начало файла.

Private Sub SaveList()
    Dim serializer = New XmlSerializer(GetType(List(Of Session_CSV_file)))
    Using writer As New StreamWriter("C:\Users\xxx\Documents\XMLtest.xml")
        serializer.Serialize(writer, lst)
    End Using
End Sub

Я заполнил свой список следующим образом, но вы можете заполнить свой список любым способом, который вы выберете.

Private lst As New List(Of Session_CSV_file)

Private Sub FillList()
    Using cn As New SqlConnection(My.Settings.CoffeeConnection),
            cmd As New SqlCommand("Select Top 10 * From Coffees;", cn)
        cn.Open()
        Dim reader = cmd.ExecuteReader
        While reader.Read
            Dim sess As New Session_CSV_file(reader.GetInt32(0), reader.GetString(1), reader.GetString(3))
            lst.Add(sess)
        End While
    End Using
End Sub

Для воссоздания списка ... (Упс! забыл это)

Private RehydratedList As New List(Of Session_CSV_file)

Private Sub CreateListFromXML()
    Dim serial As New XmlSerializer(GetType(List(Of Session_CSV_file)))
    Using fs As New FileStream("C:\Users\maryo\Documents\XMLtest.xml", FileMode.Open)
        RehydratedList = DirectCast(serial.Deserialize(fs), List(Of Session_CSV_file))
    End Using
    For Each item In RehydratedList
        Debug.Print(item.ToString)
    Next
End Sub
0 голосов
/ 05 апреля 2020

Возможно, если вместо этого вы загрузите данные CSV в DataTable:

Dim dt as New DataTable
dt.Columns.Add("Name")
dt.Columns.Add("Age", GetType(Int32))

For Each filepath in tenKFilePaths

  For Each line in File.ReadAllLines(file)

    Dim bits = line.Split(","c)

    dt.Rows.Add(bits(0), Convert.ToInt32(bit(1))

  Next line
Next filepath 

Тогда вы сможете сохранить весь лот до xml:

dt.WriteXml("c:\temp\my.xml")

Выпить кофе, перезагрузиться et c прочитайте их снова и продолжайте с того места, где вы остановились:

Dim dt2 as New DataTable
dt2.ReadXml("c:\temp\my.xml")

С необработанными таблицами данных работать немного сложнее, потому что в итоге вы получаете доступ к их строкам и данным столбцов с помощью индексации строк и приходится много разыгрывать - довольно хромая. Есть лучший способ их использования, так как Visual Studio может создавать пользовательские классы, которые наследуются от базовых таблиц данных и предлагают множество функциональных возможностей, которые устраняют всю неловкость при работе с таблицами данных как очень общая вещь c. Так же, как дизайнер форм создает форму пользовательского интерфейса, которая наследуется от формы, дизайнер наборов данных создает настраиваемые таблицы данных, которые наследуются от базы

Если вы добавляете в проект новый объект типа DataSet, дважды щелкните его, чтобы открыть что-то вроде дизайнер баз данных. Щелкните правой кнопкой мыши по этой поверхности и выберите «Добавить DataTable», «Добавить столбцы» с соответствующими им типами данных и т. Д. c - это эквивалент вашего класса Session_Csv_File с его свойствами и полями. Дважды щелкните по нему, и вы можете добавить код et c - если ваш session_csv_file имеет пользовательские методы, вы можете перенести их код в строку пользовательских данных

Представьте, что я создал новый объект данных в DataSet и назвал его SessionCsvFiles. Представьте себе, что я добавил столбец «Имя и возраст» и добавил пользовательский метод BlahBlah

. Тогда я мог бы сказать в коде такие вещи, как:

Dim dt as New MyCustomDataSet.SessionCsvFilesDataTable

'it's like making a new SessionCsvFile
Dim r = dt.NewSessionCsvFilesRow()


'It's like setting your properties
 r.Name = csvBits(0)
 r.Age = Convert.ToInt32(csvBits(1))

'It's like adding your file to the List
dt.Add(r)

Теперь у вас есть практически то же самое, что у вас было раньше - набор объектов, представляющих вещи о ваших CSV-файлах. Разница в том, что в этом маршруте уже есть встроенный способ сохранения всех свойств и коллекции в xml и повторного чтения

...