Exemple #1
0
        public void TestReader_ReadThreeTypes()
        {
            StringWriter stringWriter = new StringWriter();
            var          injector     = getSchemaInjector();
            var          writer       = new SeparatedValueWriter(stringWriter, injector);

            writer.Write(new object[] { "First Batch", 2 });
            writer.Write(new object[] { 1, "Bob Smith", new DateTime(2018, 06, 04), 12.34m });
            writer.Write(new object[] { 2, "Jane Doe", new DateTime(2018, 06, 05), 34.56m });
            writer.Write(new object[] { 46.9m, 23.45m, true });
            string output = stringWriter.ToString();

            Assert.AreEqual(@"First Batch,2
1,Bob Smith,20180604,12.34
2,Jane Doe,20180605,34.56
46.9,23.45,True
", output);

            var stringReader = new StringReader(output);
            var selector     = getSchemaSelector();
            var reader       = new SeparatedValueReader(stringReader, selector);

            Assert.IsTrue(reader.Read(), "The header record could not be read.");
            var headerValues = reader.GetValues();

            Assert.AreEqual(2, headerValues.Length);
            Assert.AreEqual("First Batch", headerValues[0]);
            Assert.AreEqual(2, headerValues[1]);

            Assert.IsTrue(reader.Read(), "The first data record could not be read.");
            var dataValues1 = reader.GetValues();

            Assert.AreEqual(4, dataValues1.Length);
            Assert.AreEqual(1, dataValues1[0]);
            Assert.AreEqual("Bob Smith", dataValues1[1]);
            Assert.AreEqual(new DateTime(2018, 6, 4), dataValues1[2]);
            Assert.AreEqual(12.34m, dataValues1[3]);

            Assert.IsTrue(reader.Read(), "The second data record could not be read.");
            var dataValues2 = reader.GetValues();

            Assert.AreEqual(4, dataValues2.Length);
            Assert.AreEqual(2, dataValues2[0]);
            Assert.AreEqual("Jane Doe", dataValues2[1]);
            Assert.AreEqual(new DateTime(2018, 6, 5), dataValues2[2]);
            Assert.AreEqual(34.56m, dataValues2[3]);

            Assert.IsTrue(reader.Read(), "The footer record could not be read.");
            var footerValues = reader.GetValues();

            Assert.AreEqual(3, footerValues.Length);
            Assert.AreEqual(46.9m, footerValues[0]);
            Assert.AreEqual(23.45m, footerValues[1]);
            Assert.AreEqual(true, footerValues[2]);

            Assert.IsFalse(reader.Read());
        }
        public void TestGetValues_BlankLeadingSection_ReturnsNull()
        {
            using (MemoryStream stream = new MemoryStream())
            {
                SeparatedValueOptions options = new SeparatedValueOptions()
                {
                    IsFirstRecordSchema = true
                };
                SeparatedValueSchema schema = new SeparatedValueSchema();
                schema.AddColumn(new StringColumn("leading"))
                .AddColumn(new Int32Column("id"))
                .AddColumn(new StringColumn("name"))
                .AddColumn(new DateTimeColumn("created")
                {
                    InputFormat = "M/d/yyyy", OutputFormat = "M/d/yyyy"
                });
                object[] sources = new object[] { "", 123, "Bob", new DateTime(2013, 1, 19) };

                StringWriter         stringWriter = new StringWriter();
                SeparatedValueWriter builder      = new SeparatedValueWriter(stringWriter, schema, options);
                builder.Write(sources);

                StringReader         stringReader = new StringReader(stringWriter.ToString());
                SeparatedValueReader parser       = new SeparatedValueReader(stringReader, schema, options);
                Assert.True(parser.Read(), "No records were found.");
                object[] values = parser.GetValues();
                Assert.Equal(schema.ColumnDefinitions.Count, values.Length);
                Assert.Equal(null, values[0]);
                Assert.Equal(sources[1], values[1]);
                Assert.Equal(sources[2], values[2]);
                Assert.Equal(sources[3], values[3]);
                Assert.False(parser.Read(), "Too many records were found.");
            }
        }
Exemple #3
0
        public void TestReadFlatFile_DataTableNull_Throws()
        {
            SeparatedValueSchema schema = new SeparatedValueSchema();

            schema.AddColumn(new Int32Column("id"))
            .AddColumn(new StringColumn("name"))
            .AddColumn(new DateTimeColumn("created")
            {
                InputFormat = "MM/dd/yyyy"
            })
            .AddColumn(new DecimalColumn("avg"));
            SeparatedValueOptions options = new SeparatedValueOptions()
            {
                IsFirstRecordSchema = true
            };

            using (MemoryStream stream = new MemoryStream())
            {
                using (SeparatedValueWriter builder = new SeparatedValueWriter(stream, schema, options))
                {
                    builder.Write(new object[] { 123, "Bob", new DateTime(2012, 12, 31), 3.14159m });
                }
                stream.Position = 0;

                DataTable table  = null;
                IReader   parser = new SeparatedValueReader(stream, options);
                DataTableExtensions.ReadFlatFile(table, parser);
            }
        }
        public void TestGetValues_BlankLeadingSection_ReturnsNull()
        {
            using (MemoryStream stream = new MemoryStream())
            {
                SeparatedValueOptions options = new SeparatedValueOptions()
                {
                    IsFirstRecordSchema = true
                };
                SeparatedValueSchema schema = new SeparatedValueSchema();
                schema.AddColumn(new StringColumn("leading"))
                .AddColumn(new Int32Column("id"))
                .AddColumn(new StringColumn("name"))
                .AddColumn(new DateTimeColumn("created")
                {
                    InputFormat = "M/d/yyyy", OutputFormat = "M/d/yyyy"
                });
                object[] sources = new object[] { "", 123, "Bob", new DateTime(2013, 1, 19) };
                using (SeparatedValueWriter builder = new SeparatedValueWriter(stream, schema, options))
                {
                    builder.Write(sources);
                }
                stream.Position = 0;

                SeparatedValueReader parser = new SeparatedValueReader(stream, schema, options);
                Assert.IsTrue(parser.Read(), "No records were found.");
                object[] values = parser.GetValues();
                Assert.AreEqual(schema.ColumnDefinitions.Count, values.Length, "The wrong number of values were read.");
                Assert.AreEqual(null, values[0], "The first column was not interpreted as null.");
                Assert.AreEqual(sources[1], values[1], "The second column was not parsed correctly.");
                Assert.AreEqual(sources[2], values[2], "The third column was not parsed correctly.");
                Assert.AreEqual(sources[3], values[3], "The forth column was not parsed correctly.");
                Assert.IsFalse(parser.Read(), "Too many records were found.");
            }
        }
        public void ShouldWriteSchemaIfExplicit()
        {
            StringWriter stringWriter = new StringWriter();
            // Explicitly indicate that the first record is NOT the schema
            SeparatedValueSchema schema = new SeparatedValueSchema();

            schema.AddColumn(new StringColumn("Col1"));
            SeparatedValueWriter writer = new SeparatedValueWriter(stringWriter, schema, new SeparatedValueOptions()
            {
                IsFirstRecordSchema = false
            });

            writer.WriteSchema();  // Explicitly write the schema
            writer.Write(new string[] { "a" });

            StringReader stringReader = new StringReader(stringWriter.ToString());
            var          reader       = new SeparatedValueReader(stringReader, new SeparatedValueOptions()
            {
                IsFirstRecordSchema = true
            });
            var parsedSchema = reader.GetSchema();

            Assert.Equal(schema.ColumnDefinitions.Count, parsedSchema.ColumnDefinitions.Count);
            Assert.Equal(schema.ColumnDefinitions[0].ColumnName, parsedSchema.ColumnDefinitions[0].ColumnName);

            Assert.True(reader.Read(), "The record was not retrieved after the schema.");
            Assert.False(reader.Read(), "Encountered more than the expected number of records.");
        }
Exemple #6
0
        private static string writeValues(object[] values)
        {
            var                  schema       = getSchema();
            StringWriter         stringWriter = new StringWriter();
            SeparatedValueWriter writer       = new SeparatedValueWriter(stringWriter, schema);

            writer.Write(values);

            return(stringWriter.ToString());
        }
Exemple #7
0
        public void TestReadWrite_Comments()
        {
            StringWriter         output = new StringWriter();
            SeparatedValueWriter writer = new SeparatedValueWriter(output);

            writer.Write(new[] { "a", "b", "c" });
            writer.WriteRaw("# Hello, world!!!", true);
            writer.Write(new[] { "d", "e", "f" });

            StringReader         input  = new StringReader(output.ToString());
            SeparatedValueReader reader = new SeparatedValueReader(input);

            reader.RecordRead += (sender, e) =>
            {
                e.IsSkipped = e.Values.Length > 0 && e.Values[0].StartsWith("#");
            };
            Assert.IsTrue(reader.Read());
            CollectionAssert.AreEqual(new[] { "a", "b", "c" }, reader.GetValues());
            Assert.IsTrue(reader.Read());
            CollectionAssert.AreEqual(new[] { "d", "e", "f" }, reader.GetValues());
            Assert.IsFalse(reader.Read());
        }
        public void ShouldNotWriteSchemaIfNoSchemaProvided()
        {
            StringWriter         stringWriter = new StringWriter();
            SeparatedValueWriter writer       = new SeparatedValueWriter(stringWriter, new SeparatedValueOptions()
            {
                IsFirstRecordSchema = true
            });

            writer.Write(new string[] { "a" });

            string output   = stringWriter.ToString();
            string expected = "a" + Environment.NewLine;

            Assert.Equal(expected, output);
        }
        private static string writeValues(object[] values)
        {
            var schema = getSchema();

            using (MemoryStream stream = new MemoryStream())
            {
                using (SeparatedValueWriter writer = new SeparatedValueWriter(stream, schema))
                {
                    writer.Write(values);
                }

                stream.Position = 0;
                byte[] encoded = stream.ToArray();
                return(Encoding.Default.GetString(encoded));
            }
        }
        public void ShouldRoundTrip()
        {
            const string         message      = @"Tom,Hanselman,2016-06-0426         Walking Ice,Ace
";
            StringReader         stringReader = new StringReader(message);
            SeparatedValueSchema outerSchema  = new SeparatedValueSchema();

            outerSchema.AddColumn(new StringColumn("FirstName"));
            outerSchema.AddColumn(new StringColumn("LastName"));

            FixedLengthSchema innerSchema = new FixedLengthSchema();

            innerSchema.AddColumn(new DateTimeColumn("StartDate")
            {
                InputFormat = "yyyy-MM-dd", OutputFormat = "yyyy-MM-dd"
            }, 10);
            innerSchema.AddColumn(new Int32Column("Age"), 2);
            innerSchema.AddColumn(new StringColumn("StageName"), new Window(20)
            {
                Alignment = FixedAlignment.RightAligned
            });
            outerSchema.AddColumn(new FixedLengthComplexColumn("PlayerStats", innerSchema));
            outerSchema.AddColumn(new StringColumn("Nickname"));

            SeparatedValueReader reader = new SeparatedValueReader(stringReader, outerSchema);

            Assert.True(reader.Read(), "A record should have been read.");
            object[] values = reader.GetValues();
            Assert.Equal("Tom", values[0]);
            Assert.Equal("Hanselman", values[1]);
            Assert.IsType <object[]>(values[2]);
            object[] playerValues = (object[])values[2];
            Assert.Equal(new DateTime(2016, 06, 04), playerValues[0]);
            Assert.Equal(26, playerValues[1]);
            Assert.Equal("Walking Ice", playerValues[2]);
            Assert.Equal("Ace", values[3]);

            StringWriter         stringWriter = new StringWriter();
            SeparatedValueWriter writer       = new SeparatedValueWriter(stringWriter, outerSchema);

            writer.Write(values);

            string output = stringWriter.GetStringBuilder().ToString();

            Assert.Equal(message, output);
        }
Exemple #11
0
        public void Write(string outputFilePath, DataSource dataSource, FileSchemaBase schema)
        {
            using (var fileStreamWriter = new StreamWriter(outputFilePath, true))
            {
                switch (schema)
                {
                case FixedLengthFileSchema fixedLengthFileSchema:
                    foreach (var rowData in dataSource.Data)
                    {
                        var rowSchema = fixedLengthFileSchema.FixedLengthRecordSchemas.FirstOrDefault(x => x.RecordIdentifier.Equals(rowData.Identifier));

                        if (rowSchema == null)
                        {
                            throw new Exception($"No such identifier defined: '{rowData.Identifier}'");
                        }

                        var fixedLengthWriter = new FixedLengthWriter(fileStreamWriter, rowSchema.FixedLengthSchema);
                        fixedLengthWriter.Write(rowData.DataArray);
                    }
                    break;

                case SeparatedFileSchema separatedFileSchema:
                    foreach (var rowData in dataSource.Data)
                    {
                        var rowSchema = separatedFileSchema.SeparatedRecordSchemas.FirstOrDefault(x => x.RecordIdentifier.Equals(rowData.Identifier));

                        if (rowSchema == null)
                        {
                            throw new Exception($"No such identifier defined: '{rowData.Identifier}'");
                        }

                        var separatedWriter = new SeparatedValueWriter(fileStreamWriter, rowSchema.SeparatedValueSchema, new SeparatedValueOptions
                        {
                            Separator = separatedFileSchema.Delimeter
                        });

                        separatedWriter.Write(rowData.DataArray);
                    }
                    break;
                }
            }
        }
Exemple #12
0
        public void TestReadFlatFile_ExtractsSchema_PopulatesTable()
        {
            SeparatedValueSchema schema = new SeparatedValueSchema();

            schema.AddColumn(new Int32Column("id"))
            .AddColumn(new StringColumn("name"))
            .AddColumn(new DateTimeColumn("created")
            {
                InputFormat = "MM/dd/yyyy", OutputFormat = "MM/dd/yyyy"
            })
            .AddColumn(new DecimalColumn("avg"));
            SeparatedValueOptions options = new SeparatedValueOptions()
            {
                IsFirstRecordSchema = true
            };

            using (MemoryStream stream = new MemoryStream())
            {
                using (SeparatedValueWriter builder = new SeparatedValueWriter(stream, schema, options))
                {
                    builder.Write(new object[] { 123, "Bob", new DateTime(2012, 12, 31), 3.14159m });
                }
                stream.Position = 0;

                DataTable table  = new DataTable();
                IReader   parser = new SeparatedValueReader(stream, options);
                table.ReadFlatFile(parser);
                Assert.AreEqual(4, table.Columns.Count, "The wrong number of columns were extracted.");
                Assert.IsTrue(table.Columns.Contains("id"), "The ID column was not extracted.");
                Assert.IsTrue(table.Columns.Contains("name"), "The name column was not extracted.");
                Assert.IsTrue(table.Columns.Contains("created"), "The created column was not extracted.");
                Assert.IsTrue(table.Columns.Contains("avg"), "The AVG column was not extracted.");
                Assert.AreEqual(1, table.Rows.Count, "Not all of the records were extracted.");
                DataRow  row      = table.Rows[0];
                object[] expected = new object[] { "123", "Bob", "12/31/2012", "3.14159" };
                object[] values   = row.ItemArray;
                CollectionAssert.AreEqual(expected, values, "The wrong values were extracted");
            }
        }
        public void TestReadFlatFile_ExtractsSchema_PopulatesTable()
        {
            SeparatedValueSchema schema = new SeparatedValueSchema();

            schema.AddColumn(new Int32Column("id"))
            .AddColumn(new StringColumn("name"))
            .AddColumn(new DateTimeColumn("created")
            {
                InputFormat = "MM/dd/yyyy", OutputFormat = "MM/dd/yyyy"
            })
            .AddColumn(new DecimalColumn("avg"));
            SeparatedValueOptions options = new SeparatedValueOptions()
            {
                IsFirstRecordSchema = true
            };

            StringWriter         stringWriter = new StringWriter();
            SeparatedValueWriter builder      = new SeparatedValueWriter(stringWriter, schema, options);

            builder.Write(new object[] { 123, "Bob", new DateTime(2012, 12, 31), 3.14159m });

            StringReader stringReader = new StringReader(stringWriter.ToString());
            DataTable    table        = new DataTable();
            IReader      parser       = new SeparatedValueReader(stringReader, options);

            table.ReadFlatFile(parser);
            Assert.Equal(4, table.Columns.Count);
            Assert.True(table.Columns.Contains("id"), "The ID column was not extracted.");
            Assert.True(table.Columns.Contains("name"), "The name column was not extracted.");
            Assert.True(table.Columns.Contains("created"), "The created column was not extracted.");
            Assert.True(table.Columns.Contains("avg"), "The AVG column was not extracted.");
            Assert.Equal(1, table.Rows.Count);
            DataRow row = table.Rows[0];

            object[] expected = new object[] { "123", "Bob", "12/31/2012", "3.14159" };
            object[] values   = row.ItemArray;
            Assert.Equal(expected, values);
        }
        public void TestGetValues_BlankTrailingSection_ReturnsNull()
        {
            SeparatedValueOptions options = new SeparatedValueOptions() { IsFirstRecordSchema = true };
            SeparatedValueSchema schema = new SeparatedValueSchema();
            schema.AddColumn(new Int32Column("id"))
                .AddColumn(new StringColumn("name"))
                .AddColumn(new DateTimeColumn("created") { InputFormat = "M/d/yyyy", OutputFormat = "M/d/yyyy" })
                .AddColumn(new StringColumn("trailing"));
            object[] sources = new object[] { 123, "Bob", new DateTime(2013, 1, 19), "" };

            StringWriter stringWriter = new StringWriter();
            SeparatedValueWriter builder = new SeparatedValueWriter(stringWriter, schema, options);
            builder.Write(sources);

            StringReader stringReader = new StringReader(stringWriter.ToString());
            SeparatedValueReader parser = new SeparatedValueReader(stringReader, schema, options);
            Assert.True(parser.Read(), "No records were found.");
            object[] values = parser.GetValues();
            Assert.Equal(schema.ColumnDefinitions.Count, values.Length);
            Assert.Equal(sources[0], values[0]);
            Assert.Equal(sources[1], values[1]);
            Assert.Equal(sources[2], values[2]);
            Assert.Equal(null, values[3]);
            Assert.False(parser.Read(), "Too many records were found.");
        }
        public void TestReadFlatFile_ExtractsSchema_PopulatesTable()
        {
            SeparatedValueSchema schema = new SeparatedValueSchema();
            schema.AddColumn(new Int32Column("id"))
                .AddColumn(new StringColumn("name"))
                .AddColumn(new DateTimeColumn("created") { InputFormat = "MM/dd/yyyy", OutputFormat = "MM/dd/yyyy" })
                .AddColumn(new DecimalColumn("avg"));
            SeparatedValueOptions options = new SeparatedValueOptions() { IsFirstRecordSchema = true };

            StringWriter stringWriter = new StringWriter();
            SeparatedValueWriter builder = new SeparatedValueWriter(stringWriter, schema, options);
            builder.Write(new object[] { 123, "Bob", new DateTime(2012, 12, 31), 3.14159m });

            StringReader stringReader = new StringReader(stringWriter.ToString());
            DataTable table = new DataTable();
            IReader parser = new SeparatedValueReader(stringReader, options);
            table.ReadFlatFile(parser);
            Assert.Equal(4, table.Columns.Count);
            Assert.True(table.Columns.Contains("id"), "The ID column was not extracted.");
            Assert.True(table.Columns.Contains("name"), "The name column was not extracted.");
            Assert.True(table.Columns.Contains("created"), "The created column was not extracted.");
            Assert.True(table.Columns.Contains("avg"), "The AVG column was not extracted.");
            Assert.Equal(1, table.Rows.Count);
            DataRow row = table.Rows[0];
            object[] expected = new object[] { "123", "Bob", "12/31/2012", "3.14159" };
            object[] values = row.ItemArray;
            Assert.Equal(expected, values);
        }
        private static string writeValues(object[] values)
        {
            var schema = getSchema();
            using (MemoryStream stream = new MemoryStream())
            {
                using (SeparatedValueWriter writer = new SeparatedValueWriter(stream, schema))
                {
                    writer.Write(values);
                }

                stream.Position = 0;
                byte[] encoded = stream.ToArray();
                return Encoding.Default.GetString(encoded);
            }
        }
Exemple #17
0
        private void ExportText()
        {
            var fileName = Project.Current.MapPath(FileName);

            if (string.IsNullOrWhiteSpace(fileName))
            {
                throw new ArgumentNullException("Filename is not provided.");
            }

            if (!Overwrite && File.Exists(fileName))
            {
                throw new Exception($"File '{FileName}' already exists.");
            }

            if (Overwrite && File.Exists(fileName))
            {
                File.Delete(fileName);
            }

            using var dataReader = GetDataSourceReader(_Output, DataSource,
                                                       new DataSourceParameters()
            {
                IgnoreErrors = this.IgnoreErrors, Columns = this.SelectColumns, SkipColumns = this.SkipColumns
            });

            var schema = new SeparatedValueSchema();

            int colCount = Columns != null ? Columns.Length : dataReader.FieldCount;

            int[] columnIndexes = new int[colCount];

            if (Columns != null)
            {
                for (int i = 0; i < Columns.Length; i++)
                {
                    var column = Columns[i];

                    int columnIndex = dataReader.GetOrdinal(column.ColumnName);
                    if (columnIndex < 0)
                    {
                        throw new Exception($"Cannot find column '{column.ColumnName}'.");
                    }

                    columnIndexes[i] = columnIndex;

                    var definition = CreateColumnDefinition(column);
                    schema.AddColumn(definition);
                }
            }
            else
            {
                for (int i = 0; i < dataReader.FieldCount; i++)
                {
                    columnIndexes[i] = i;

                    var column = new TextColumnDefinition()
                    {
                        ColumnName = dataReader.GetName(i),
                        ColumnType = dataReader.GetFieldType(i)
                    };
                    var definition = CreateColumnDefinition(column);
                    schema.AddColumn(definition);
                }
            }

            var options = new SeparatedValueOptions();

            if (Separator != null)
            {
                options.Separator = Separator;
            }
            if (RecordSeparator != null)
            {
                options.RecordSeparator = RecordSeparator;
            }
            options.Quote = Quote;
            options.IsFirstRecordSchema = !NoHeaderRow;
            options.PreserveWhiteSpace  = PreserveWhiteSpace;
            if (!string.IsNullOrWhiteSpace(Culture))
            {
                options.FormatProvider = new CultureInfo(Culture);
            }
            options.QuoteBehavior = QuoteBehavior;

            using var writer = new StreamWriter(File.OpenWrite(fileName));
            var csvWriter = new SeparatedValueWriter(writer, schema, options);

            int columnCount = schema.ColumnDefinitions.Count;

            object[] values = new object[columnCount];

            bool isHeader = options.IsFirstRecordSchema;

            while (dataReader.Read())
            {
                for (int i = 0; i < columnCount; i++)
                {
                    object value = dataReader.GetValue(columnIndexes[i]);
                    if (value == DBNull.Value)
                    {
                        value = null;
                    }

                    if (!isHeader)
                    {
                        value = Utils.ChangeType(schema.ColumnDefinitions[i].ColumnType, value, null);
                    }
                    values[i] = value;

                    isHeader = false;
                }

                csvWriter.Write(values);
            }
        }
        private static string writeValues(object[] values)
        {
            var schema = getSchema();
            StringWriter stringWriter = new StringWriter();
            SeparatedValueWriter writer = new SeparatedValueWriter(stringWriter, schema);
            writer.Write(values);

            return stringWriter.ToString();
        }
        public void TestGetValues_BlankTrailingSection_ReturnsNull()
        {
            using (MemoryStream stream = new MemoryStream())
            {
                SeparatedValueOptions options = new SeparatedValueOptions() { IsFirstRecordSchema = true };
                SeparatedValueSchema schema = new SeparatedValueSchema();
                schema.AddColumn(new Int32Column("id"))
                    .AddColumn(new StringColumn("name"))
                    .AddColumn(new DateTimeColumn("created") { InputFormat = "M/d/yyyy", OutputFormat = "M/d/yyyy" })
                    .AddColumn(new StringColumn("trailing"));
                object[] sources = new object[] { 123, "Bob", new DateTime(2013, 1, 19), "" };
                using (SeparatedValueWriter builder = new SeparatedValueWriter(stream, schema, options))
                {
                    builder.Write(sources);
                }
                stream.Position = 0;

                SeparatedValueReader parser = new SeparatedValueReader(stream, schema, options);
                Assert.IsTrue(parser.Read(), "No records were found.");
                object[] values = parser.GetValues();
                Assert.AreEqual(schema.ColumnDefinitions.Count, values.Length, "The wrong number of values were read.");
                Assert.AreEqual(sources[0], values[0], "The first column was not parsed correctly.");
                Assert.AreEqual(sources[1], values[1], "The second column was not parsed correctly.");
                Assert.AreEqual(sources[2], values[2], "The third column was not parsed correctly.");
                Assert.AreEqual(null, values[3], "The forth column was not interpreted as null.");
                Assert.IsFalse(parser.Read(), "Too many records were found.");
            }
        }