写入文件并处理重复的条目

时间:2013-09-07 14:09:13

标签: c# file io streamwriter

背景:

1个按钮 1需要写入的文件 1 TextBox 1 NumericUpDown

因此,在我的应用程序中,我需要写入一个包含多行的文件。输入来自TextBox和NumericUpDown控件,它包含一般格式string.Format("{0}|{1}", TextBoxInput, NumericUpDownInput);的字符串。

我需要帮助的是在添加新行之前检查重复的条目。基本上,如果用户决定输入他们已经拥有的东西(以更多的“时间”更新它),程序应检查新输入的输入是否与其中一行相匹配,如果匹配,则{{1} }部分应加在一起并替换原始值,同时保留{1}部分。

我的方法:

我尝试解决这个问题的方法是创建一个名为{0}的字符串列表和一个用于遍历newFile的{​​{1}},以便查找新输入是否匹配已经输入的那个。

然后,有两种可能的情况:a)如果是,只需替换数字输入部分并将其添加到newFile,b)如果没有,只需将其添加到newFile。

最后,我使用了StreamWriter,以便用newFile覆盖originalFile。

不幸的是,由于我的方法无论出于何种原因生成空白文件,我都遇到了很多麻烦。如果我只是使用StreamWriter部分而不考虑重复的条目,它实际上工作得很好。

哦,还有一件事;如果程序也可以首先检查文件是否存在以避免异常,那将是很好的。我已经设法了,但我不认为这是最好的方法。请帮帮我。提前谢谢。

下面是按钮点击事件的代码,它基本上更新/添加到文件中(毕竟这是您需要的唯一代码):

for loop

P.S:很抱歉,如果我不够清楚,我不是母语为英语的人。

编辑:如果您想知道originalFile代表什么,它基本上是来自TextBox的输入。

编辑2:我认为我的方法中的主要错误是我开始使用空的private void btnAdd_Click(object sender, EventArgs e) { // If input is either blank or invalid [-] (the input is verified through a database), show error message. if (cardTitle == "" || cardTitle == "-") MessageBox.Show("Correct any errors before trying to add a card to your Resources.", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); // If the file does not exist, create it and close the stream object so as to further use the file. if (!File.Exists("CardResources.ygodc")) using (File.Create("CardResources.ygodc")) { }; string[] originalFile = File.ReadAllLines("CardResources.ygodc"); List<string> newFile = new List<string>(); for (int count = 0; count < originalFile.Length; count++) { string[] split = originalFile[count].Split('|'); string title = split[0]; string times = split[1]; if (title == cardTitle) newFile[count].Replace(string.Format("{0}|{1}", title, times), string.Format("{0}|{1}", title, (nudTimes.Value + int.Parse(times)).ToString())); else newFile.Add(string.Format("{0}|{1}", cardTitle, nudTimes.Value.ToString())); } using (StreamWriter sw = new StreamWriter("CardResources.ygodc", true)) { foreach (string line in newFile) { sw.WriteLine(line); } } } 列表,而不是仅编辑cardTitle列表。你怎么看待这个?

1 个答案:

答案 0 :(得分:0)

始终将字符串添加到newFile(String.Format非常聪明地将类型转换为其字符串表示形式,因此您无需在int上调用ToString)。并且不要追加,而是将完整的文件写回磁盘。

List<string> newFile = new List<string>();
bool isMatched = false;
if (File.Exists("CardResources.ygodc"))
{  
    string[] originalFile = File.ReadAllLines("CardResources.ygodc");

    for (int count = 0; count < originalFile.Length; count++)
    {
        string[] split = originalFile[count].Split('|');
        string title = split[0];
        string times = split[1];
        if (title == cardTitle)
        {
            newFile.Add(string.Format(
                           "{0}|{1}",
                           title, nudTimes.Value + int.Parse(times)));
            isMatched =true;
        }
        else
            newFile.Add(string.Format(
                            "{0}|{1}", 
                            title, times));
     }

}
if (!isMatched)
{
    newFile.Add(string.Format(
                           "{0}|{1}", 
                            cardTitle, nudTimes.Value));
}

using (StreamWriter sw = new StreamWriter("CardResources.ygodc"))
{
     foreach (string line in newFile)
     {
         sw.WriteLine(line);
     }
}

输入和输出样本:

   Input    |  Output
card| Value | 
----------------------
A   | 1     |  A|1

   Input    |  Output
card| Value | 
----------------------
B   | 1     |  A|1
            |  B|1

   Input    |  Output
card| Value | 
----------------------
C   | 1     |  A|1
            |  B|1
            |  C|1

   Input    |  Output
card| Value | 
----------------------
A   | 2     |  A|3
            |  B|1
            |  C|1