Как читать текстовый файл построчно и хранить его в базе данных в SQL server
У меня есть модуль, который загружает отчет, а затем хранится в базе данных в sql server. Теперь я придумал этот код для чтения файла .txt строка за строкой.
Вот настоящий текстовый файл, в каждом конце записи есть символ конца, который я пытаюсь поместить сюда, но он не может захватить.
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 ANG.2.0.0 Unt 3.00 (Magenta) CT200542 AP/DCC4400/430 ANG.2.0.0 Unt 6.00 end symbol Subinventory: NEI-OLO Description: Non-Equipment Inventory of Olongapo Item Description Rev Locator UOM Quantity -------------------------- --- ------------------------- --- ---------------- CT350769 DC-III 3007/2007 PC 7.00 CT350851 AP/DC-IV C5570 PC 2.00 Cartridge (1 piece) end symbol
Что я уже пробовал:
Я поставил какое - то условие в своем для каждого файла. Теперь условие читает каждую строку, с чего начать чтение и где закончить, а затем добавляет каждую строку в мою таблицу данных, она циклически повторяется до тех пор, пока lStart = FALSE, но у меня есть ошибка в моем условии, если запись достигла конечного символа lSTart = False, она должна снова циклически повторяться, чтобы найти "элемент", но вместо этого она снова читает каждую строку.
По-видимому,символ не может захватить здесь, но в visual studio он может это сделать.
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
После чтения всех данных мне нужен XMLData, чтобы записать это в базу данных в sql server. Поэтому у меня есть хранимая процедура для этого. Он еще не работает, потому что ошибка на моем для каждого условия.
Вот и весь код:
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
Я ценю ваше предложение и помощь, не стесняйтесь исправлять мои коды. Спасибо
Graeme_Grant
"Это еще не работает, потому что ошибка на моем для каждого условия."
В чем же ошибка? На какой линии это происходит?
Вы посмотрели, что говорит вам сообщение об ошибке? Вы уже погуглили его? Вы понимаете, о чем говорит вам сообщение об ошибке?
Member 13661245
Я поставил какое - то условие в своем для каждого файла. Теперь условие считывает каждую строку с чего начать чтение и где закончить а затем добавляет каждую строку в мой datatable,
если sline <> "", то он будет зацикливаться на If lStart = True, он будет читать или находить sline = "Item", а затем начнет читать каждую строку и добавлять строку в мой datatable до конечного символа. Я поставил некоторое условие, если lStart = "ending symbol", то lstart будет ложным, и он должен снова начать находить sline = 'Item', но вместо этого он непрерывно читает каждую строку, и моя ошибка заключается в том, что он читает заголовок на моем datatable, который в каждой таблице данных я устанавливаю подстроку.
Graeme_Grant
В чем же ошибка? На какой линии это происходит?
Member 13661245
Если слайн.TrimStart.TrimEnd = "" Тогда
старт = ложь
конец, если
Поскольку код не может идентифицировать конечный символ, он непрерывно зацикливается и читает также заголовок. Что привело меня к ошибке в длине строки, потому что у меня есть только 6 строк.
Graeme_Grant
Значит, это логическая ошибка, а не ошибка времени выполнения. Смотрите Решение ниже.