0

如何将整个列表编码到文本文件中,并在每个数据位之间使用逗号?目前它正在创建文件 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;
}
4

5 回答 5

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>但在我采用这种形式的代码中,我不需要这样做。

于 2012-11-28T17:46:01.967 回答
4

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

  • 事实上,你真正想做的是写一个逗号分隔的值文件
  • 您收到的输入以及其中是否包含逗号
  • 如果你清理你的输入,当你把它写到文件中时,线程上的当前文化是什么

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

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

许多国家/地区使用逗号作为小数分隔符,因此这种输入非常有可能,具体取决于您的应用程序的分布情况(如果这是一个网站,我个人会更加担心)。

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

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 编写器/解析器(如果您愿意,可以尝试在 NuGet其他上使用 ServiceStack 的序列化程序),它会在您希望用逗号分隔的内容中解释逗号。

于 2012-11-28T17:53:34.067 回答
0
You cannot output the list just by calling tw.WriteLine(newData);

但是这样的事情将实现:

tw.WriteLine(string.Join(", ", newData));
于 2012-11-28T17:46:56.517 回答
-1

你可以:

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

string dir = "c:\mypath";
File.WriteAllText(dir, b.ToString());
于 2012-11-28T17:49:10.700 回答
-1

您必须按照其他用户的建议迭代列表(未测试)或使用 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;

    }
于 2012-11-28T17:49:58.017 回答