user1744093
user1744093

Reputation: 173

Writing from a list to a text file C#

How do I code the whole list into the text file with commas in between each bit of data? Currently it is creating the file newData, but it is not putting in the variables from the list. Here is what I have so far.

public partial class Form1 : Form {
  List<string> newData = new List<string>();
}

Above is where I create my list. Below is where I am reading it from.

private void saveToolStripMenuItem_Click(object sender, EventArgs e) {
  TextWriter tw = new StreamWriter("NewData.txt");
  tw.WriteLine(newData);
  buttonSave.Enabled = true;
  textBoxLatitude.Enabled = false;
  textBoxLongtitude.Enabled = false;
  textBoxElevation.Enabled = false;
}

And below is where the variables are coming from.

private void buttonSave_Click(object sender, EventArgs e) {
  newData.Add (textBoxLatitude.Text);
  newData.Add (textBoxLongtitude.Text);
  newData.Add (textBoxElevation.Text);
  textBoxLatitude.Text = null;
  textBoxLongtitude.Text = null;
  textBoxElevation.Text = null;
}

Upvotes: 0

Views: 5479

Answers (5)

SAJ14SAJ
SAJ14SAJ

Reputation: 1708

 private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {

        TextWriter tw = new StreamWriter("NewData.txt");                       
        tw.WriteLine(String.Join(", ", newData));

        // Add appropriate error detection
    }

In response to the discussion in both main answer threads, here is an example from my older code of a more robust way to handle CSV output:

The above not checked for syntax, but the key concept is String.Join.

 public const string Quote = "\"";

 public static void EmitCsvLine(TextWriter report, IList<string> values)
    {
        List<string> csv = new List<string>(values.Count);

        for (var z = 0; z < values.Count; z += 1)
        {
            csv.Add(Quote + values[z].Replace(Quote, Quote + Quote) + Quote);
        }

        string line = String.Join(",", csv);

        report.WriteLine(line);
    }

This could be made slightly more general with an IEnumerable<object> but in the code I took this form, I didn't have the need to.

Upvotes: 4

casperOne
casperOne

Reputation: 74530

While you can use String.Join as others have mentioned they're ignoring three important things:

  • The fact that what you're really trying to do is write a comma-separated values file
  • The input that you're receiving and whether or not it will have commas in it
  • If you sanitize your input, what the current culture on the thread is when you write it out to the file

You want to write a comma-delimited file. There's no standardized format for this, but you do have to be careful of string content, especially in your case, where you're getting user input. Consider the following input:

latitude = "39,41"
longitude = "41,20"

There are a number of countries where the comma is used as a decimal separator, so this kind of input is very possible, depending on how distributed your application is (I'd be even more concerned if this was a website, personally).

And when getting the elevation, it's absolutely possible in most other places that use a comma as the thousands separator:

elevation = 20,000

In all of the other answers, your output for the line in the file will be:

39,41,41,20,20,000

Which when parsed (assuming it will be parsed, you're creating a machine-readable format) will fail.

What you want to do is parse the content first into a decimal and then output that.

Assuming you sanitize your input like so:

decimal latitude = Decimal.Parse(textBoxLatitude.Text);
decimal longitude = Decimal.Parse(textBoxLongitude.Text);
decimal elevation = Decimal.Parse(textBoxElevation.Text);

You would then format the values so that there are no commas (if you want).

To that end, I really recommend that you want to use a dedicated CSV writer/parser (try ServiceStack's serializer on NuGet, or others, if you prefer), which accounts for commas within the content you want separated by commas.

Upvotes: 5

Stefano L
Stefano L

Reputation: 1583

You have to iterate the List (not tested) or use string.Join, as the other users suggested (you need to convert your list to an array then)

private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {
        TextWriter tw = new StreamWriter("NewData.txt");
        for (int i = 0; i < newData.Count; i++) 
        {                   
           tw.Write(newData[i]);
           if(i < newData.Count-1)
           { 
              tw.Write(",");
           }
        }
        tw.close();
        buttonSave.Enabled = true;
        textBoxLatitude.Enabled = false;
        textBoxLongtitude.Enabled = false;
        textBoxElevation.Enabled = false;

    }

Upvotes: -1

chrisc
chrisc

Reputation: 434

you could:

StringBuilder b = new StringBuilder();
foreach (string s in yourList)
{
    b.Append(s);
            b.Append(", ");
}

string dir = "c:\mypath";
File.WriteAllText(dir, b.ToString());

Upvotes: -1

Klark
Klark

Reputation: 8280

You cannot output the list just by calling tw.WriteLine(newData);

But something like this will achieve that:

tw.WriteLine(string.Join(", ", newData));

Upvotes: 0

Related Questions