3

Using C# I want to create one or more text files to store all the data pertaining to a particular 'Thing' on the same line. I am presently leaning towards StringBuilder as per the following.

sb.AppendFormat("{0}{1}{2}{3}{4}{5}{6}{7}"
 , _ThingClass /* Thing class */ 
 , _ClassType /* Property class type */
 , _Prop0 /* These are generic properties that get manipulated depending on _ThingClass and _ClassType */ 
 , _Prop1 
 , _Prop2 
 , _Prop3 
 , _Prop4
 );
/*
Examples of _ThingClass (Person, Event, Vehicle, Item)
Examples of _ClassType (Teacher, Disaster, Car, Mobile Phone)
Examples of _Prop0-4 (Rachel, Tornado, Fiat, Samsung)
*/

The idea is to break down the string on a line to determine:

  • What kind of Thing is stored on the line (first value), and
  • How to handle the other fields* based on this value. (For example: Adding _Prop4 number value if a 'Heal' _ThingClass or Subtracting if a 'Harm' _ThingClass item, Perhaps even loading from, saving to a different text file so that the files can have only stuff of their own type (maybe easier for sorting).)

While I welcome any snippets of advice relating to this, I'll narrow down the question focus and ask:

Are there any cases where using a StringBuilder to structure data and save to or load from a file would be the way to go?

PS. I have found the content of "Which C# data structure should I use to quantify this information?" to be a possible alternative to StringBuilder - but I guess that there can be more than one valid path.

asked Mar 23, 2016 at 9:20
6
  • Have you considered CSV or Json? Commented Mar 23, 2016 at 9:25
  • @CodesInChaos I have considered using commas to separate the values for easier parsing. Json I've not yet heard of - will look into it - thanks! Commented Mar 23, 2016 at 9:28
  • I have since found this to be Json-relevant. Now I just need to look up serializing/deserializing. stackoverflow.com/questions/6620165/how-can-i-parse-json-with-c Commented Mar 23, 2016 at 9:54
  • 1
    StringBuilder doesn't store anything, it just builds strings, so I don't understand the question as currently asked. I assume you're trying to ask either if the way you're formatting your arbitrary data is a good idea, or if StringBuilder is a good way to implement serialization of arbitrary data. If so, the answer to both of those is that you're reinventing wheels.such as CSV, JSON, XML, YAML, etc. If the data is "non-arbitrary", then the question you linked is probably the answer. Commented Mar 23, 2016 at 9:59
  • @Ixrec I apologize if my question is that unclear (I've contemplated: {_StoreThing = sb.ToString();} ... {file.AddRecord(_StoreThing);} but my fundamentals aren't there. I'm muddling :c) Commented Mar 23, 2016 at 10:07

2 Answers 2

5

Can a StringBuilder be used to do this? Yes.

Can a hammer be used to drive screws into wood. Yes.

Both are possible. Neither are a Good Idea.

What you're describing is a class that takes a line of text and delivers back to you the object represented by that line. That's could be a Factory class, or simply a "Reader" class responsible for loading your file.

Pretty much everything that you put into a StringBuilder has to be dragged back out again (as a String) before you can do anything with it (Replace being the notable exception). So, StringBuilders are good at bolting things together; pulling them apart again (to get to the individual items)? Not so much.

Also remember that a "single line" file format can be easily trashed when storing user-entered text items that can themselves contain line breaks.

answered Mar 23, 2016 at 12:11
1
  • Thank you kindly. Both answers were really good but you make a very good point about the difficulties of taking strings apart for interpretation. JSON did look interesting but is another tech to add to my learning list for later. As such I have moved on to exploring classes (and nested classes). Commented Mar 28, 2016 at 13:27
6

First of all this has nothing to do with StringBuilder or string.Format. The question stays the same no matter how you generate the strings.

You are inventing a new serialization format. This means that you must write serialization and deserialization code.

Normally, this is not a good idea because it costs time and is error-prone. Use something read-made such as JSON, XML (XmlSerializer), BinaryFormatter, protobuf or others.

Which one you pick depends on what requirements you have. Normally, you would pick the one that causes the least amount of labor while fulfilling all requirements. If you don't know what to pick, JSON is a good (easy) start.

answered Mar 23, 2016 at 14:32
1

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.