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 выброшен при попытке объединить файлы. Не могли бы вы мне помочь? Заранее спасибо.
Что содержание 'линий [я]' в момент исключения? –
Старайтесь оставаться на месте, все эти фотографии и детали графического интерфейса не могут иметь никакого отношения к строке. Задайте вопрос. –