簡體   English   中英

從列表寫入文本文件C#

[英]Writing from a list to a text file C#

如何將整個列表編碼到文本文件中,並在數據的每一位之間使用逗號? 當前,它正在創建文件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;
}
 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>使其變得更通用,但是在我采用這種形式的代碼中,我不需要這樣做。

盡管您可以使用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的序列化程序 ,或者根據需要嘗試使用其他方法 ),該方法在要用逗號分隔的內容中包含逗號。

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

但是像這樣的事情將實現:

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

你可以:

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

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

您必須迭代列表(未測試)或使用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;

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM