【问题标题】:How Read .text file line by line and the stored in database in sql server如何逐行读取.text文件并存储在sql server的数据库中
【发布时间】:2024-01-13 00:11:01
【问题描述】:

我有一个模块可以上传报告,然后存储在 sql server 的数据库中。现在我想出了这段代码来逐行读取 .txt 文件。

Protected Sub ibtnTxtUpload_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs)
    Dim jsbldr As New StringBuilder
    Try
        If FileUpload1.HasFile Then

            Dim Extension As String = Path.GetExtension(FileUpload1.PostedFile.FileName)

            If Extension = ".txt" Then

                Dim Request_Val As String = ""

                Dim sFileName As String = FileUpload1.FileName


                'Read Line by Line

                Using sRead As New StreamReader(FileUpload1.PostedFile.FileName)
                    sFileName = sRead.ReadToEnd
                End Using

                Dim sFileLines() As String = sFileName.Split(vbCrLf)

                'Trim the line
                Dim dt As New DataTable("XmlData")

                dt.Columns.Add("Item", GetType(String))
                dt.Columns.Add("Description", GetType(String))
                dt.Columns.Add("Rev", GetType(String))
                dt.Columns.Add("Locator", GetType(String))
                dt.Columns.Add("UOM", GetType(String))
                dt.Columns.Add("Quantity", GetType(Double))

                Dim writer As New StringWriter
                Dim sline As String

                Dim i As Integer = 0
                Dim lStart As Boolean = False

                For Each sline In sFileLines

                    If sline.TrimStart.TrimEnd <> "" Then

                        If lStart = True Then

                            If sline.Substring(0, 10).TrimStart.TrimEnd <> "-------" Then

                                Dim newRow As DataRow = dt.NewRow

                                newRow("Item") = sline.Substring(0, 32).TrimStart.TrimEnd
                                newRow("Description") = sline.Substring(33, 53).TrimStart.TrimEnd
                                newRow("Rev") = sline.Substring(86, 3).TrimStart.TrimEnd
                                newRow("Locator") = sline.Substring(89, 26).TrimStart.TrimEnd
                                newRow("UOM") = sline.Substring(115, 3).TrimStart.TrimEnd
                                newRow("Quantity") = sline.Substring(124, 7).TrimStart.TrimEnd

                                dt.Rows.Add(newRow)

                            End If

                        End If

                        If sline.Substring(0, 32).TrimStart.TrimEnd = "Item" Then
                            lStart = True
                        End If

                        If sline.TrimStart.TrimEnd = "" Then
                            lStart = False
                        End If
                    End If


                Next


                'Execute SQL Stored Procedure
                Using cn As New SqlConnection(cls.strConnString)

                    Using cmd As New SqlCommand()

                        With cmd

                            .CommandType = CommandType.StoredProcedure
                            .CommandText = "USP_XML_SOH_ACCOUNT_MAINT"
                            .Parameters.Add("@XMLdata", SqlDbType.Xml) : .Parameters("@XMLdata").Value = writer.ToString
                            .Parameters.Add("@USR_ID", SqlDbType.VarChar, 30) : .Parameters("@USR_ID").Value = cls.GetUserName
                            .Parameters.Add("@FILE_NAME", SqlDbType.VarChar, 255) : .Parameters("@FILE_NAME").Value = sFileName
                            .Parameters.Add("@RET_VAL", SqlDbType.VarChar, 255)
                            .Parameters("@RET_VAL").Direction = ParameterDirection.Output

                            .Connection = cn
                            cn.Open()

                            .ExecuteNonQuery()

                            Request_Val = .Parameters("@RET_VAL").Value.ToString

                        End With

                    End Using

                End Using


                Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "Javascript", "<script>$(document).ready(function(){$('#grid-div').height(250);$.blockUI({message: 'Updating data...',css: {border: 'none',padding: '15px', width: '15%', left: '40%',backgroundColor: '#000','-webkit-border-radius': '10px','-moz-border-radius': '10px',opacity: .5,color: '#fff'}});setTimeout($.unblockUI, 2000); " & _
               " $('#dialog-message').html('<table style=""border-style:hidden;""><tr><td style=""padding:5px;""> <img src=""images/gridview/check_circle_64x64.png""/></td><td>" & Request_Val.ToString & "</td></tr></table>');" & _
               "$('div#dialog-message').dialog ({ my: 'center', at: 'center', of: window}).prev ().find ('.ui-dialog-titlebar-close').hide(); " & _
               "var varCounter = 0; var varName = function(){ if(varCounter < 1){ varCounter++; $('#dialog-message').dialog('open'); } else {clearInterval(varName);}};setInterval(varName, 2000);}); </script>")

            Else

                jsbldr.Append("<script>")
                jsbldr.Append("$(document).ready(function(){")
                jsbldr.Append("$('div#dialog-message').dialog ({ my: 'center', at: 'center', of: window}).prev ().find ('.ui-dialog-titlebar-close').hide();")
                jsbldr.Append("$('#dialog-message').html('<table style=""border-style:hidden;""><tr><td style=""padding:5px;""> <img src=""images/gridview/exclamation_circle_64x64.png""/></td><td>Invalid file format, please use .xlsx excel file extention.</td></tr></table>');")
                jsbldr.Append("$('#dialog-message').dialog('open');")
                jsbldr.Append("});")
                jsbldr.Append("</script>")
                Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "Javascript", jsbldr.ToString)

            End If

        End If

    Catch ex As Exception

        jsbldr.Append("<script>")
        jsbldr.Append("$(document).ready(function(){")
        jsbldr.Append("$('div#dialog-message').dialog ({ my: 'center', at: 'center', of: window}).prev ().find ('.ui-dialog-titlebar-close').hide();")
        jsbldr.Append("$('#dialog-message').html('<table style=""border-style:hidden;""><tr><td style=""padding:5px;""> <img src=""images/gridview/exclamation_circle_64x64.png""/></td><td>Uploading SOH Account file template encounter error, please check the file.</td></tr></table>');")
        jsbldr.Append("$('#dialog-message').dialog('open');")
        jsbldr.Append("});")
        jsbldr.Append("</script>")
        Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "Javascript", jsbldr.ToString)

    End Try

