0

编辑 2:如果您想获得更多代码,请告诉我。但是,我真的不知道您还想要什么其他代码,因为问题显然出在下面的代码中(不是我的编辑)。

编辑:如果有人仍然对这个问题的答案感兴趣,我还没有完全弄清楚,但注意到了一些相当奇怪的事情。在我看来List[index].Replace(oldValue, newValue);(一般格式)对我来说根本不起作用!这是我问题的最后一部分所在。我已经添加了断点并逐步调试了我的应用程序,检查了 newFile 是否确实包含lines[i]卡已经存在的时间(newsflash,确实如此),但该命令仍然不想工作!Replace();几乎没有用。这是为什么?我的代码有问题吗?地狱,我什至分解了这个片段:

newFile[newFile.IndexOf(lines[i])].Replace(lines[i],
                                       string.Format(
                                       "{0}|{1}", title, int.Parse(times) + int.Parse(secondTimes)));

更简单(仅出于评估目的,查看元素是否实际被替换,当 i == 0 时,Winged Dragon 是 newFile 的第一个(数字 0)元素,请注意):

newFile[0].Replace("Winged Dragon, Guardian of the Fortress #1|3", "Just replace it with this dammit!");

但它仍然拒绝工作!顺便说一句,对不起,我无法理解我在这里做错了什么。


昨天我问了一个类似的问题(可以在这里找到:写入文件并处理重复条目),我得到了我想要的答案。但是,现在我想通过允许我的应用程序将两个文件合并为一个来扩展该功能,同时考虑到重复条目。再一次,所有给定文件的每一行的一般格式是string.Format("{0}|{1}", TitleOfCard, NumberOfTimesCardIsOwned);.

在我开始编写代码之前,您可能想知道我让用户通过OpenFileDialog (Multiselect=True)浏览要合并的文件。

现在,这是我的代码:

   private void btnMerge_Click(object sender, EventArgs e)  
   {     
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {   
            // Save file names to array.
            string[] fileNames = openFileDialog1.FileNames;

            // Loop through the files.
            foreach (string fileName in fileNames) 
            {
                // Save all lines of the current file to an array.
                string[] lines = File.ReadAllLines(fileName);

                // Loop through the lines of the file.
                for (int i = 0; i < lines.Length; i++)
                {
                    // Split current line ( remember, all lines are of format {0}|{1} ).
                    string[] split = lines[i].Split('|');
                    string title = split[0]; //
                                             // = TitleOfCard, NumberOfTimesCardIsOwned
                    string times = split[1]; //

                    // newFile is a list that stores the lines from the default resources file.
                    // If it contains the current line of the file that we're currently looping through...
                    if (newFile.Contains(lines[i]))
                    {
                        // Split the line once again.
                        string[] secondSplit = newFile.ElementAt(
                            newFile.IndexOf(lines[i])).Split('|');
                        string secondTitle = secondSplit[0];
                        string secondTimes = secondSplit[1];

                        // Replace the newFile element at the specified index with:
                        // - Same title
                        // - Add the 'times' of the newFile element and the 'times' of the newFile
                        // => KEEP TITLE, UPDATE THE NUMBER OF TIMES CARD IS OWNED
                        newFile[newFile.IndexOf(lines[i])].Replace(lines[i],
                                       string.Format(
                                       "{0}|{1}", title, int.Parse(times) + int.Parse(secondTimes)));
                    }
                    // If newFile does not contain the current line of the file we're looping through, just add it to newFile.
                    else
                        newFile.Add(string.Format(
                                        "{0}|{1}",
                                        title, times));
                }
            }

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

            // Clear listview and reupdate it vv
            lvResources.Clear();

            string[] originalFile = File.ReadAllLines("CardResources.ygodc");

            foreach (string line in originalFile)
            {
                string[] split = line.Split('|');
                string title = split[0];
                string times = split[1];

                ListViewItem lvi = new ListViewItem(title);
                lvi.SubItems.Add(times);
                lvResources.Items.Add(lvi);
            }
        }
    }

我遇到问题的那一行是string times = split[1];当我尝试合并文件时抛出IndexOutOfRangeException 。你能帮我么?提前致谢。

4

1 回答 1

0

您很可能正在尝试处理空行。

要忽略空行:

if (lines[i].Trim() == string.Empty) 
    continue;

string[] split = lines[i].Split('|');
if (split.Length != 2)
    throw new InvalidOperationException("invalid file");
string title = split[0];
string times = split[1];

要忽略无效行:

string[] split = lines[i].Split('|');
if (split.Length != 2) 
    continue;
string title = split[0];
string times = split[1];
于 2013-09-09T12:10:53.270 回答