разбить строку, а затем дифференцировать столбцы и данные c # - PullRequest
0 голосов
/ 09 февраля 2019
string msg = "{Type=\"wednesday report\", corporate=\"ubl\", reg#=\"BNN - 527\", Driven=\"304.5Km\", MaxSpeed=\"150km / hr\", IgnitionsON=\"5\", Stopped=\"21.8hrs\", Running=\"1.7hrs\", Idle=\"0.5hrs\", image=\"varbinary data from db\", link=\"http://iteck.pk/d/pXhAo\"}";

string[] spitMsg = msg.Split('=');

хочу

string type = "wednesday report";

Ответы [ 4 ]

0 голосов
/ 09 февраля 2019

Окей, я могу помочь вам с этим, он получит ((первая строка)), которая будет ("Среда отчет")

    'textbox2 = {\"}
    'textbox3 = {\"}
    Dim sSource As String = RichTextBox1.Text 'String that is being searched
    Dim sDelimStart As String = TextBox2.Text 'First delimiting word
    Dim sDelimEnd As String = TextBox3.Text  'Second delimiting word
    Dim nIndexStart As Integer = sSource.IndexOf(sDelimStart) 'Find the first occurrence of f1
    Dim nIndexEnd As Integer = sSource.IndexOf(sDelimEnd, nIndexStart + sDelimStart.Length + 1) 'Find the first occurrence of f2

    If nIndexStart > -1 AndAlso nIndexEnd > -1 Then '-1 means the word was not found.
        Dim res As String = Strings.Mid(sSource, nIndexStart + sDelimStart.Length + 1, nIndexEnd - nIndexStart - sDelimStart.Length) 'Crop the text between
        MessageBox.Show(res) 'Display
    Else
        MessageBox.Show("One or both of the delimiting words were not found!")
    End If

, которая покажет сообщение будет сказать "среда"сообщить "

это VB.net (вы можете конвертировать его)

0 голосов
/ 09 февраля 2019

Вы предоставили две немного разные строки ввода (одну в исходном вопросе, одну в комментариях).Они похожи, поэтому я просто использовал исходный вопрос.Входная строка в комментариях на самом деле будет немного проще для анализа, поскольку она содержит меньше кавычек и фигурных скобок.

Примеры представлены в виде xUnit тестов, которые можно легко скопировать и запустить впроверьте логику.

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;

namespace SO_54604467
{
    public class Example
    {
        // This is the actual parsing logic
        Dictionary<string, string> Parse(string msg) =>
            msg.TrimStart('{')
                .TrimEnd('}')
                .Split(',')
                .Select(s => s.Split('='))
                .ToDictionary(
                    key => key[0].Trim(),
                    val => val[1].Trim('"')
                );

        [Fact]
        public void ParseExampleInput()
        {
            // This string was provided in the original question
            string msg = "{Type=\"wednesday report\", corporate=\"ubl\", reg#=\"BNN - 527\", Driven=\"304.5Km\", MaxSpeed=\"150km / hr\", IgnitionsON=\"5\", Stopped=\"21.8hrs\", Running=\"1.7hrs\", Idle=\"0.5hrs\", image=\"varbinary data from db\", link=\"http://iteck.pk/d/pXhAo\"}";

            // This is the data I would expect the message to parse into
            var expected = new Dictionary<string, string>
            {
                ["Type"] = "wednesday report",
                ["corporate"] = "ubl",
                ["reg#"] = "BNN - 527",
                ["Driven"] = "304.5Km",
                ["MaxSpeed"] = "150km / hr",
                ["IgnitionsON"] = "5",
                ["Stopped"] = "21.8hrs",
                ["Running"] = "1.7hrs",
                ["Idle"] = "0.5hrs",
                ["image"] = "varbinary data from db",
                ["link"] = "http://iteck.pk/d/pXhAo",
            };

            var actual = Parse(msg);

            Assert.Equal(expected, actual);
        }

        [Fact]
        public void DemonstrateFailureWithBadInput()
        {
            // This string fails, because it contains an unexpected comma
            string msg = "{Type=\"wednesday, report\"}";

            Assert.ThrowsAny<Exception>(() => Parse(msg));
        }
    }
}
0 голосов
/ 09 февраля 2019

Путь № 1: https://dotnetfiddle.net/Y4CAH3

using System;

public class Program
{
    public static void Main()
    {
        string msg = "{Type=\"wednesday report\", corporate=\"ubl\", reg#=\"BNN - 527\", Driven=\"304.5Km\", MaxSpeed=\"150km / hr\", IgnitionsON=\"5\", Stopped=\"21.8hrs\", Running=\"1.7hrs\", Idle=\"0.5hrs\", image=\"varbinary data from db\", link=\"http://iteck.pk/d/pXhAo\"}";
        string result = betweenStrings(msg,"Type=\"","\",");
        Console.WriteLine(result);
    }

    public static String betweenStrings(String text, String start, String end)
    {
        int p1 = text.IndexOf(start) + start.Length;
        int p2 = text.IndexOf(end, p1);

        if (end == "") return (text.Substring(p1));
        else return text.Substring(p1, p2 - p1);                      
    }
}

Путь № 2: https://dotnetfiddle.net/RJ4twI

using System;
using System.Text.RegularExpressions;                   
public class Program
{
    public static void Main()
    {
        string msg = "{Type=\"wednesday report\", corporate=\"ubl\", reg#=\"BNN - 527\", Driven=\"304.5Km\", MaxSpeed=\"150km / hr\", IgnitionsON=\"5\", Stopped=\"21.8hrs\", Running=\"1.7hrs\", Idle=\"0.5hrs\", image=\"varbinary data from db\", link=\"http://iteck.pk/d/pXhAo\"}";
        Match match = Regex.Match(msg, "Type=\"(.*?)\",");

        if (match.Success)
        {
            string key = match.Groups[1].Value;
            Console.WriteLine(key);
        }
    }
}
0 голосов
/ 09 февраля 2019

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

        var data = "{Type=\"wednesday report\", corporate=\"ubl\", reg#=\"BNN - 527\", Driven=\"304.5Km\", MaxSpeed=\"150km / hr\", IgnitionsON=\"5\", Stopped=\"21.8hrs\", Running=\"1.7hrs\", Idle=\"0.5hrs\", image=\"varbinary data from db\", link=\"http://iteck.pk/d/pXhAo\"}";
        //let's remove the brackets
        data = data.Replace("{", "").Replace("}","");
        //then split by the comma to get the pieces
        var pieces = data.Split(',');
        //iterate through the pieces
        foreach (var piece in pieces)
        {
            //now we split by the = to get the key value pairs
            var kv = piece.Split('=');
            var key = kv[0];
            var value = kv[1];
            //viola, do what you want with them now
            Console.WriteLine(key + " is " + value);
        }

Это не относится к случаям, когда в кавычках содержатся запятые, скобки или знаки равенства.Это бы скинуло расщепление.Более мощным решением было бы использование регулярного выражения , которое могло бы объяснить эти вещи.

...