Member 11856456 Ответов: 1

Как разобрать строки richtextbox в SQL


До сих пор я могу сделать только одну строку, я хочу иметь возможность использовать несколько строк. Я хочу, чтобы он взял каждую строку и сравнил ее с текстом, поэтому, если программа найдет Last Name:, First Name:, Sex:, Race:, она возьмет символы после них и применит их к определенной ячейке базы данных sql. пока что он будет выделять только фамилию:, но у меня есть имя: пытаюсь вытащить другую информацию. Кроме того, я хотел бы сделать это там, где текст не должен быть чувствителен к регистру.

вот что у меня есть:

Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load


        RichTextBox1.Text = "last Name: Samson
First Name: Jeff
Race: W
Sex: M"

        Try

            Dim sqlcon As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=c:\users\jj\documents\visual studio 2015\Projects\WindowsApplication3\WindowsApplication3\Database1.mdf;Integrated Security=True")
            Dim sqladapt = New SqlDataAdapter("Select * from " + "[" + Form1.TreeView1.SelectedNode.Text.ToString, sqlcon)

            sqlcon.Open()
            Dim cmd As SqlClient.SqlCommand
            Dim sql As String = "insert into " + "[" + Form1.TreeView1.SelectedNode.Text.ToString + "]" + "values(@id,@Last,@First,@Sex,@Race)"
            cmd = New SqlClient.SqlCommand(sql, sqlcon)

            ' Make sure that all tables have the same type of information that can be entered, if not you will recieve an error.
            cmd.Parameters.AddWithValue("@id", Form1.IdTextBox.Text)


            cmd.Parameters.AddWithValue("@Last", RichTextBox1.Text.Replace("last Name: ", RichTextBox1.Text.Substring(11)))




            cmd.Parameters.AddWithValue("@First", RichTextBox1.Text.Replace("First Name: ", RichTextBox1.Text.Substring(12)))
            cmd.Parameters.AddWithValue("@Sex", Form1.SexTextBox.Text())
            cmd.Parameters.AddWithValue("@Race", Form1.RaceTextBox.Text)



            cmd.ExecuteNonQuery()
            sqlcon.Close()

            MessageBox.Show("New Record Added")
        Catch ex As Exception
            MsgBox(ex.Message)

            End Try



    End Sub


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

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

1 Ответов

Рейтинг:
8

Richard Deeming

Извлечение значимых значений из текста в свободной форме, как известно, очень сложно.

Если вы абсолютно уверены, что каждое значение будет находиться в отдельной строке, что строка будет начинаться с правильной метки, а метка и значение будут разделены двоеточием, то вы вероятно уметь пользоваться регулярное выражение[^] для извлечения значений.

Dim lastName As String = Nothing, firstName As String = Nothing, race As String = Nothing, sex As String = Nothing

Dim pattern As New Regex("^\s*(?<label>[^:]+)\s*:\s*(?<value>.+)\s*\r?$", RegexOptions.Multiline)

Dim matches As MatchCollection = pattern.Matches(RichTextBox1.Text)

For Each match As Match In matches
    Dim label As String = match.Groups("label").Value
    If String.Equals(label, "Last Name", StringComparison.OrdinalIgnoreCase) Then
        lastName = match.Groups("value").Value
    Else If String.Equals(label, "First Name", StringComparison.OrdinalIgnoreCase) Then
        firstName = match.Groups("value").Value
    Else If String.Equals(label, "Race", StringComparison.OrdinalIgnoreCase) Then
        race = match.Groups("value").Value
    Else If String.Equals(label, "Sex", StringComparison.OrdinalIgnoreCase) Then
        sex = match.Groups("value").Value
    End If
Next


Richard Deeming

Вам нужно будет добавить следующую строку в верхнюю часть файла кода:
Imports System.Text.RegularExpressions

Member 11856456

Ричард, похоже, этот код работает. Мне нужно добавить автоматическое приращение к миксу для столбца ID, чтобы убедиться наверняка. Быстрый вопрос: будет ли это переходить в следующую строку после перерыва, такого как пробел между информацией?
например-

Имя: Стив
Фамилия: Вудс
Гонка: W
Пол: М

Имя: Джон (это начало новой строки)
Фамилия: Стоктон
Раса: B
Пол: М

Richard Deeming

Нет, потому что это не входило в первоначальный вопрос.

Вам нужно будет разбить текст на группы и обработать каждую по отдельности. Например:

Dim rows() As String = Regex.Split(RichTextBox1.Text, "^\r?$", RegexOptions.Multiline)
Dim pattern As New Regex("^\s*(?<label>[^:]+)\s*:\s*(?<value>.+)\s*\r?$", RegexOptions.Multiline)

For Each row As String In rows
    Dim lastName As String = Nothing, firstName As String = Nothing, race As String = Nothing, sex As String = Nothing
    Dim matches As MatchCollection = pattern.Matches(row)
    For Each match As Match In matches
        ' Same code as answer...
    Next
    
    ' Process the row values here...
Next

Member 11856456

спасибо, это дает мне отличное место для начала.