End Sub

这是实际的文本文件,在记录的每一端都有一个结束符号,我试图放在这里但它无法捕获。

  Item                          Description                                         Rev Locator                   UOM     Quantity
  -------------------------------------------------------------------------------   --- ------------------------- --- ------------
  604K23660                      KIT-FDR HCF MSI                                        ANG.2.0.0                 PC          1.00

  604K23670                      KIT FEEDER TM                                          ANG.2.0.0                 PC          3.00

  604K26021                      LEN ASSY                                               ANG.2.0.0                 PC          1.00

  CT200541                       AP/DCC4400/4300/3300/2200 Cartridge Toner              ANG.2.0.0                 Unt         3.00
                             (Magenta)
  CT200542                       AP/DCC4400/4300/3300/2200 Cartridge Toner (Yellow)     ANG.2.0.0                 Unt         6.00

 Subinventory: NEI-OLO    Description: Non-Equipment Inventory of Olongapo

  Item                          Description                                         Rev Locator                   UOM     Quantity
  -------------------------------------------------------------------------------   --- ------------------------- --- ------------
  CT350769                       DC-III 3007/2007 Drum Cartridge Standard                                         PC          7.00

  CT350851                       AP/DC-IV C5570/4470/3370/3371/2270 Long Life Drum                                PC          2.00
                             Cartridge (1 piece)

我在文件的 For Each 中设置了一些条件。现在条件读取每一行从哪里开始读取和在哪里结束,然后在我的数据表中添加每一行,它循环直到 lStart = FALSE 但如果记录到达结尾,我的条件就会出错符号 lSTart = False 然后将再次循环查找“项目”。

