using System.Collections.Generic;
static IEnumerable<string> GetLines(TextReader reader)
while ((line = reader.ReadLine()) != null)
static IEnumerable<string> Convert(TextReader reader)
.Select(line => line.Split(new[] {'\t', ' '}, StringSplitOptions.RemoveEmptyEntries))
.Select(info => new { C1 = info[0], C2 = info[1], From = IPAddress.Parse(info[2]), To = IPAddress.Parse(info[3]) });
foreach (var item in items)
var fromIp = item.From.GetAddressBytes();
var toIp = item.To.GetAddressBytes();
Console.WriteLine("From {0} to {1}", item.From.ToString(), item.To.ToString());
foreach (byte secondPart in Enumerable.Range(fromIp[1], toIp[1] - fromIp[1] + 1))
foreach (byte thirdPart in Enumerable.Range(fromIp[2], toIp[2] - fromIp[2] + 1))
var ip1 = new IPAddress(new byte[] {fromIp[0], secondPart, thirdPart, fromIp[3]});
var ip2 = new IPAddress(new byte[] {toIp[0], secondPart, thirdPart, toIp[3]});
yield return string.Format("{0}\t{1}\t{2}\t{3}", item.C1, item.C2, ip1, ip2);
AX AMDBCEFG 103.12.96.0 103.12.98.255
AX AMDBDEFG 103.11.64.0 103.13.64.255
AX AMDBEEFG 103.14.24.0 103.14.24.255
var sb = new System.Text.StringBuilder();
using (var reader = new StringReader(input))
using (var writer = new StringWriter(sb))
foreach (var line in Convert(reader))
Console.WriteLine(sb.ToString());