【发布时间】: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