Сортировка и группировка по первому столбцу И сумма каждого значения второго и третьего столбца - C#
Формулировка задачи:
Здравствуйте, нужна помощь в реализации. Есть файл формата:
задача получить новый файл формата:
т.е. сортировка и группировка по первому столбцу И сумма каждого значения второго и третьего столбца
в файле может быть от 1 до 10000 строк
231,9;3;1 231,9;0;1 232,1;1;0 232,0;1;6 232,1;5;0 232,1;3;5 232,1;2;1 232,2;0;6 232,2;1;5
231,9;3;2 232;1;6 232,1;11;6 232,2;1;11
Решение задачи: «Сортировка и группировка по первому столбцу И сумма каждого значения второго и третьего столбца»
textual
Листинг программы
class Program
{
private const string In = @"d:\in.txt";
private const string Out = @"d:\out.txt";
static void Main()
{
if (!File.Exists(In))
{
Console.WriteLine("Не найден входной файл");
return;
}
var all = File.ReadAllLines(In);
if (!all.Any())
{
Console.WriteLine("Пустой файл");
return;
}
var list = new List<DataIn>();
foreach (var split in all.Select(s => s.Split(';')))
{
if (split.Count() < 3)
{
Console.WriteLine("Неверный формат");
continue;
}
double numb;
int first;
int second;
if (!double.TryParse(split[0], out numb))
{
Console.WriteLine("Неверный первый аргумент");
continue;
}
if (!int.TryParse(split[1], out first))
{
Console.WriteLine("Неверный второй аргумент");
continue;
}
if (!int.TryParse(split[2], out second))
{
Console.WriteLine("Неверный третий аргумент");
continue;
}
list.Add(new DataIn { Number = numb, FirstCol = first, SecondCol = second });
}
var listOut = (from grp in list.GroupBy(x => x.Number).OrderBy(x => x.Key) let sumFirst = list.Where(x => x.Number.Equals(grp.First().Number)).Sum(x => x.FirstCol) let sumSecond = list.Where(x => x.Number.Equals(grp.First().Number)).Sum(x => x.SecondCol) select string.Format("{0};{1};{2}", grp.First().Number, sumFirst, sumSecond)).ToList();
Console.WriteLine("Выход:");
foreach (var outItem in listOut)
{
Console.WriteLine(outItem);
}
Console.WriteLine("Запишем в файл");
try
{
using (var file = new StreamWriter(Out))
{
foreach (var line in listOut)
file.WriteLine(line);
}
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(ex.Message);
Console.ResetColor();
throw;
}
}
}
class DataIn
{
public double Number { get; set; }
public int FirstCol { get; set; }
public int SecondCol { get; set; }
}