Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.net用文本文件填充数据表_Vb.net_Datatable_Text Files - Fatal编程技术网

VB.net用文本文件填充数据表

VB.net用文本文件填充数据表,vb.net,datatable,text-files,Vb.net,Datatable,Text Files,我正在为自己制作一个密码管理器,并将所有数据本地存储在一个文本文件中。目前我并不担心安全问题,只是想让它发挥作用 我可以很好地读取文本文件,并用逗号分割每个条目,但我不知道如何正确设置循环的格式,以使它们按正确的顺序排列 下面是pass.txt中数据的外观 Gmail,07/31/2020,password, Facebook,07/31/2020,password, 我有3列,服务,上次更改,和密码。当前,“我的数据”从上到下填充第一列,直到数组的末尾splitData,然后对其余两列执行相

我正在为自己制作一个密码管理器,并将所有数据本地存储在一个文本文件中。目前我并不担心安全问题,只是想让它发挥作用

我可以很好地读取文本文件,并用逗号分割每个条目,但我不知道如何正确设置循环的
格式,以使它们按正确的顺序排列

下面是
pass.txt中数据的外观

Gmail,07/31/2020,password,
Facebook,07/31/2020,password,
我有3列,
服务
上次更改
,和
密码
。当前,“我的数据”从上到下填充第一列,直到数组的末尾
splitData
,然后对其余两列执行相同的操作

我的想法是我需要一个嵌套的
for循环
,但我仍然停留在逻辑上

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

使用
ReadLines()
String.Split()


由于您可能需要它,下面是一个示例,您可以按照它将数据存储为JSON

► 如果您没有使用.Net Core 3.0+(它提供了自己的功能-当您要使用.Net Core时,请立即切换到该功能),我建议您安装:

  • 打开Visual Studio的NuGet软件包管理器(
    工具->NuGet软件包管理器->管理解决方案的NuGet软件包
  • 搜索
    Newtownsoft.Json
    。此时,第一个条目将是Newtownsoft.Json v.12.0.3
  • 选择安装软件包,生成解决方案
  • 现在,要序列化DataTable,需要一个命令:

    Dim json as String = JsonConvert.SerializeObject([Your DataTable])
    
    Dim dt = JsonConvert.DeserializeObject(Of DataTable)([JSON String])
    
    要反序列化数据,将JSON转换为DataTable,请执行另一个命令:

    Dim json as String = JsonConvert.SerializeObject([Your DataTable])
    
    Dim dt = JsonConvert.DeserializeObject(Of DataTable)([JSON String])
    
    • 这些在代码中通过两种方法实现:
      SaveMyPasswords()
      LoadMyPasswords()
      。您只需要指定存储JSON的路径
    存储数据的路径是一个重要问题。您可以做出不同的选择:

    • 通常使用用户
      [User]\AppData\Local
      文件夹。此位置由
      应用程序返回。LocalUserAppDataPath
    • [User]\AppData\Roaming
      部分由
      应用程序返回。UserAppDataPath
    • \ProgramData
      文件夹是一个不错的选择,此路径由
      应用程序返回。CommonAppDataPath
    请注意,这些路径已包含以程序集命名的子文件夹(
    产品
    公司
    +程序集名称+版本)。在这段代码中,我使用的是
    应用程序.CommonAppDataPath
    。选择您认为适合您的场景的任何内容

    • 我避免(尝试)将数据存储在可执行文件的路径中,您可能会发现您没有在那里写入数据的访问权限。当然,您可以提示用户提供存储路径(使用SaveFileDialog或FolderBrowserDialog)。这是另一种可能的选择
    当您第一次运行应用程序时,此路径将不存在,但将在您将数据保存到此位置时立即创建此路径:,例如,如果文件尚不存在,则创建文件的完整路径

    btnSaveData。单击处理程序调用
    SaveMyPasswords()
    序列化并存储数据

    假设您的数据表是在OP中构建的(但日期是DateTime对象):


    为什么不改用JSON格式呢?因此,您可以在一个命令中反序列化/序列化所有DataTable内容。顺便说一句,避免这样:
    workDirectory=My.Computer.FileSystem.CurrentDirectory
    和这样:
    workDirectory+=“\pass.txt”
    。否则,迭代而不是这样做:
    My.Computer.FileSystem.OpenTextFileReader(…).ReadToEnd()
    ,因为我从未使用过JSON,也不知道它的用途。另外,为什么
    workDirectory+=
    不好?我知道它很刺耳,但真的很糟糕@JimiThe“坏”部分是手动尝试将反斜杠合并到路径中,如果路径中已有反斜杠,则可能会出现多个反斜杠。您应该使用:
    Dim FileName作为String=System.IO.Path.Combine(workDirectory,“pass.txt”)
    ,然后它将为您处理这些反斜杠。有关更多信息,请参阅。另外,我不知道如何实现您的建议@Jimi。虽然闲置,但还是有意义的,谢谢。左右撞上了路障。我将为文本文件提供一些内容,感谢@JimiThank you的帮助,因为它提供了详细的格式回复。每当有人读到这条评论,就要更像这个家伙^。