Part 1

using System;
using System.IO;
using System.Text.RegularExpressions;

namespace Kata4
{
        class Kata4
        {
                public static void Main(string[] argv)
                {
                        FileStream fs = new FileStream("K4Weather.txt", FileMode.Open, FileAccess.Read);
                        StreamReader r = new StreamReader(fs);
                        int min_spread = Int32.MaxValue;
                        int spread_day = -1;
                        while(r.Peek() > -1)
                        {
                                string s = r.ReadLine();
                                Match fields = Regex.Match(s, "^ +([0-9]+) +([0-9]+)* *([0-9]+).*");
                                try {
                                        int day = Convert.ToInt32(fields.Groups[1].ToString());
                                        int min = Convert.ToInt32(fields.Groups[3].ToString());
                                        int max = Convert.ToInt32(fields.Groups[2].ToString());
                                        int spread = max - min;
                                        if (spread <= min_spread)
                                        {
                                                spread_day = day;
                                                min_spread = spread;
                                        }
                                } catch {
                                }
                        }
                        Console.WriteLine(spread_day);
                }
        }
}

Part 2

using System;
using System.IO;
using System.Text.RegularExpressions;

namespace Kata4
{
        class Kata4_2
        {
                public static void Main(string[] argv)
                {
                        FileStream fs = new FileStream("K4Soccer.txt", FileMode.Open, FileAccess.Read);
                        StreamReader r = new StreamReader(fs);
                        int min_spread = Int32.MaxValue;
                        string spread_day = "";
                        while(r.Peek() > -1)
                        {
                                string s = r.ReadLine();
                                Match fields = Regex.Match(s, "^ +[0-9]+\\. ([A-Za-z_]+) +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +([0-9]+) +- +([0-9]+).*");
                                try {
                                        string day = fields.Groups[1].ToString();
                                        Console.Write("Testing");
                                        Console.WriteLine(day);
                                        int min = Convert.ToInt32(fields.Groups[2].ToString());
                                        int max = Convert.ToInt32(fields.Groups[3].ToString());
                                        int spread = Math.Abs( max - min );
                                        if (spread <= min_spread)
                                        {
                                                spread_day = day;
                                                min_spread = spread;
                                        }
                                } catch {
                                }
                        }
                        Console.WriteLine(spread_day);
                }
        }
}

Part 3

using System;
using System.IO;
using System.Text.RegularExpressions;

namespace Kata4
{
        class Kata4_2
        {
                public static void Main(string[] args)
                {
                        Console.Write("part1: ");
                        DM("K4Weather.txt", "^ +([0-9]+) +([0-9]+)* *([0-9]+).*");
                        Console.Write("part2: ");
                        DM("K4Soccer.txt", "^ +[0-9]+\\. ([A-Za-z_]+) +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +([0-9]+) +- +([0-9]+).*");
                }

                public static void DM(string file, string pattern)
                {
                        FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
                        StreamReader r = new StreamReader(fs);
                        int min_spread = Int32.MaxValue;
                        string spread_day = "";
                        while(r.Peek() > -1)
                        {
                                string s = r.ReadLine();
                                Match fields = Regex.Match(s, pattern);
                                try {
                                        string day = fields.Groups[1].ToString();
                                        int min = Convert.ToInt32(fields.Groups[2].ToString());
                                        int max = Convert.ToInt32(fields.Groups[3].ToString());
                                        int spread = Math.Abs( max - min );
                                        if (spread <= min_spread)
                                        {
                                                spread_day = day;
                                                min_spread = spread;
                                        }
                                } catch {
                                }
                        }
                        Console.WriteLine(spread_day);
                }
        }
}