Add new Class in DotNetCore.ConsoleApplication
We are going to add a new class CsvWriter in DotNetCore.ConsoleApplication.
- Open existing Solution in Visual Studio 2015.
- Now add a new class CsvWriter.cs.
- Open Add New Item Screen through DotNetCore.ConsoleApplication Context Menu of Common folder >> Add >> Class >> Installed >> .NET Core >> Class.
- Name it CsvWriter.cs.
- Click OK Button.
- Add CsvWriter implementation.
- Write<T> (IList<T> list, bool includeHeader = true)
- Creates and returns generated CSV.
- Write<T> (IList<T> list, string fileName, bool includeHeader = true)
Creates and returns generated CSV and saves the generated CSV to specified path. - CreateCsvHeaderLine
Creates CSV header line if includeHeader is sent true. - CreateCsvLine<T>(T item, PropertyInfo[] properties)
Creates a CSV line for given type of object. - CreateCsvLine(IList<string> list)
Creates a CSV line for given list of string by joining them delimated by comma. - CreateCsvItem
Adds provided value item to processed list used to create CSV line. - CreateCsvStringListItem
Adds provided string list as single item to processed list used to create CSV line. - CreateCsvStringArrayItem
Adds provided string array as single item to processed list used to create CSV line. - CreateCsvStringItem
Adds provided string value item to processed list used to create CSV line. - ProcessStringEscapeSequence
Processes the provided data to handle double qoutes and comma value. If we do not apply escape sequences then they can croupt data. - WriteFile
Writes the generated CSV data to file.
public class CsvWriter
{
private const string DELIMITER = ",";
public string Write<T>(IList<T> list, bool includeHeader = true)
{
StringBuilder sb = new StringBuilder();
Type type = typeof(T);
PropertyInfo[] properties = type.GetProperties();
if (includeHeader)
{
sb.AppendLine(this.CreateCsvHeaderLine(properties));
}
foreach (var item in list)
{
sb.AppendLine(this.CreateCsvLine(item, properties));
}
return sb.ToString();
}
public string Write<T>(IList<T> list, string fileName, bool includeHeader = true)
{
string csv = this.Write(list, includeHeader);
this.WriteFile(fileName, csv);
return csv;
}
private string CreateCsvHeaderLine(PropertyInfo[] properties)
{
List<string> propertyValues = new List<string>();
foreach (var prop in properties)
{
string formatString = string.Empty;
string value = prop.Name;
var attribute = prop.GetCustomAttribute(typeof(DisplayAttribute));
if (attribute != null)
{
value = (attribute as DisplayAttribute).Name;
}
this.CreateCsvStringItem(propertyValues, value);
}
return this.CreateCsvLine(propertyValues);
}
private string CreateCsvLine<T>(T item, PropertyInfo[] properties)
{
List<string> propertyValues = new List<string>();
foreach (var prop in properties)
{
string formatString = string.Empty;
object value = prop.GetValue(item, null);
if (prop.PropertyType == typeof(string))
{
this.CreateCsvStringItem(propertyValues, value);
}
else if (prop.PropertyType == typeof(string[]))
{
this.CreateCsvStringArrayItem(propertyValues, value);
}
else if (prop.PropertyType == typeof(List<string>))
{
this.CreateCsvStringListItem(propertyValues, value);
}
else
{
this.CreateCsvItem(propertyValues, value);
}
}
return this.CreateCsvLine(propertyValues);
}
private string CreateCsvLine(IList<string> list)
{
return string.Join(CsvWriter.DELIMITER, list);
}
private void CreateCsvItem(List<string> propertyValues, object value)
{
if (value != null)
{
propertyValues.Add(value.ToString());
}
else
{
propertyValues.Add(string.Empty);
}
}
private void CreateCsvStringListItem(List<string> propertyValues, object value)
{
string formatString = "\"{0}\"";
if (value != null)
{
value = this.CreateCsvLine((List<string>)value);
propertyValues.Add(string.Format(formatString, this.ProcessStringEscapeSequence(value)));
}
else
{
propertyValues.Add(string.Empty);
}
}
private void CreateCsvStringArrayItem(List<string> propertyValues, object value)
{
string formatString = "\"{0}\"";
if (value != null)
{
value = this.CreateCsvLine(((string[])value).ToList());
propertyValues.Add(string.Format(formatString, this.ProcessStringEscapeSequence(value)));
}
else
{
propertyValues.Add(string.Empty);
}
}
private void CreateCsvStringItem(List<string> propertyValues, object value)
{
string formatString = "\"{0}\"";
if (value != null)
{
propertyValues.Add(string.Format(formatString, this.ProcessStringEscapeSequence(value)));
}
else
{
propertyValues.Add(string.Empty);
}
}
private string ProcessStringEscapeSequence(object value)
{
return value.ToString().Replace("\"", "\"\"");
}
public bool WriteFile(string fileName, string csv)
{
bool fileCreated = false;
if (!string.IsNullOrWhiteSpace(fileName))
{
File.WriteAllText(fileName, csv);
fileCreated = true;
}
return fileCreated;
}
}
Add Test Model Class in DotNetCore.ConsoleApplication
We are going to add a new class TestVM in DotNetCore.ConsoleApplication.
- Open existing Solution in Visual Studio 2015.
- Now add a new class TestVM.cs.
- Open Add New Item Screen through DotNetCore.ConsoleApplication Context Menu of Common folder >> Add >> Class >> Installed >> .NET Core >> Class.
- Name it TestVM.cs.
- Click OK Button.
- Add TestVM implementation.
- Update Program.cs to initialize List<TestVM> with dummy data and call CsvWriter.
public class TestVM
{
[Display(Name = "Test Id")]
public int TestId { get; set; }
[Display(Name = "Name")]
public string TestName { get; set; }
}
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Welcome to .NET Core Console Application");
List<TestVM> tests = new List<TestVM>
{
new TestVM {TestId=1, TestName="Bill Gates" },
new TestVM {TestId=2, TestName="Warren Buffett" },
new TestVM {TestId=3, TestName="Amancio Ortega" },
new TestVM {TestId=4, TestName="Carlos Slim Helu" }
};
string fileName = string.Format("{0}\\test.csv", System.AppContext.BaseDirectory);
CsvWriter csvWriter = new CsvWriter();
csvWriter.Write(tests, fileName, true);
Console.WriteLine("{0} has been created.", fileName);
Console.ReadKey();
}
}
Run Application in Debug Mode
- Press F5 or Debug Menu >> Start Debugging or Start Console Application Button on Toolbar to start application in debugging mode. It will start application console in debug mode.
- It will generate test.csv at given path. Therefore at C:\ASP.NET Core\CSV Writer\DotNetCore\ConsoleApplication.NetCore\bin\Debug\netcoreapp1.0.
- Press F5 or Debug Menu >> Start Debugging or Start Console Application Button on Toolbar to start application in debugging mode. It will start application console in debug mode.
- It will generate test.csv at given path. Therefore at C:\ASP.NET Core\CSV Writer\DotNetCore\ConsoleApplication.NetCore\bin\Debug\netcoreapp1.0.
great
ReplyDeleteHi, Great.. Tutorial is just awesome..It is really helpful for a newbie like me.. I am a regular follower of your blog. Really very informative post you shared here. Kindly keep blogging. If anyone wants to become a .Net developer learn from .Net Core Training in Chennai. or learn thru .Net Core Training in Chennai. Nowadays Dot Net has tons of job opportunities on various vertical industry.
ReplyDeleteor Es6 Training in Chennai. Nowadays JavaScript has tons of job opportunities on various vertical industry.
You can have them stroll around the city, stop and talk to other sims, go to sleep so their energy is replaced, and more. Projectsdeal UK Review
ReplyDelete