Files
spark/src/DataStreamSuite/DataStream/Primitives/TextFileStreams/TextWriterStream.cs
T

146 lines
3.8 KiB
C#

using System;
using System.Diagnostics;
using System.IO;
using BCG.Utilities.General;
namespace BCG
{
[DataStreamUserRespresentation("textWriter")]
public class TextWriterStream : ViewStream, IWorker
{
#region constructor
public TextWriterStream(ViewStream stream, string fileNamePrefix, int writeFreqSecs)
: this(ViewStreamDatabase.instance, stream, fileNamePrefix, writeFreqSecs)
{
}
public TextWriterStream(ViewStreamDatabase vsd, ViewStream stream, string fileNamePrefix, int writeFreqSecs)
{
myVsd = vsd;
myStream = stream;
myFileNamePrefix = fileNamePrefix;
myWriteFreqSecs = writeFreqSecs;
myNextWrite = DateTime.MinValue;
myGotUpdate = false;
mySchemaStr = null;
if (!myFileNamePrefix.EndsWith("_"))
{
myFileNamePrefix += "_";
}
}
#endregion
#region ViewStream
protected override void myOnFirstSubscriber()
{
myStream.onChange += myStreamChange;
myVsd.addWorker(this);
}
protected override void myOnLastSubscriber()
{
myVsd.removeWorker(this);
myStream.onChange -= myStreamChange;
}
#endregion
#region IWorker
public void doWork()
{
if ((myNextWrite <= DateTime.Now && myGotUpdate))
{
myGotUpdate = false;
myNextWrite = DateTime.Now.AddSeconds(myWriteFreqSecs);
myWrite(myStream.rows);
}
}
#endregion
private void myStreamChange(object o)
{
myGotUpdate = true;
}
#region helpers
public void myWrite(IBlueRowCollection rows)
{
#region create schema str
if (mySchemaStr == null)
{
myCreateSchemaStr(rows.schema);
}
#endregion
// create file name
string filename = String.Format("{0}{1}.txt", myFileNamePrefix, myDateTimeStr(DateTime.Now));
// open file
StreamWriter writer = new StreamWriter(filename);
// write schema str
if (mySchemaStr != null)
{
writer.WriteLine(mySchemaStr);
}
foreach (IBlueRow row in rows)
{
#region write row str
string rowStr = "";
foreach (string columnName in row.schema.columnNames)
{
if (rowStr != "")
{
rowStr += DELIM;
}
rowStr += row[columnName].ToString();
}
writer.WriteLine(rowStr);
#endregion
}
// close file
writer.Close();
}
public void myCreateSchemaStr(IBlueTableSchema schema)
{
mySchemaStr = "";
foreach (ColumnInfo columnInfo in schema.columnInfo)
{
if (mySchemaStr != "")
{
mySchemaStr += DELIM;
}
mySchemaStr += String.Format("{0}:{1}", columnInfo.colName, columnInfo.colType.ToString());
}
}
private string myDateTimeStr(DateTime dateTime)
{
return (String.Format("{0}{1}{2}{3}{4}{5}",
dateTime.Year.ToString("D4"), dateTime.Month.ToString("D2"), dateTime.Day.ToString("D2"),
dateTime.Hour.ToString("D2"), dateTime.Minute.ToString("D2"), dateTime.Second.ToString("D2")));
}
#endregion
public static readonly string DELIM = ", ";
#region state
private ViewStreamDatabase myVsd;
private ViewStream myStream;
private string myFileNamePrefix;
private int myWriteFreqSecs;
private DateTime myNextWrite;
private bool myGotUpdate;
private string mySchemaStr;
#endregion
}
}