Member 13661245 Ответов: 1

Чтение текстового файла затем разбиение его на части и хранение в SQL server VB .NET


Итак, у меня есть текстовый файл с расширением по умолчанию .txt. Вот настоящий файл. (Табуляция Разделена)

<pre>Item         Description               Rev  Locator               UOM     Quantity
003R94662        Colotech Plus                   ANG.2.0.0             PC          8.00
004E13450        PLATEN CUSHION                  ANG.2.0.0             PC          1.00
004K02371        CUSHION ASSY-PLATEN             ANG.2.0.0             PC          1.00
005R00712        DC5000 Cyan Developer           ANG.2.0.0             PC          1.00
005R00713        DC5000 Magenta Developer        ANG.2.0.0             PC          1.00



Мне нужно прочитать текстовый файл, а затем разделить его на 6 столбцов (Item, Description, Rev, Locator, UOM и Quantity), и когда он будет прочитан, а затем разделен, он должен храниться в моей таблице в sql server.

Спасибо за ваше внимание. У меня есть некоторый опыт работы с кодом, но я просто не знаком с работой с текстовыми файлами и с того, как начать. Я видел какой-то пример и пытался, но не смог получить правильные результаты.

Что я уже пробовал:

У меня есть кнопка для загрузки текстового файла.

Вот код, который я пробовал

