示例#1
0
        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();
        }
示例#2
0
        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);
                }
            }
        }
示例#3
0
        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();
                }
            }
        }
示例#4
0
        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();
                }
            }
        }
示例#5
0
        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);
                }
            }
        }