将数据从 MS Access 导入文本文件
Import data from MS Access to a Textfile
我正在尝试将一些数据从 MS Access 导入到文本文件中。 Access 数据库有 3 列。学生姓名、作业名称和分数。但是当我执行以下代码时,数据是这样的:
John Cena
John Cena Assignment Submission System
JohnCenaMNUAssignment Submission System75
JohnCenaMNUAssignment Submission System75
Mark
MarkGussing Game
MarkGussing Game80
MarkGussing Game80
我想在学生姓名、作业名称和分数之间添加一些 space。此外,两个学生信息之间还有一条额外的线。这是我试过的代码,但没有给出预期的结果:
Private Sub DataTableToTXT()
Dim connetionString As String
Dim cnn As OleDbConnection
connetionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=.\reportcard.accdb;Persist Security Info=False"
cnn = New OleDbConnection(connetionString)
Dim dtResult As New DataTable
cnn.Open()
'Change the query
Dim dataAdap As New OleDbDataAdapter("SELECT * FROM reports", cnn)
dataAdap.Fill(dtResult)
cnn.Close()
'Change the path to your desired path
Dim exportPath As String = "D:"
Dim exportFileName As String = "data.txt"
Dim writer As New StreamWriter(exportPath + exportFileName)
Try
Dim sb As New StringBuilder
For Each row As DataRow In dtResult.Rows
sb = New StringBuilder
For Each col As DataColumn In dtResult.Columns
sb.Append(row(col.ColumnName))
writer.WriteLine(sb.ToString())
Next
writer.WriteLine(sb.ToString())
Next
Catch ex As Exception
Throw ex
Finally
If Not writer Is Nothing Then writer.Close()
End Try
End Sub
您应该删除内部循环中的 WriteLine。当您在列上循环时,该行将逐步打印 StringBuilder 的内容。完成内部循环后,您只需要一个 WriteLine
Dim writer As New StreamWriter(exportPath + exportFileName)
Try
Dim sb As StringBuilder
For Each row As DataRow In dtResult.Rows
sb = New StringBuilder
For Each col As DataColumn In dtResult.Columns
sb.Append(row(col.ColumnName))
sb.Append(" ") ' The space between columns values
' REMOVE this line
' writer.WriteLine(sb.ToString())
Next
writer.WriteLine(sb.ToString())
Next
但是,如果您的 table 不包含太多数据,您可以避免在每一行都写一行并将所有输出累积在 StringBuilder 中并在循环结束时写入所有内容行
Dim sb As New StringBuilder
For Each row As DataRow In dtResult.Rows
For Each col As DataColumn In dtResult.Columns
sb.Append(row(col.ColumnName))
sb.Append(" ")
Next
sb.AppendLine()
Next
' Just one write at the end of the rows loop
writer.WriteLine(sb.ToString())
这也应该更快,因为您只访问文件系统一次而不是 n 次(其中 n 是行数)。当然,如果行数很少,真正的好处可以忽略不计。
最后,最好的方法可能是使用 string.Join and the ItemArray 属性 行。这将删除列上的内部循环并且更清晰
Dim sb As New StringBuilder
For Each row As DataRow In dtResult.Rows
sb.AppendLine(string.Join(" ", row.ItemArray))
Next
writer.WriteLine(sb.ToString())
我正在尝试将一些数据从 MS Access 导入到文本文件中。 Access 数据库有 3 列。学生姓名、作业名称和分数。但是当我执行以下代码时,数据是这样的:
John Cena John Cena Assignment Submission System JohnCenaMNUAssignment Submission System75 JohnCenaMNUAssignment Submission System75 Mark MarkGussing Game MarkGussing Game80 MarkGussing Game80
我想在学生姓名、作业名称和分数之间添加一些 space。此外,两个学生信息之间还有一条额外的线。这是我试过的代码,但没有给出预期的结果:
Private Sub DataTableToTXT()
Dim connetionString As String
Dim cnn As OleDbConnection
connetionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=.\reportcard.accdb;Persist Security Info=False"
cnn = New OleDbConnection(connetionString)
Dim dtResult As New DataTable
cnn.Open()
'Change the query
Dim dataAdap As New OleDbDataAdapter("SELECT * FROM reports", cnn)
dataAdap.Fill(dtResult)
cnn.Close()
'Change the path to your desired path
Dim exportPath As String = "D:"
Dim exportFileName As String = "data.txt"
Dim writer As New StreamWriter(exportPath + exportFileName)
Try
Dim sb As New StringBuilder
For Each row As DataRow In dtResult.Rows
sb = New StringBuilder
For Each col As DataColumn In dtResult.Columns
sb.Append(row(col.ColumnName))
writer.WriteLine(sb.ToString())
Next
writer.WriteLine(sb.ToString())
Next
Catch ex As Exception
Throw ex
Finally
If Not writer Is Nothing Then writer.Close()
End Try
End Sub
您应该删除内部循环中的 WriteLine。当您在列上循环时,该行将逐步打印 StringBuilder 的内容。完成内部循环后,您只需要一个 WriteLine
Dim writer As New StreamWriter(exportPath + exportFileName)
Try
Dim sb As StringBuilder
For Each row As DataRow In dtResult.Rows
sb = New StringBuilder
For Each col As DataColumn In dtResult.Columns
sb.Append(row(col.ColumnName))
sb.Append(" ") ' The space between columns values
' REMOVE this line
' writer.WriteLine(sb.ToString())
Next
writer.WriteLine(sb.ToString())
Next
但是,如果您的 table 不包含太多数据,您可以避免在每一行都写一行并将所有输出累积在 StringBuilder 中并在循环结束时写入所有内容行
Dim sb As New StringBuilder
For Each row As DataRow In dtResult.Rows
For Each col As DataColumn In dtResult.Columns
sb.Append(row(col.ColumnName))
sb.Append(" ")
Next
sb.AppendLine()
Next
' Just one write at the end of the rows loop
writer.WriteLine(sb.ToString())
这也应该更快,因为您只访问文件系统一次而不是 n 次(其中 n 是行数)。当然,如果行数很少,真正的好处可以忽略不计。
最后,最好的方法可能是使用 string.Join and the ItemArray 属性 行。这将删除列上的内部循环并且更清晰
Dim sb As New StringBuilder
For Each row As DataRow In dtResult.Rows
sb.AppendLine(string.Join(" ", row.ItemArray))
Next
writer.WriteLine(sb.ToString())