从列表写入文本文件C#

时间:2012-11-28 17:42:46

标签: c# winforms

如何在每个数据位之间使用逗号将整个列表编码到文本文件中?目前它正在创建文件newData,但它没有从列表中放入变量。这是我到目前为止所拥有的。

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

以上是我创建列表的地方。以下是我正在阅读的地方。

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;
}

以下是变量的来源。

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;
}

5 个答案:

答案 0 :(得分:4)

 private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {

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

        // Add appropriate error detection
    }

在回答两个主要答案线程中的讨论时,以下是我的旧代码中一个处理CSV输出的更强大方法的示例:

上面没有检查语法,但关键概念是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);
    }

使用IEnumerable<object>可以稍微提高一点,但在我使用此表单的代码中,我没有必要。

答案 1 :(得分:4)

虽然你可以像其他人提到的那样使用String.Join,但他们忽略了三件重要的事情:

  • 你真正想做的事情就是写一个comma-separated values文件
  • 您收到的输入以及是否包含逗号
  • 如果您清理输入,那么当您将其写入文件时,该线程的当前文化是什么

您想要编写逗号分隔的文件。没有标准化的格式,但您必须小心字符串内容,尤其是在您的情况下,您将获得用户输入。请考虑以下输入:

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

有一个number of countries where the comma is used as a decimal separator,所以这种输入很可能,这取决于您的应用程序的分布情况(如果这是一个网站,我会更加担心)。

在获得高程时,在大多数其他使用逗号作为千位分隔符的地方绝对可能:

elevation = 20,000

在所有其他答案中,文件中该行的输出将为:

39,41,41,20,20,000

解析时(假设它将被解析,你正在创建机器可读格式)将会失败。

你想要做的是首先将内容解析为小数,然后输出。

假设您像这样清理输入:

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

然后,您可以格式化值,以便没有逗号(如果需要)。

为此,我真的建议您使用专用的CSV编写器/解析器(如果您愿意,请尝试ServiceStack's serializer on NuGetothers),这会在您想要的内容中占用逗号以逗号分隔。

答案 2 :(得分:0)

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

但是这样的事情会实现:

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

答案 3 :(得分:-1)

你可以:

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

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

答案 4 :(得分:-1)

您必须迭代List(未测试)或使用string.Join,正如其他用户建议的那样(您需要将列表转换为数组)

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;

    }