private static void WriteSampleFileWithIssues(Stream stream, Func <Stream, ITabularWriter> buildWriter) { Random r = new Random(); string huge = new string('Z', 100000); String8 huge8 = String8.Convert(huge, new byte[String8.GetLength(huge)]); String8 abcdef = String8.Convert("ABCDEF", new byte[6]); using (ITabularWriter writer = buildWriter(stream)) { writer.SetColumns(new string[] { "LineNumber", "Count", "Description" }); for (int i = writer.RowCountWritten + 1; i <= 10000; ++i) { if (i % 100 == 99) { // Write an empty row (1/100) long rowStartPosition = stream.Position; // Make the writer think everything is ok (it'll throw if you don't write enough values) writer.Write(String8.Empty); writer.Write(String8.Empty); writer.WriteValueStart(); writer.WriteValueEnd(); // Wipe out what was written stream.Seek(rowStartPosition, SeekOrigin.Begin); } else if (i == 5000) { // Write a huge row writer.Write(i); writer.WriteValueStart(); writer.WriteValuePart(r.Next(100000)); writer.WriteValueEnd(); writer.Write(huge8); } else { // Write a normal row writer.Write(i); writer.Write(r.Next(100000)); writer.Write(abcdef); } writer.NextRow(); } } }
public static void WriteHtmlEscaped(String8 value, ITabularWriter writer) { writer.WriteValueStart(); int writeFrom = 0; while (true) { // Look for an Html Tag int startOfTag = value.IndexOf((byte)'<', writeFrom); if (startOfTag == -1) { break; } // Write up to the tag writer.WriteValuePart(value.Substring(writeFrom, startOfTag - writeFrom)); // Find the end of the tag int endOfTag = value.IndexOf((byte)'>', startOfTag + 1); if (endOfTag == -1) { // Error: Unclosed tag, don't write anything else writeFrom = value.Length; break; } writeFrom = endOfTag + 1; } // Write the value after the last tag writer.WriteValuePart(value.Substring(writeFrom)); writer.WriteValueEnd(); }
public void Writer_WriteValidUsingAllOverloads(Stream stream, Func <Stream, ITabularWriter> buildWriter) { String8Set names = String8Set.Split(String8.Convert("Jeff,Bill,Todd,\\Barry\\", new byte[30]), UTF8.Comma, new int[5]); using (ITabularWriter w = buildWriter(stream)) { Assert.AreEqual(0, w.RowCountWritten); w.SetColumns(new string[] { "ID", "IsEven", "Backslash", "Today", "Name", "Description" }); Assert.AreEqual(0, w.RowCountWritten); for (int i = 0; i < 10; ++i) { w.Write(i); w.Write(i % 2 == 0); w.Write(UTF8.Backslash); w.Write(new DateTime(2017, 05, 03, 0, 0, 0, DateTimeKind.Utc)); w.Write(names[i % names.Count]); w.WriteValueStart(); w.WriteValuePart(i + 1); w.WriteValuePart(i % 2 == 1); w.WriteValuePart(UTF8.Quote); w.WriteValuePart(new DateTime(2017, 05, 01, 0, 0, 0, DateTimeKind.Utc)); w.WriteValuePart(names[i % names.Count]); w.WriteValueEnd(); Assert.AreEqual(i, w.RowCountWritten); w.NextRow(); Assert.AreEqual(i + 1, w.RowCountWritten); Assert.AreEqual(stream.Position, w.BytesWritten); } } }
public void Writer_CheckValidation(Func <Stream, ITabularWriter> buildWriter) { using (MemoryStream s = new MemoryStream()) { using (ITabularWriter w = buildWriter(s)) { // Write before SetColumns Verify.Exception <InvalidOperationException>(() => w.Write(0)); w.SetColumns(new string[] { "ID", "IsEven" }); // SetColumns already called Verify.Exception <InvalidOperationException>(() => w.SetColumns(new string[] { "Three", "Four" })); w.Write(0); // Not enough columns Verify.Exception <InvalidOperationException>(() => w.NextRow()); w.Write(true); // Too many columns Verify.Exception <InvalidOperationException>(() => w.Write(String8.FromBoolean(false))); w.NextRow(); // WriteValuePart without WriteValueStart Verify.Exception <InvalidOperationException>(() => w.WriteValuePart(true)); // WriteValueEnd not in partial value Verify.Exception <InvalidOperationException>(() => w.WriteValueEnd()); w.WriteValueStart(); // Write in partial value Verify.Exception <InvalidOperationException>(() => w.Write(true)); w.WriteValueEnd(); } } }
private static void ConcatenateColumn(string inputFilePath, string outputFilePath, string columnName1, string separator, string columnName2, string outputColumnName) { String8 separator8 = String8.Convert(separator, new byte[String8.GetLength(separator)]); using (ITabularReader reader = TabularFactory.BuildReader(inputFilePath)) { // Find the columns to concatenate int columnIndex1 = reader.ColumnIndex(columnName1); int columnIndex2 = reader.ColumnIndex(columnName2); // Build an output column list and mapping from output order to input index, with '-1' for the concatenated value List <string> outputColumns = new List <string>(); int[] indexMapping = new int[reader.Columns.Count - 1]; bool hasConcatenatedColumn = false; for (int i = 0; i < reader.Columns.Count; ++i) { string columnName = reader.Columns[i]; // If this is a column to concatenate... if (columnName.Equals(reader.Columns[columnIndex1], StringComparison.OrdinalIgnoreCase) || columnName.Equals(reader.Columns[columnIndex2], StringComparison.OrdinalIgnoreCase)) { // .. if it's the first one, the output column will appear at this position if (!hasConcatenatedColumn) { hasConcatenatedColumn = true; indexMapping[outputColumns.Count] = -1; outputColumns.Add(outputColumnName); } } else { // Otherwise, copy this column through indexMapping[outputColumns.Count] = i; outputColumns.Add(columnName); } } using (ITabularWriter writer = TabularFactory.BuildWriter(outputFilePath)) { writer.SetColumns(outputColumns); while (reader.NextRow()) { // Write columns in mapped order for (int i = 0; i < indexMapping.Length; ++i) { int sourceColumnIndex = indexMapping[i]; if (sourceColumnIndex == -1) { // Write concatenated column writer.WriteValueStart(); writer.WriteValuePart(reader.Current(columnIndex1).ToString8()); writer.WriteValuePart(separator8); writer.WriteValuePart(reader.Current(columnIndex2).ToString8()); writer.WriteValueEnd(); } else { writer.Write(reader.Current(sourceColumnIndex).ToString8()); } } writer.NextRow(); } WriteSizeSummary(reader, writer); } } }