user3617347
user3617347

Reputation: 25

C# Best Way to Save Text Files into Objects

I have a group of delimited text files I need to read, create a class and objects, and store members inside. I am a beginner that's just looking to be pointed in the right direction. Any help would be appreciated greatly. Thank you very much.

I made a class with objects with:

public string left;
public string right;

and my form code :

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog of = new OpenFileDialog();
    of.ShowDialog();
    textBox1.Text = of.FileName;
}

private void button2_Click(object sender, EventArgs e)
{
    StreamReader sr = new StreamReader(textBox1.Text);
    textBox2.Text = sr.ReadToEnd();
    // sr.Close();
}

private void button3_Click(object sender, EventArgs e)
{
    string[] split1 = textBox2.Text.Split(';');
    foreach (string segment in split1)
    {
        //split sub-segment
        string[] split2 = segment.Split(':');
        //check if it's valid
        if (split2.Count().Equals(2))
        {
            id textfile = new id();
            textfile.left += // ????
            id textfile1 = new id();
            textfile.right += // ????

Upvotes: 2

Views: 3157

Answers (3)

OnlineCop
OnlineCop

Reputation: 4069

What you're looking for is serialization. When you have a known structure (like your class with string left and string right), you want to write that structure out to a text file. Then later, you want to read that information back in and automatically populate the class with each of the values.

As mason pointed out, JSON is fairly easy to setup. You create the class structure that you want, and tell JSON to save that out to a specified file (via SerializeObject).

Since .NET allows for reflection, JSON is able to turn the text file back into the contents of a class without you having to manually 'myClass.left = [some_value_from_json]'.

Personally, I'd go with JSON or XML, since naming your blocks of data means it is both more readable, and that your parser is able to handle someone rearranging the data (it doesn't matter if the file defines left before it defines right). If you rearranged a .CSV file, then you get data corruption.

Upvotes: 2

mason
mason

Reputation: 32719

Generally, it's much preferable to use JSON or XML to save data to text files rather than delimited text or custom formats. That's because good JSON and XML support is available in my languages and it's easy to work with.

public class MyCustomClass //this class will hold your data
{
    public string Left {get; set;}
    public string Right {get;set;}
}

MyCustomClass mcc=new MyCustomClass(); //create an instance of your class
mcc.Left="yes"; //set some properties
mcc.Right="nope";
string json=JsonConvert.SerializeObject(mcc); //convert to JSON string
File.WriteAllText("mcc.txt",json); //save to file

//later on, when you want to read it back from the file
string json=File.ReadAllText("mcc.text"); //read from file into a string
MyCustomClass mcc=JsonConvert.DeserializeObject<MyCustomClass>(json); //convert the string back to an instance of MyCustomClass

Above, we use Json.NET which is a library available for the .NET Framework (available on NuGet). We use it to convert our object to a string (serialize) and then later on to convert it back to an object (deserialize). Note that in order to use the JsonConvert class, you'll need the Json.NET references and to add a using statement at the top of your class using Newtonsoft.Json;.

Upvotes: 3

Robert H
Robert H

Reputation: 11730

Reading delimited files is common and there are many approaches to the subject. Personally I use a streamReader to read in the file and split it on the delimiter:

 Foo foo = new Foo(); // custom class
 string file = "export.CSV";
 if (System.IO.File.Exists(file))
 {             
      // Do work
      using (var reader = new StreamReader(file))
      {
          while (!reader.EndOfStream)
          {
              // split on the delimeter
              var readLine = reader.ReadLine();
              if (readLine == null) continue;
              var lines = readLine.Split(new[] { ',' });

              foreach (string s in lines)
              {
                  // do something with the data from the line

              }  
              // alternatively, you could specify your objects if your files
              // layout never changes. Just be careful to catch the exceptions! 
              foo.bar = lines[0];
              foo.baz = lines[1];

          }
      }
 }

Upvotes: 1

Related Questions