VB. net Заполнение таблицы данных текстовым файлом - PullRequest
1 голос
/ 01 августа 2020

Я делаю себе менеджер паролей и храню все данные локально в текстовом файле. На данный момент я не беспокоюсь о безопасности, просто пытаюсь заставить его работать.

Я могу нормально читать текстовый файл и разделять каждую из моих записей запятыми, но я не могу понять, как чтобы правильно отформатировать мои for loop, чтобы получить их в правильном порядке

Вот как данные выглядят внутри pass.txt

Gmail,07/31/2020,password,
Facebook,07/31/2020,password,

У меня 3 столбца, Service, Last Changed и Password. В настоящее время мои данные заполняют первый столбец сверху вниз до конца моего массива splitData, а затем делают то же самое для оставшихся 2 столбцов

Я считаю, что мне нужен вложенный for loop в моем существующий, но застрял на логи c

Public Class Form2

    Private thedatatable As New DataTable
    Private workDirectory = My.Computer.FileSystem.CurrentDirectory
    Private rw As System.IO.StreamReader
    Private fileContents As String
    Private splitData As String()

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        With thedatatable
            .Columns.Add("Service", System.Type.GetType("System.String"))
            .Columns.Add("Last Changed", System.Type.GetType("System.String"))
            .Columns.Add("Password", System.Type.GetType("System.String"))
        End With

        workDirectory += "\pass.txt"
        rw = My.Computer.FileSystem.OpenTextFileReader(workDirectory)
        fileContents = rw.ReadToEnd()
        splitData = fileContents.Split(New Char() {","c}) REM reads pass.txt 
REM to string array while splitting at commas

        Dim word As String
        For Each word In splitData      REM iterates for each split word
            Dim newrow As DataRow = thedatatable.NewRow
            newrow("Service") = word
            newrow("Last Changed") = word
            newrow("Password") = word
            thedatatable.Rows.Add(newrow)
        Next

        DataGridView1.DataSource = thedatatable

    End Sub
End Class

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Поскольку он может вам понадобиться, вот пример, по которому вы можете сохранить свои данные как JSON.

► Если вы не используете. Net Core 3.0+ (который предоставляет свой собственный System.Text. Json - когда вы перейдете на. Net Core, переключитесь на это, не задумываясь), я предлагаю установить Json. Net:

  • Откройте диспетчер пакетов NuGet в Visual Studio (Tool -> NuGet Package Manager -> Manage NuGet Packages for Solution)
  • найдите Newtownsoft.Json. Первой записью на эту дату будет Newtownsoft.Json v.12.0.3.
  • Выберите установку пакета, создайте решение.

Теперь, чтобы сериализовать DataTable, вам нужна одна команда :

Dim json as String = JsonConvert.SerializeObject([Your DataTable])

Для десериализации данных, преобразования JSON в DataTable, еще одна команда:

Dim dt = JsonConvert.DeserializeObject(Of DataTable)([JSON String])
  • Они реализуются в коде двумя способами: SaveMyPasswords() и LoadMyPasswords(). Вам просто нужно указать путь, по которому хранится JSON.

Путь, где хранятся данные, является важным вопросом. Вы можете сделать разные варианты:

  • часто используется папка User [User]\AppData\Local. Это местоположение возвращается Application.LocalUserAppDataPath.
  • раздел [User]\AppData\Roaming возвращается Application.UserAppDataPath.
  • Папка \ProgramData - хороший вариант, это путь возвращается как Application.CommonAppDataPath

Обратите внимание, что эти пути уже содержат подпапки, названные в честь вашей сборки (Product или Company + имя сборки + версия). В этом коде я использую Application.CommonAppDataPath. Выберите то, что вы считаете подходящим для вашего сценария.

  • Я бы не стал (пытаться) хранить данные в пути к исполняемому файлу, вы можете обнаружить, что у вас нет прав доступа для записи данных туда. Конечно, вы можете предложить пользователю указать путь к хранилищу (с помощью SaveFileDialog или FolderBrowserDialog). Это еще один возможный выбор.

При первом запуске приложения этого пути не будет, но он будет создан, как только вы сохраните свои данные в этом месте: Файл. WriteAllText () , например, создает полный путь к файлу, если он еще не существует.

Обработчик btnSaveData.Click вызывает SaveMyPasswords() для сериализации и сохранения данных.

Предположим, что ваш DataTable построен ~ как в вашем OP (но дата является объектом DateTime):

Private theDataTable As DataTable

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim dataPath = Path.Combine(Application.CommonAppDataPath, "myPasswords.json")
    theDataTable = LoadMyPasswords(dataPath)

    If theDataTable Is Nothing Then
        theDataTable = New DataTable("MyPassowrds")
        theDataTable.Columns.AddRange({
            New DataColumn("Service", GetType(String)),
            New DataColumn("Last Changed", GetType(Date)),
            New DataColumn("Password", GetType(String))
        })
    End If
    DataGridView1.DataSource = theDataTable
End Sub

Private Sub btnSaveData_Click(sender As Object, e As EventArgs) Handles btnSaveData.Click
    Dim dataPath = Path.Combine(Application.CommonAppDataPath, "myPasswords.json")
    SaveMyPasswords(dataPath, theDataTable)
End Sub

Private Function LoadMyPasswords(dataPath As String) As DataTable
    If File.Exists(dataPath) Then
        Return JsonConvert.DeserializeObject(Of DataTable)(File.ReadAllText(dataPath))
    End If
    Return Nothing
End Function

Private Sub SaveMyPasswords(dataPath As String, data As DataTable)
    File.WriteAllText(dataPath, JsonConvert.SerializeObject(data))
End Sub
1 голос
/ 01 августа 2020

Быстрый пример использования ReadLines() и String.Split():

Dim FileName As String = System.IO.Path.Combine(workDirectory, "pass.txt")
For Each line As String In System.IO.File.ReadLines(FileName)
    Dim values() As String = line.Split(",".ToCharArray)
    If values.Length >= 3 Then
        Dim newrow As DataRow = thedatatable.NewRow
        newrow("Service") = values(0)
        newrow("Last Changed") = values(1)
        newrow("Password") = values(2)
        thedatatable.Rows.Add(newrow)
    End If
Next
...