Member 13661245 Ответов: 1

Как читать текстовый файл построчно и хранить его в базе данных в 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

Значит, это логическая ошибка, а не ошибка времени выполнения. Смотрите Решение ниже.

1 Ответов

Рейтинг:
1

Graeme_Grant

Вот исправление логической ошибки для вас для идентификации позиций строк:

Dim isLineCapture = False

For Each line In IO.File.ReadAllLines(FileUpload1.PostedFile.FileName) _
                        .Select(Function(x) x.TrimStart())

    If isLineCapture AndAlso item.StartsWith("end symbol") Then
        ' stop processing immediately
        isLineCapture = False
    End If

    If isLineCapture Then
        ' process lines here
    End If

    If Not isLineCapture Then
        ' start processing from next line
        isLineCapture = item.StartsWith("---")
    End If

Next


Member 13661245

@Graeme_Grant спасибо, я думаю, что знаю, что случилось, он не прочитал мой символ конца. ♀ есть ли какой-нибудь специальный читатель символов?