<pre>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

                    Dim dv_ As New DataView : dv_ = TryCast(Session("dbCache_DataType"), DataView)
                    dv = New DataView : dv = TryCast(Session("dbCache_FC_Template_ID"), DataView)

                    Dim col As String() = dv.Table.Rows(0).Item(0).ToString.Split("|")

                    'Read Line in Text File

                    Dim fileEntries As New ArrayList()

                    If Not File.Exists(sFileName) Then
                        Exit Sub
                    End If

                    Try
                        ' Read the file into a list...
                        Dim reader As StreamReader = New StreamReader(sFileName)
                        fileEntries.Clear()

                        Do Until reader.Peek = -1 'Until eof
                            fileEntries.Add(reader.ReadLine)
                        Loop

                        reader.Close()

                    Catch ex As Exception
                        ' The file's empty.
                    End Try

                    ' Now we have the whole file in a list(Array)
                    Dim Item As New ArrayList()
                    Dim Description As New ArrayList()
                    Dim Rev As New ArrayList()
                    Dim Locator As New ArrayList()
                    Dim UOM As New ArrayList()
                    Dim Quantity As New ArrayList()

                    For Each line As String In fileEntries
                        If line.Substring(0, 5) <> "Index" Then
                            If line.Substring(0, 7) <> "Cluster" Then
                                line = line.Replace("    ", " ") 'space
                                line = line.Replace("   ", " ")

                                Dim parts() As String = Split(line, "\t")

                                ' Add the data to your lists:
                                Try
                                    Item.Add(parts(1))
                                    Description.Add(parts(2))
                                    Rev.Add(parts(3))
                                    Locator.Add(parts(4))
                                    UOM.Add(parts(5))
                                    Quantity.Add(parts(6))

                                Catch ex As Exception
                                    ' If this fials, we're not where we want to be in the file anyway.
                                End Try

                            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("@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

Laiju k

это файл в каком-то формате по умолчанию, например .txt/.docx -что ?

или мы можем использовать любые файлы .Пожалуйста, предоставьте больше информации, чтобы люди могли помочь.

Member 13661245

файл @laiju находится в формате по умолчанию .txt (текстовый документ)

PIEBALDconsult

Вы пробовали BCP ?

Member 13661245

Нет, я не знаком с BCP.

Maciej Los

Можете ли вы опубликовать точную форму ваших данных? Что такое разделитель (пробел или табуляция)?

Member 13661245

Привет, Я обновляю свой вопрос и примерные данные, которые я генерирую. Это текстовый файл с разделителями табуляций

Richard MacCutchan

Я объяснил, как это сделать, в вашем посте с тем же вопросом вчера.

Member 13661245

Да, я последовал вашему предложению, но все еще не получил правильного ответа. Я не могу загрузить свой текстовый файл.

Richard MacCutchan

Я не понимаю. В вашем вчерашнем посте был код, который загружал текстовый файл и разбивал каждую строку на отдельные поля. Почему вы не можете сделать это сейчас?

Member 13661245

да, у меня есть код, но, как я уже сказал, он не загружается в мою базу данных.

Richard MacCutchan

Ну, это не имеет никакого отношения к чтению текстовых файлов. Покажите нам код, который вы должны добавить в базу данных, и объясните, в чем заключается проблема.

Member 13661245

и именно по этой причине мой вопрос сейчас заключается в том, как хранить в базе данных sql server

Richard MacCutchan

Ну, вчера у вас тоже был какой-то SQL-код. Как я уже предлагал, пожалуйста, отредактируйте свой вопрос, покажите код, который у вас есть, и объясните, что именно не работает.

Member 13661245

Привет, Я обновляю свой вопрос, я также ставлю код, который я придумал. Сценарий заключается в том, что я просматриваю текстовый файл и нажимаю кнопку "Загрузить". Вся программа просто зависает. Я попытался поставить отладчик на кнопку click, но после загрузки файла программа просто повесила трубку.

Richard Deeming

Dim sFileName As String = FileUpload1.FileName
If Not File.Exists(sFileName) Then
    Exit Sub
End If


То FileName свойство возвращает путь - а иногда и просто имя - файла на клиенте.

Ваш код работает на сервере Даже если у вас есть файл с тем же именем пути, он почти наверняка не будет содержать то же содержимое, что и на клиенте .

Может быть появиться для работы при отладке кода в Visual Studio. Но это только потому, что в данном конкретном случае клиент и сервер-это один и тот же компьютер. Как только вы развернете свой код на реальном сервере, ваш код никогда не будет работать.

Вы можете либо сохранить загруженный файл в путь на сервере, используя элемент управления загрузкой файлов. SaveAs метод; или вы можете прочитать содержимое загруженного файла непосредственно, используя FileContent собственность.

1 Ответов

Рейтинг:
2

OriginalGriff

Если это разделенные данные - и количество вкладок - вы можете рассматривать их как CSV, и есть много читателей для тех, кто преобразует ваш файл непосредственно в DataTable.
Вот хороший пример: Быстрый читатель CSV[^]
Все, что вам нужно сделать, это сказать ему, чтобы он использовал табуляцию вместо запятой, и он должен просто прочитать ваши данные.


OriginalGriff

"но не сработало" - это самый бесполезный отчет об ошибке, который вы можете дать: он ничего нам не говорит!
Что он сделал такого, чего вы не ожидали, или не сделали того, что вы сделали?
Что отладчик показал вам, что происходит?
Какие данные вы ему скормили? Откуда ты знаешь, что это не сработало?
Были ли какие-нибудь сообщения об ошибках?

Дайте нам информацию для работы, а не просто сбрасывайте на нас груз кода и говорите: "это не работает".

Member 13661245

мой код работает над чтением текстового файла, а затем разбивает его, я помещаю какое-то сообщение при загрузке в базу данных, но для загрузки требуется время, пока программа не повесит трубку.

Я загружаю свои образцы данных здесь, в моей программе.

OriginalGriff

А что показывает вам отладчик?
Где он висит?

Member 13661245

Он зависает на части загрузки данных в базу данных sql server.

OriginalGriff

Рискуя повторить это в третий раз:
- А что показывает тебе отладчик?"

Member 13661245

Привет, Я обновляю свой код выше. Сценарий заключается в том, что я просматриваю текстовый файл и нажимаю кнопку "Загрузить". Вся программа просто зависает. Я попытался поставить отладчик на кнопку click, но после загрузки файла программа просто повесила трубку.

OriginalGriff

Я бы не стал пользоваться ридером.Загляни вообще: посмотри на файл.ReadAllLines, который вернет вам массив строк, каждая из которых содержит одну строку. A для каждого в массиве даст вам каждую строку по очереди (и, вероятно, будет более эффективным).

Laiju k

после какой строки кода он вешает трубку.

Laiju k

попробуйте использовать меньше данных вместо того, чтобы использовать объемную одну или две строки-это просто прекрасно.

Member 13661245

Я использую две строки данных вместо того, чтобы загружать все. Я уже вешаю трубку, читая файл .txt.

Laiju k

можете ли вы быть более конкретным, например, после какой строки кода он повесит трубку?Это будет проще, чтобы получить представление, что может быть не так.

Member 13661245

При нажатии на кнопку Загрузить, если будет личность, если файл имеет расширение .txt, чтобы в основном коде в порядке до 'линии значение в текстовый файл, программу повесить здесь прочитанную строку в текстовый файл

Dim fileEntries как новый ArrayList()

Если Не Файл.Существует(sFileName), то
Выход Из Субмарины
Конец, Если

Попробуй
- Зачитайте файл в список...

Laiju k

можете ли вы попробовать это

Делайте, пока СР.Peek() > -1
Приставка.Метода WriteLine(СР.С readline())
Петля

вместо этого

Делай пока читатель.Peek = -1 'до eof
fileEntries.Добавить(reader.ReadLine)
Петля