将数据从 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())