For Each sline In sFileLines

                If sline.TrimStart.TrimEnd <> "" Then

                    If lStart = True Then

                        If sline.Substring(0, 10).TrimStart.TrimEnd <> "-------" Then

                            Dim newRow As DataRow = dt.NewRow

                            newRow("Item") = sline.Substring(0, 32).TrimStart.TrimEnd
                            newRow("Description") = sline.Substring(33, 53).TrimStart.TrimEnd
                            newRow("Rev") = sline.Substring(86, 3).TrimStart.TrimEnd
                            newRow("Locator") = sline.Substring(89, 26).TrimStart.TrimEnd
                            newRow("UOM") = sline.Substring(115, 3).TrimStart.TrimEnd
                            newRow("Quantity") = sline.Substring(124, 7).TrimStart.TrimEnd

                            dt.Rows.Add(newRow)

                        End If

                    End If

                    If sline.Substring(0, 32).TrimStart.TrimEnd = "Item" Then
                        lStart = True
                    End If

                    If sline.TrimStart.TrimEnd = "" Then
                        lStart = False
                    End If

这是我对结束符号的条件,显然符号无法在此处捕获,但在 Visual Studio 上可以。

If sline.TrimStart.TrimEnd = "" Then
                    lStart = False
                End If

读取所有数据后,我需要一个 XMLData 将其写入 sql server 中的数据库。所以我有一个存储过程。它还没有工作,因为我的 For Each Condition 上的错误。

感谢您的建议和帮助,请随时纠正我的代码。谢谢

【问题讨论】:

  • 文本文件就像您在键盘上键入的字符串一样。正如我所见,你已经完成了。你的文本文件是什么样的?
  • @Chillzy 我编辑了我的问题,在下半部分我把我的文本文件看起来像。
  • 大声笑然后转换它! If Double.TryParse(yourstring,returnvalue)= True Then
  • 在将数据添加到表之前,请先阅读以查看下一行是什么。而不是为每个循环做一个 xcount=0 到 fileslines.count-1 的计数器......然后你可以使用索引访问你的行或在你的循环中添加一个计数器来跟踪你的行数和访问前面的一条线。这样,您可以在预先检查数据后将您的 for each 和您的数据保存到您的表格中。
  • 喜欢这个 newRow("Description") = newRow("Description") & " " & sline.Substring(33, 53).TrimStart.TrimEnd

标签: asp.net sql-server excel vb.net text-files


【解决方案1】:

我选择将它们放在一个列表中,但您可以使用一个数组。正如您似乎已经知道的那样,我不需要向您展示如何在 excel 中插入值。跳过 2 第一行或将它们作为标题插入到您的 excel 文件中。概念是一样的。

        Dim xstr As String = "007K88431                      GEAR ASSY-20/46                                        ANG.2.0.0                 PC          1.00"
        Dim xline As New List(Of String)
        xline.Add(Strings.Mid(xstr, 1, 30).Trim)
        xline.Add(Strings.Mid(xstr, 31, 56).Trim)
        xline.Add(Strings.Mid(xstr, 87, 26).Trim)
        xline.Add(Strings.Mid(xstr, 113, 4).Trim)
        xline.Add(Strings.Mid(xstr, 117).Trim)

【讨论】:

  • 这会放在“检查模板列”吗?
  • 我不明白你的问题
  • 您好,感谢您的帮助,现在我想出了一个阅读每一行的代码,但我的情况有问题。我更新了上面的代码,以便清楚。提前非常感谢
【解决方案2】:

这似乎有很多用于上传文件的多余代码!要加载相同的文本文件或 CSV,请运行以下脚本。

BULK INSERT TmpStList FROM 'c:\TxtFile1.txt' WITH (FIELDTERMINATOR = '","')

【讨论】:

  • 所以我只需要将我的扩展名更改为.txt,然后输入此代码If Extension = ".txt" Then BULK INSERT TmpStList FROM 'c:\TxtFile1.txt' WITH (FIELDTERMINATOR = '","')