Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

parse a string with name-value pairs

How can I parse the following string of name-value pair in C#:

string studentDetail = "StudentId=J1123,FirstName=Jack,LastName=Welch,StudentId=k3342,FirstName=Steve,LastName=Smith"

The purpose of parsing this array is to insert values in DB using Linq to SQL:

[HttpPost]
public ActionResult SaveStudent(string studentDetail)
{
    DataContext db = new DataContext();         

    Student student = new Student();
    {
        student.StudentID = //StudentID
        student.FirstName = //FirstName
        student.LastName = //LastName
    };

    db.Student.InsertOnSubmit(student);
    db.SubmitChanges();

    return View();
}

What is the best way of approaching this?

like image 829
user793468 Avatar asked Jul 26 '12 16:07

user793468


3 Answers

You can split on the comma, then on the equals sign. I put the data into a dictionary for easy access.

string input = "StudentId=J1123,FirstName=Jack,LastName=Welch";

Dictionary<string,string> keyValuePairs = input.Split(',')
  .Select(value => value.Split('='))
  .ToDictionary(pair => pair[0], pair => pair[1]);

string studentId = keyValuePairs["StudentId"];

Note that this isn't validating the input at all to ensure that there are no commas in values, no keys without values, missing keys, etc.

like image 131
Servy Avatar answered Nov 10 '22 20:11

Servy


Because the individual student records are not delimited in the input, I would do something like the following:

public class Student
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
} 

and then:

private List<Student> DoSplit(string input)
{
    var theReturn = new List<Student>();
    input = input.Replace(",StudentId=", "|,StudentId=");

    var students = input.Split('|');

    foreach (var student in students)
    {
        var attribs = student.Split(',');
        if (attribs.Count() == 3)
        {
            var s = new Student();
            s.Id = attribs[0].Substring(attribs[0].LastIndexOf('='));
            s.FirstName = attribs[1].Substring(attribs[1].LastIndexOf('='));
            s.LastName = attribs[2].Substring(attribs[2].LastIndexOf('='));

            theReturn.Add(s);
        }
    }

    return theReturn;
}

Again, it's a bit naive because if content contains "=", ",", or "|", there will be failures. You should add some checking in there as well.

like image 5
Jonathan Avatar answered Nov 10 '22 19:11

Jonathan


Eric Petroelje had a very nice answer at https://stackoverflow.com/a/2049079/59996

Try System.Web.HttpUtility.ParseQueryString, passing in everything after the question mark. You would need to use the System.Web assembly, but it shouldn't require a web context.

(I'm not sure why these two questions aren't linked)

I was able to parse a string of the form a=1&b=2&c=3 using the following code

NameValueCollection nameValueCollection = HttpUtility.ParseQueryString(submission);
like image 2
Aligma Avatar answered Nov 10 '22 19:11

Aligma