feat: add CSV Writer

This commit is contained in:
Jack Kanarish
2018-08-28 10:52:12 -04:00
parent 80e6fe33c7
commit 2ff7073385
5 changed files with 212 additions and 0 deletions

View File

@@ -0,0 +1,135 @@
using System;
using System.Linq;
using ICD.Common.Properties;
using ICD.Common.Utils.IO;
namespace ICD.Common.Utils.Csv
{
public sealed class CsvWriter : IDisposable
{
private const string QUOTATION_MARK = "\"";
private const string DOUBLE_QUOTE_MARK = "\"\"";
private readonly IcdTextWriter m_Writer;
private readonly string m_Seperator;
private readonly string m_LineTerminator;
private readonly bool m_AlwaysEscape;
private bool m_NewLine;
/// <summary>
/// Constructor.
/// </summary>
public CsvWriter(IcdTextWriter writer, bool spaceAfterComma, bool alwaysEscape, string newline, params string[] header)
{
m_NewLine = true;
m_Writer = writer;
m_Seperator = spaceAfterComma ? ", " : ",";
m_AlwaysEscape = alwaysEscape;
m_LineTerminator = newline;
if(header.Any())
AppendRow(header);
}
~CsvWriter()
{
Dispose();
}
/// <summary>
/// Calls ToString() for each item and adds the row to the builder.
/// </summary>
/// <param name="row"></param>
[PublicAPI]
public void AppendRow(params object[] row)
{
foreach (object value in row)
AppendValue(value);
AppendNewline();
}
/// <summary>
/// Adds the row to the builder.
/// </summary>
/// <param name="row"></param>
[PublicAPI]
public void AppendRow(params string[] row)
{
foreach (string value in row)
AppendValue(value);
AppendNewline();
}
/// <summary>
/// Calls ToString() on the item and adds it to the builder.
/// </summary>
/// <param name="value"></param>
[PublicAPI]
public void AppendValue(object value)
{
AppendValue(string.Format("{0}", value));
}
/// <summary>
/// Adds a value to the builder.
/// </summary>
/// <param name="value"></param>
[PublicAPI]
public void AppendValue(string value)
{
if (!m_NewLine)
m_Writer.WrappedTextWriter.Write(m_Seperator);
if (m_AlwaysEscape || value.Contains(","))
{
value = value.Replace(QUOTATION_MARK, DOUBLE_QUOTE_MARK);
// Append the value, surrounded by quotes
m_Writer.WrappedTextWriter.Write(QUOTATION_MARK);
m_Writer.WrappedTextWriter.Write(value);
m_Writer.WrappedTextWriter.Write(QUOTATION_MARK);
}
else
{
m_Writer.WrappedTextWriter.Write(value);
}
m_NewLine = false;
}
/// <summary>
/// Adds a New Line To the Builder
/// </summary>
[PublicAPI]
public void AppendNewline()
{
m_Writer.WrappedTextWriter.Write(m_LineTerminator);
m_NewLine = true;
}
public void Dispose()
{
m_Writer.Dispose();
}
/// <summary>
/// Instantiates a new CsvWriter with the properties given in the CsvWriterSettings.
/// </summary>
/// <param name="writer"></param>
/// <param name="settings"></param>
/// <param name="header"></param>
/// <returns></returns>
[PublicAPI]
public static CsvWriter Create(IcdTextWriter writer, CsvWriterSettings settings, params string[] header)
{
return new CsvWriter(writer,
settings.InsertSpaceAfterComma,
settings.AlwaysEscapeEveryValue,
settings.NewLineSequence,
header);
}
}
}

View File

@@ -0,0 +1,46 @@
using ICD.Common.Properties;
namespace ICD.Common.Utils.Csv
{
public sealed class CsvWriterSettings
{
private bool m_InsertSpaceAfterComma = true;
private bool m_AlwaysEscapeEveryValue = true;
private string m_NewLineSequence = IcdEnvironment.NewLine;
/// <summary>
/// Gets/Sets whether to insert a space between elements, after the comma
/// Defaults to true.
/// </summary>
[PublicAPI]
public bool InsertSpaceAfterComma
{
get { return m_InsertSpaceAfterComma; }
set { m_InsertSpaceAfterComma = value; }
}
/// <summary>
/// Gets/Sets whether to always escape the values.
/// If true, values are recorded surrounded by quotes, regardless of if they contain a comma or not. Quotes are escaped.
/// If false, values are recorded as the value without quotes, unless escaping is required.
/// Defaults to true.
/// </summary>
[PublicAPI]
public bool AlwaysEscapeEveryValue
{
get { return m_AlwaysEscapeEveryValue; }
set { m_AlwaysEscapeEveryValue = value; }
}
/// <summary>
/// Gets/Sets the newline character or characters to deliniate records.
/// Defaults to System.NewLine.
/// </summary>
[PublicAPI]
public string NewLineSequence
{
get { return m_NewLineSequence; }
set { m_NewLineSequence = value; }
}
}
}

View File

@@ -79,6 +79,8 @@
<Compile Include="Collections\WeakKeyDictionary.cs" />
<Compile Include="Comparers\PredicateComparer.cs" />
<Compile Include="ConsoleColor.cs" />
<Compile Include="Csv\CsvWriter.cs" />
<Compile Include="Csv\CsvWriterSettings.cs" />
<Compile Include="EventArguments\BoolEventArgs.cs" />
<Compile Include="EventArguments\CharEventArgs.cs" />
<Compile Include="EventArguments\DateTimeEventArgs.cs" />
@@ -92,6 +94,7 @@
<Compile Include="Extensions\ByteExtensions.cs" />
<Compile Include="Extensions\ListExtensions.cs" />
<Compile Include="Comparers\PredicateEqualityComparer.cs" />
<Compile Include="IO\IcdStreamWriter.cs" />
<Compile Include="ProcessorUtils.SimplSharp.cs" />
<Compile Include="ProcessorUtils.Standard.cs" />
<Compile Include="ProgramUtils.SimplSharp.cs" />

View File

@@ -89,5 +89,11 @@ namespace ICD.Common.Utils.IO
{
return new IcdFileStream(File.Create(path));
}
[PublicAPI]
public static IcdStreamWriter AppendText(string path)
{
return new IcdStreamWriter(File.AppendText(path));
}
}
}

View File

@@ -0,0 +1,22 @@
using System;
#if SIMPLSHARP
using Crestron.SimplSharp.CrestronIO;
#elif STANDARD
using System.IO;
#endif
namespace ICD.Common.Utils.IO
{
public sealed class IcdStreamWriter : IcdTextWriter
{
public StreamWriter WrappedStreamWriter { get { return WrappedTextWriter as StreamWriter; } }
/// <summary>
/// Constructor.
/// </summary>
/// <param name="baseStreamWriter"></param>
public IcdStreamWriter(StreamWriter baseStreamWriter) : base(baseStreamWriter)
{
}
}
}