2013-09-09 3 views
0

EDIT 2: Если вы хотите получить больше кода, то просто дайте мне знать. Но я действительно не знаю, какой еще код вам нужен, поскольку проблема, очевидно, лежит в коде ниже (а не на моем редактировании).Слияние двух файлов и обработка дубликатов записей

EDIT: Если кто-то еще заинтересован в ответе на этот вопрос, я точно не понял его, но заметил что-то довольно странное. Мне кажется List[index].Replace(oldValue, newValue); (общий формат) не будет работать НА ВСЕ для меня! Вот где лежит последняя часть моей проблемы. Я добавил точки останова и отлаживал свое приложение шаг за шагом, проверял, действительно ли newFile содержит lines[i], когда карта уже существует (новостная лента, это так), но все же команда не хочет работать! Replace(); практически бесполезен. Почему это? Что-то не так с моим кодом? Черт, я даже сломался этот фрагмент:

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

к гораздо проще (только для оценки целей, чтобы увидеть, если элемент фактически заменяется, когда я == 0, крылатый Дракон является первым (номер 0) элемент newFile, заметьте):

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

Но он по-прежнему отказывается работать! К сожалению, для бушующего, кстати, но я не могу, для жизни меня, понять, что я делаю неправильно здесь.


Вчера я задавал подобный вопрос (который можно найти здесь: Writing to a file and handling duplicate entries), и я получил ответ, который я хотел. Однако теперь я хотел бы расширить эту функциональность, разрешив моему приложению объединить два файла в один, учитывая дубликаты записей. Еще раз, общий формат каждой строки всех заданных файлов - 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 выброшен при попытке объединить файлы. Не могли бы вы мне помочь? Заранее спасибо.

+0

Что содержание 'линий [я]' в момент исключения? –

+0

Старайтесь оставаться на месте, все эти фотографии и детали графического интерфейса не могут иметь никакого отношения к строке. Задайте вопрос. –

ответ

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]; 
+0

Просто игнорируйте непредвиденное состояние? –

+0

В зависимости от того, чего хочет OP, да. Если ОП решит, что это должно быть неожиданное условие, следует исключить исключение (ваш ответ). –

+0

Мне нравится этот подход больше как причина, по которой исключение выбрасывается в первую очередь, вероятно, является ошибкой (как исходный файл сохраняется в первую очередь или как я его читаю). Это, как говорится, у меня все еще есть проблемы (взгляните на мой комментарий в ответ Холтермана) ... –

Смежные вопросы