使用文本文件填充 DataTable
Populating a DataTable with a Text File
我正在为自己制作一个密码管理器,并将所有数据本地存储在一个文本文件中。我现在不担心安全问题,只是想让它正常工作。
我可以很好地读取文本文件,并用逗号分隔我的每个条目,但我不知道如何正确格式化我的 for loop
以使它们按正确的顺序排列
下面是数据在 pass.txt
中的样子
Gmail,07/31/2020,password,
Facebook,07/31/2020,password,
我有 3 列,Service
、Last Changed
和 Password
。目前,我的数据从上到下填充第一列,直到我的数组 splitData
结束,然后对剩余的 2 列执行相同的操作
我的想法是我需要一个嵌套的 for loop
在我现有的 for loop
中,但我坚持逻辑
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()
'reads pass.txt to string array while splitting at commas
splitData = fileContents.Split(New Char() {","c})
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()
的快速示例:
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
由于您可能需要它,这里有一个示例,您可以按照以下示例将数据存储为 JSON。
► 如果您没有使用 .Net Core 3.0+(它提供了自己的 System.Text.Json - when you'll move to .Net Core, switch to this without a second thought), I suggest to install Json.Net:
- 打开 Visual Studio 的 NuGet 包管理器 (
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)。这是另一个可能的选择。
当您第一次 运行 您的应用程序时,此路径将不存在,但只要您将数据保存在此位置,就会创建它:例如,File.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
我正在为自己制作一个密码管理器,并将所有数据本地存储在一个文本文件中。我现在不担心安全问题,只是想让它正常工作。
我可以很好地读取文本文件,并用逗号分隔我的每个条目,但我不知道如何正确格式化我的 for loop
以使它们按正确的顺序排列
下面是数据在 pass.txt
Gmail,07/31/2020,password,
Facebook,07/31/2020,password,
我有 3 列,Service
、Last Changed
和 Password
。目前,我的数据从上到下填充第一列,直到我的数组 splitData
结束,然后对剩余的 2 列执行相同的操作
我的想法是我需要一个嵌套的 for loop
在我现有的 for loop
中,但我坚持逻辑
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()
'reads pass.txt to string array while splitting at commas
splitData = fileContents.Split(New Char() {","c})
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()
的快速示例:
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
由于您可能需要它,这里有一个示例,您可以按照以下示例将数据存储为 JSON。
► 如果您没有使用 .Net Core 3.0+(它提供了自己的 System.Text.Json - when you'll move to .Net Core, switch to this without a second thought), I suggest to install Json.Net:
- 打开 Visual Studio 的 NuGet 包管理器 (
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)。这是另一个可能的选择。
当您第一次 运行 您的应用程序时,此路径将不存在,但只要您将数据保存在此位置,就会创建它:例如,File.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