using System.Text.RegularExpressions;
public static void Main()
var cSharpClass = CsvToClass.CSharpClassCodeFromCsvUrl("SacCrimeModel", "http://samplecsvs.s3.amazonaws.com/SacramentocrimeJanuary2006.csv", ",", "[DelimitedRecord(\",\")]", "[FieldOptional()]");
Console.Write(cSharpClass);
public static string CSharpClassCodeFromCsvUrl(string classNameOutput, string url, string delimiter = ",", string classAttribute = "", string propertyAttribute = "")
WebClient webClient = new WebClient();
using(var stream = webClient.OpenRead(url))
using(var reader = new StreamReader(stream))
string content = reader.ReadToEnd();
string[] lines = content.Split(System.Environment.NewLine.ToCharArray());
string csharpOutput = CSharpClassFromCsvData(classNameOutput, lines, delimiter, classAttribute, propertyAttribute);
public static string CSharpClassFromCsvData(string classNameOutput, string[] lines, string delimiter = ",", string classAttribute = "", string propertyAttribute = "")
if (string.IsNullOrWhiteSpace(propertyAttribute) == false)
propertyAttribute += "\n\t";
if (string.IsNullOrWhiteSpace(propertyAttribute) == false)
string[] columnNames = lines.First().Split(',').Select(str => str.Trim()).ToArray();
string[] data = lines.Skip(1).ToArray();
string className = classNameOutput;
string code = String.Format("{0}public class {1} {{ \n", classAttribute, className);
for (int columnIndex = 0; columnIndex < columnNames.Length; columnIndex++)
var columnName = Regex.Replace(columnNames[columnIndex], @"[\s\.]", string.Empty, RegexOptions.IgnoreCase);
if (string.IsNullOrEmpty(columnName))
columnName = "Column" + (columnIndex + 1);
code += "\t" + GetVariableDeclaration(data, columnIndex, columnName, propertyAttribute) + "\n";
public static string CSharpClassCodeFromCsvFile(string classNameOutput, string filePath, string delimiter = ",", string classAttribute = "", string propertyAttribute = "")
string[] lines = File.ReadAllLines(filePath);
return CSharpClassFromCsvData(classNameOutput, lines, delimiter, classAttribute, propertyAttribute);
public static string GetVariableDeclaration(string[] data, int columnIndex, string columnName, string attribute = null)
string[] columnValues = data.Select(line => line.Split(',')[columnIndex].Trim()).ToArray();
if (AllDateTimeValues(columnValues))
typeAsString = "DateTime";
else if (AllIntValues(columnValues))
else if (AllDoubleValues(columnValues))
string declaration = String.Format("{0}public {1} {2} {{ get; set; }}", attribute, typeAsString, columnName);
public static bool AllDoubleValues(string[] values)
return values.All(val => double.TryParse(val, out d));
public static bool AllIntValues(string[] values)
return values.All(val => int.TryParse(val, out d));
public static bool AllDateTimeValues(string[] values)
return values.All(val => DateTime.TryParse(val, out d));