<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>CsvDataReader/CsvDataColumn.vb</filename>
    </added>
    <added>
      <filename>CsvDataReaderTests/data/fixed.txt</filename>
    </added>
    <added>
      <filename>CsvDataReaderTests/data/header.tsv</filename>
    </added>
    <added>
      <filename>CsvDataReaderTests/data/noheader.tsv</filename>
    </added>
    <added>
      <filename>LICENSE</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -7,6 +7,11 @@ Project(&quot;{F184B08F-C81C-45F6-A57F-5ABD9991F28F}&quot;) = &quot;WindowsApplication1&quot;, &quot;..\W
 EndProject
 Project(&quot;{F184B08F-C81C-45F6-A57F-5ABD9991F28F}&quot;) = &quot;CsvDataReaderTests&quot;, &quot;CsvDataReaderTests\CsvDataReaderTests.vbproj&quot;, &quot;{29152AF7-4C25-4891-8A80-88CE92228067}&quot;
 EndProject
+Project(&quot;{2150E333-8FDC-42A3-9474-1A3956D46DE8}&quot;) = &quot;Solution Items&quot;, &quot;Solution Items&quot;, &quot;{833A5023-BD28-418D-A8B9-523599F6A973}&quot;
+	ProjectSection(SolutionItems) = preProject
+		LICENSE = LICENSE
+	EndProjectSection
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU</diff>
      <filename>CsvDataReader.sln</filename>
    </modified>
    <modified>
      <diff>@@ -14,7 +14,8 @@ Public Class CsvDataReader
 
 #Region &quot;Privates&quot;
 
-    Private Const DEFAULT_COLUMN_SEPARATOR As String = &quot;,&quot;
+    Private Const DEFAULT_FIELD_SEPARATOR As String = &quot;,&quot;
+    Private Const DEFAULT_FIELD_DELIMITER As String = &quot;&quot;&quot;&quot;
     Private Const DEFAULT_FIELD_TYPE As FieldType = FieldType.Delimited
 
     Private Shared ReadOnly Log As ILog = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod.DeclaringType)
@@ -26,6 +27,8 @@ Public Class CsvDataReader
     Private _isClosed As Boolean = True
     Private _parser As TextFieldParser = Nothing
     Private _path As String = String.Empty
+    Private _fieldSeparator As String = DEFAULT_FIELD_SEPARATOR
+    Private _fieldType As FieldType = DEFAULT_FIELD_TYPE
 
 #End Region
 
@@ -49,6 +52,7 @@ Public Class CsvDataReader
     Public Sub New(ByVal path As String, ByVal encoding As Encoding)
         Me.Path = path
         Me.Encoding = encoding
+
     End Sub
 
     ''' &lt;summary&gt;
@@ -57,7 +61,7 @@ Public Class CsvDataReader
     ''' &lt;param name=&quot;path&quot;&gt;String. The full path to the file to reader.&lt;/param&gt;
     ''' &lt;param name=&quot;columns&quot;&gt;Collection(Of DataColumn). The collection of column definitions for the specified files columns.&lt;/param&gt;
     ''' &lt;remarks&gt;&lt;/remarks&gt;
-    Public Sub New(ByVal path As String, ByVal columns As Collection(Of DataColumn))
+    Public Sub New(ByVal path As String, ByVal columns As Collection(Of CsvDataColumn))
         Me.Path = path
 
         For Each column As DataColumn In columns
@@ -72,7 +76,7 @@ Public Class CsvDataReader
     ''' &lt;param name=&quot;columns&quot;&gt;Collection(Of DataColumn). The collection of column definitions for the specified files columns.&lt;/param&gt;
     ''' &lt;param name=&quot;encoding&quot;&gt;Encoding. The encoding of the specified file.&lt;/param&gt;
     ''' &lt;remarks&gt;&lt;/remarks&gt;
-    Public Sub New(ByVal path As String, ByVal columns As Collection(Of DataColumn), ByVal encoding As Encoding)
+    Public Sub New(ByVal path As String, ByVal columns As Collection(Of CsvDataColumn), ByVal encoding As Encoding)
         Me.Path = path
         Me.Encoding = encoding
 
@@ -86,18 +90,36 @@ Public Class CsvDataReader
 #Region &quot;Properties&quot;
 
     ''' &lt;summary&gt;
-    ''' The private TextFieldParser instance.
+    ''' Creates a new TextFieldParser instance using the current settings.
     ''' &lt;/summary&gt;
     ''' &lt;value&gt;&lt;/value&gt;
     ''' &lt;returns&gt;TextFieldParser&lt;/returns&gt;
     ''' &lt;remarks&gt;&lt;/remarks&gt;
-    Private ReadOnly Property Parser() As TextFieldParser
+    Protected Overridable ReadOnly Property Parser() As TextFieldParser
         Get
             If _parser Is Nothing Then
+                If Me.DataTable.Columns.Count = 0 And Me.FieldType = FileIO.FieldType.FixedWidth Then
+                    Throw New MalformedLineException(&quot;Unable to parse fixed width columns with no column definitions&quot;)
+                End If
+
+
                 _parser = New TextFieldParser(Me.Path, Me.Encoding)
-                _parser.SetDelimiters(DEFAULT_COLUMN_SEPARATOR)
-                _parser.TextFieldType = FieldType.Delimited
+                _parser.TextFieldType = Me.FieldType
+                _parser.HasFieldsEnclosedInQuotes = True
                 _parser.TrimWhiteSpace = True
+
+                If Me.FieldType = FileIO.FieldType.FixedWidth Then
+                    Dim columns As DataColumnCollection = Me.DataTable.Columns
+                    Dim lengths(columns.Count - 1) As Integer
+
+                    For i As Integer = 0 To columns.Count - 1
+                        lengths(i) = DirectCast(columns.Item(i), CsvDataColumn).FieldWidth
+                    Next
+
+                    _parser.FieldWidths = lengths
+                Else
+                    _parser.SetDelimiters(Me.FieldSeparator)
+                End If
             End If
 
             Return _parser
@@ -139,6 +161,44 @@ Public Class CsvDataReader
     End Property
 
     ''' &lt;summary&gt;
+    ''' Gets/sets the character(s) used to separate fields from one another.
+    ''' &lt;/summary&gt;
+    ''' &lt;value&gt;&lt;/value&gt;
+    ''' &lt;returns&gt;String&lt;/returns&gt;
+    ''' &lt;remarks&gt;&lt;/remarks&gt;
+    Public Property FieldSeparator() As String
+        Get
+            Return _fieldSeparator
+        End Get
+        Set(ByVal value As String)
+            If Not String.IsNullOrEmpty(value) Then
+                Me.FieldType = FileIO.FieldType.Delimited
+            End If
+
+            _fieldSeparator = value
+        End Set
+    End Property
+
+    ''' &lt;summary&gt;
+    ''' Gets/sets the type if fields in the file (Delimited or FixedWidth)
+    ''' &lt;/summary&gt;
+    ''' &lt;value&gt;&lt;/value&gt;
+    ''' &lt;returns&gt;FieldType&lt;/returns&gt;
+    ''' &lt;remarks&gt;&lt;/remarks&gt;
+    Public Property FieldType() As FieldType
+        Get
+            Return _fieldType
+        End Get
+        Set(ByVal value As FieldType)
+            If value = FileIO.FieldType.FixedWidth Then
+                Me.FieldSeparator = String.Empty
+            End If
+
+            _fieldType = value
+        End Set
+    End Property
+
+    ''' &lt;summary&gt;
     ''' Gets the DataTable for the current file.
     ''' &lt;/summary&gt;
     ''' &lt;value&gt;&lt;/value&gt;
@@ -248,17 +308,23 @@ Public Class CsvDataReader
             _isClosed = False
 
             Dim fields() As String = Me.Parser.ReadFields
-
+            Debug.WriteLine(fields.Length)
             REM Turn empty strings into Nothing, which Row turns to DbNull if the Column allows it
             REM Row.Add will throw an exception if the column does not allow nulls
             For f = 0 To fields.Length - 1
                 Dim value As String = fields(f)
 
+                Log.DebugFormat(&quot;Field({0})={1}&quot;, f, value)
+                Log.DebugFormat(&quot;Field({0}).Length={1}&quot;, f, value.Length)
+
                 If String.IsNullOrEmpty(value) Then
                     fields(f) = Nothing
                 Else
                     fields(f) = value
                 End If
+
+                Log.DebugFormat(&quot;Field({0})={1}&quot;, f, value)
+                Log.DebugFormat(&quot;Field({0}).Length={1}&quot;, f, value.Length)
             Next
 
             Me.DataTable.Rows.Add(fields)</diff>
      <filename>CsvDataReader/CsvDataReader.vb</filename>
    </modified>
    <modified>
      <diff>@@ -53,6 +53,9 @@
     &lt;Import Include=&quot;System.Diagnostics&quot; /&gt;
   &lt;/ItemGroup&gt;
   &lt;ItemGroup&gt;
+    &lt;Compile Include=&quot;CsvDataColumn.vb&quot;&gt;
+      &lt;SubType&gt;Component&lt;/SubType&gt;
+    &lt;/Compile&gt;
     &lt;Compile Include=&quot;CsvDataReader.vb&quot; /&gt;
     &lt;Compile Include=&quot;My Project\AssemblyInfo.vb&quot; /&gt;
     &lt;Compile Include=&quot;My Project\Application.Designer.vb&quot;&gt;</diff>
      <filename>CsvDataReader/CsvDataReader.vbproj</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,6 @@
 &#65279;Imports System.IO
 Imports System.Collections.ObjectModel
+Imports Microsoft.VisualBasic.FileIO
 Imports NUnit.Framework
 Imports ChrisLaco.Data
 
@@ -23,361 +24,136 @@ Public Class CsvDataReaderTests
 
 #End Region
 
+#Region &quot;Comma Seperated Values Tests&quot;
+
     &lt;Test(Description:=&quot;Test Cav file with header&quot;)&gt; _
     Public Sub CsvWithHeader()
         Using reader As IDataReader = New CsvDataReader(&quot;data\header.csv&quot;)
-            Assert.IsInstanceOfType(GetType(CsvDataReader), reader, &quot;Is instance of CsvDataReader&quot;)
-            Assert.AreEqual(6, reader.FieldCount, &quot;Has correct number of fields&quot;)
-            Assert.AreEqual(0, reader.Depth, &quot;Depth is always zero&quot;)
-
-            Assert.AreEqual(&quot;STRING&quot;, reader.GetName(0), &quot;Has first column name&quot;)
-            Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(0), &quot;First column type name is String&quot;)
-            Assert.AreEqual(0, reader.GetOrdinal(&quot;String&quot;), &quot;First column ordinal is correct&quot;)
-
-            Assert.AreEqual(&quot;INTEGER&quot;, reader.GetName(1), &quot;Has second column name&quot;)
-            Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(1), &quot;Second column type name is String&quot;)
-            Assert.AreEqual(1, reader.GetOrdinal(&quot;INTEGER&quot;), &quot;Second column ordinal is correct&quot;)
-
-            Assert.AreEqual(&quot;DATETIME&quot;, reader.GetName(2), &quot;Has third column name&quot;)
-            Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(2), &quot;Third column type name is String&quot;)
-            Assert.AreEqual(2, reader.GetOrdinal(&quot;DATETIME&quot;), &quot;Third column ordinal is correct&quot;)
-
-            Assert.AreEqual(&quot;DECIMAL&quot;, reader.GetName(3), &quot;Has fourth column name&quot;)
-            Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(3), &quot;Fourth column type name is String&quot;)
-            Assert.AreEqual(3, reader.GetOrdinal(&quot;DECIMAL&quot;), &quot;Fourth column ordinal is correct&quot;)
-
-            Assert.AreEqual(&quot;GUID&quot;, reader.GetName(4), &quot;Has fifth column name&quot;)
-            Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(4), &quot;Fifth column type name is String&quot;)
-            Assert.AreEqual(4, reader.GetOrdinal(&quot;GUID&quot;), &quot;Fifth column ordinal is correct&quot;)
-
-            Assert.AreEqual(&quot;BOOLEAN&quot;, reader.GetName(5), &quot;Has sixth column name&quot;)
-            Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(5), &quot;Sixth column type name is String&quot;)
-            Assert.AreEqual(5, reader.GetOrdinal(&quot;BOOLEAN&quot;), &quot;Sixth column ordinal is correct&quot;)
-
-
-            Assert.IsTrue(reader.Read, &quot;Read first line&quot;)
-            Dim values(reader.FieldCount - 1) As Object
-            Assert.AreEqual(6, reader.GetValues(values), &quot;GetValues returns the number of columns&quot;)
-            Assert.AreEqual(6, values.Length, &quot;Values array has corrent length&quot;)
-
-            Assert.AreEqual(&quot;Christopher&quot;, reader.GetString(0), &quot;First column value is correct&quot;)
-            Assert.AreEqual(GetType(String), reader.GetFieldType(0), &quot;First column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(0), &quot;First column is not null&quot;)
-            Assert.AreEqual(values(0), reader.GetValue(0), &quot;GetValues item sames as GetValue&quot;)
-            Assert.AreEqual(values(0), reader.Item(0), &quot;GetValues item sames as Item&quot;)
-            Assert.AreEqual(values(0), reader.Item(reader.GetName(0)), &quot;GetValues item sames as Item&quot;)
-            Assert.AreEqual(&quot;C&quot;, reader.GetChar(0).ToString, &quot;GetChar returns first character&quot;)
-            Assert.AreEqual(11, reader.GetChars(0, Nothing, Nothing, Nothing, Nothing), &quot;GetChars returns length when no buffer is passed&quot;)
-            Dim chars(reader.GetString(0).Length - 1) As Char
-            Assert.AreEqual(11, reader.GetChars(0, 0, chars, 0, 11), &quot;Read characters from column&quot;)
-            Assert.AreEqual(11, chars.Length, &quot;Read correct number of character&quot;)
-            Assert.AreEqual(&quot;C&quot;, chars(0).ToString)
-            Assert.AreEqual(&quot;h&quot;, chars(1).ToString)
-            Assert.AreEqual(&quot;r&quot;, chars(2).ToString)
-            Assert.AreEqual(&quot;i&quot;, chars(3).ToString)
-            Assert.AreEqual(&quot;s&quot;, chars(4).ToString)
-            Assert.AreEqual(&quot;t&quot;, chars(5).ToString)
-            Assert.AreEqual(&quot;o&quot;, chars(6).ToString)
-            Assert.AreEqual(&quot;p&quot;, chars(7).ToString)
-            Assert.AreEqual(&quot;h&quot;, chars(8).ToString)
-            Assert.AreEqual(&quot;e&quot;, chars(9).ToString)
-            Assert.AreEqual(&quot;r&quot;, chars(10).ToString)
-
-            Assert.AreEqual(11, reader.GetBytes(0, Nothing, Nothing, Nothing, Nothing), &quot;GetBytes returns length when no buffer is passed&quot;)
-            Assert.AreEqual(Convert.ToByte(Convert.ToChar(&quot;C&quot;)), reader.GetByte(0), &quot;GetByte returns first&quot;)
-            Dim bytes(reader.GetString(0).Length - 1) As Byte
-            Assert.AreEqual(11, reader.GetBytes(0, 0, bytes, 0, 11), &quot;Read bytes from column&quot;)
-            Assert.AreEqual(11, bytes.Length, &quot;Read correct number of bytes&quot;)
-            Assert.AreEqual(67, bytes(0))
-            Assert.AreEqual(104, bytes(1))
-            Assert.AreEqual(114, bytes(2))
-            Assert.AreEqual(105, bytes(3))
-            Assert.AreEqual(115, bytes(4))
-            Assert.AreEqual(116, bytes(5))
-            Assert.AreEqual(111, bytes(6))
-            Assert.AreEqual(112, bytes(7))
-            Assert.AreEqual(104, bytes(8))
-            Assert.AreEqual(101, bytes(9))
-            Assert.AreEqual(114, bytes(10))
-
-
-
-
-
-            Assert.AreEqual(&quot;35&quot;, reader.GetString(1), &quot;Second column value is correct&quot;)
-            Assert.AreEqual(Convert.ToInt16(35), reader.GetInt16(1), &quot;Second column value is correct as Int16&quot;)
-            Assert.AreEqual(Convert.ToInt32(35), reader.GetInt32(1), &quot;Second column value is correct as Int32&quot;)
-            Assert.AreEqual(Convert.ToInt64(35), reader.GetInt64(1), &quot;Second column value is correct as Int64&quot;)
-            Assert.AreEqual(Convert.ToSingle(35), reader.GetFloat(1), &quot;Second column value is correct as Float/Single&quot;)
-            Assert.AreEqual(Convert.ToDouble(35), reader.GetDouble(1), &quot;Second column value is correct as Double&quot;)
-            Assert.AreEqual(Convert.ToDecimal(35), reader.GetDecimal(1), &quot;Second column value is correct as Decimal&quot;)
-            Assert.AreEqual(GetType(String), reader.GetFieldType(1), &quot;Second column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(1), &quot;Second column is not null&quot;)
-            Assert.AreEqual(values(1), reader.GetValue(1), &quot;GetValues item sames as GetValue&quot;)
-            Assert.AreEqual(values(1), reader.Item(1), &quot;GetValues item sames as Item&quot;)
-            Assert.AreEqual(values(1), reader.Item(reader.GetName(1)), &quot;GetValues item sames as Item&quot;)
-            Assert.AreEqual(&quot;3&quot;, reader.GetChar(1).ToString, &quot;GetChar returns first character&quot;)
-
-            Assert.AreEqual(&quot;1/2/2003 2:34:56&quot;, reader.GetString(2), &quot;Third column value is correct&quot;)
-            Assert.AreEqual(DateTime.Parse(&quot;1/2/2003 2:34:56&quot;), reader.GetDateTime(2), &quot;Third column value is correct as DateTime&quot;)
-            Assert.AreEqual(GetType(String), reader.GetFieldType(2), &quot;Third column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(2), &quot;Third column is not null&quot;)
-            Assert.AreEqual(values(2), reader.GetValue(2), &quot;GetValues item sames as GetValue&quot;)
-            Assert.AreEqual(values(2), reader.Item(2), &quot;GetValues item sames as Item&quot;)
-            Assert.AreEqual(values(2), reader.Item(reader.GetName(2)), &quot;GetValues item sames as Item&quot;)
-            Assert.AreEqual(&quot;1&quot;, reader.GetChar(2).ToString, &quot;GetChar returns first character&quot;)
-
-            Assert.AreEqual(&quot;1.23&quot;, reader.GetString(3), &quot;Fourth column value is correct&quot;)
-            Assert.AreEqual(Convert.ToSingle(1.23), reader.GetFloat(3), &quot;Fourth column value is correct as Float/Single&quot;)
-            Assert.AreEqual(Convert.ToDouble(1.23), reader.GetDouble(3), &quot;Fourth column value is correct as Double&quot;)
-            Assert.AreEqual(Convert.ToDecimal(1.23), reader.GetDecimal(3), &quot;Fourth column value is correct as Decimal&quot;)
-            Assert.AreEqual(GetType(String), reader.GetFieldType(3), &quot;Fourth column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(3), &quot;Fourth column is not null&quot;)
-            Assert.AreEqual(values(3), reader.GetValue(3), &quot;GetValues item sames as GetValue&quot;)
-            Assert.AreEqual(values(3), reader.Item(3), &quot;GetValues item sames as Item&quot;)
-            Assert.AreEqual(values(3), reader.Item(reader.GetName(3)), &quot;GetValues item sames as Item&quot;)
-            Assert.AreEqual(&quot;1&quot;, reader.GetChar(3).ToString, &quot;GetChar returns first character&quot;)
-
-            Assert.AreEqual(&quot;11111111-2222-3333-4444-555555555555&quot;, reader.GetString(4), &quot;Fifth column value is correct&quot;)
-            Assert.AreEqual(New Guid(&quot;11111111-2222-3333-4444-555555555555&quot;), reader.GetGuid(4), &quot;Fifth column value is correct as Decimal&quot;)
-            Assert.AreEqual(GetType(String), reader.GetFieldType(4), &quot;Fifth column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(4), &quot;Fifth column is not null&quot;)
-            Assert.AreEqual(values(4), reader.GetValue(4), &quot;GetValues item sames as GetValue&quot;)
-            Assert.AreEqual(values(4), reader.Item(4), &quot;GetValues item sames as Item&quot;)
-            Assert.AreEqual(values(4), reader.Item(reader.GetName(4)), &quot;GetValues item sames as Item&quot;)
-            Assert.AreEqual(&quot;1&quot;, reader.GetChar(4).ToString, &quot;GetChar returns first character&quot;)
-
-            Assert.AreEqual(&quot;True&quot;, reader.GetString(5), &quot;Sixth column value is correct&quot;)
-            Assert.IsTrue(reader.GetBoolean(5), &quot;Sixth column value is correct as Boolean&quot;)
-            Assert.AreEqual(GetType(String), reader.GetFieldType(5), &quot;Sixth column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(5), &quot;Sixth column is not null&quot;)
-            Assert.AreEqual(values(5), reader.GetValue(5), &quot;GetValues item sames as GetValue&quot;)
-            Assert.AreEqual(values(5), reader.Item(5), &quot;GetValues item sames as Item&quot;)
-            Assert.AreEqual(values(5), reader.Item(reader.GetName(5)), &quot;GetValues item sames as Item&quot;)
-            Assert.AreEqual(&quot;T&quot;, reader.GetChar(5).ToString, &quot;GetChar returns first character&quot;)
-
-
-            Assert.IsTrue(reader.Read, &quot;Read second line&quot;)
-            Array.Clear(values, 0, values.Length)
-            Array.Resize(values, 2)
-            Assert.AreEqual(2, reader.GetValues(values), &quot;GetValues returns the number value slize&quot;)
-            Assert.AreEqual(2, values.Length, &quot;Values array has corrent length&quot;)
-
-            Assert.IsEmpty(reader.GetString(0), &quot;First column value is empty&quot;)
-            Assert.AreEqual(GetType(System.DBNull), reader.GetFieldType(0), &quot;First column is System.DBNull&quot;)
-            Assert.IsTrue(reader.IsDBNull(0), &quot;First column is null&quot;)
-            Assert.AreEqual(values(0), reader.GetValue(0), &quot;GetValues item sames as GetValue&quot;)
-            Assert.AreEqual(Char.MinValue, reader.GetChar(0), &quot;GetChar returns Char.MinValue for DbNull&quot;)
-
-            Assert.AreEqual(&quot;23&quot;, reader.GetString(1), &quot;Second column value is correct&quot;)
-            Assert.AreEqual(Convert.ToInt16(23), reader.GetInt16(1), &quot;Second column value is correct as Int16&quot;)
-            Assert.AreEqual(Convert.ToInt32(23), reader.GetInt32(1), &quot;Second column value is correct as Int32&quot;)
-            Assert.AreEqual(Convert.ToInt64(23), reader.GetInt64(1), &quot;Second column value is correct as Int64&quot;)
-            Assert.AreEqual(Convert.ToSingle(23), reader.GetFloat(1), &quot;Second column value is correct as Float/Single&quot;)
-            Assert.AreEqual(Convert.ToDouble(23), reader.GetDouble(1), &quot;Second column value is correct as Double&quot;)
-            Assert.AreEqual(Convert.ToDecimal(23), reader.GetDecimal(1), &quot;Second column value is correct as Decimal&quot;)
-            Assert.AreEqual(GetType(String), reader.GetFieldType(1), &quot;Second column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(1), &quot;Second column is not null&quot;)
-            Assert.AreEqual(values(1), reader.GetValue(1), &quot;GetValues item sames as GetValue&quot;)
-
-            Assert.AreEqual(&quot;2/3/2004&quot;, reader.GetString(2), &quot;Third column value is correct&quot;)
-            Assert.AreEqual(DateTime.Parse(&quot;2/3/2004&quot;), reader.GetDateTime(2), &quot;Third column value is correct as DateTime&quot;)
-            Assert.AreEqual(GetType(String), reader.GetFieldType(2), &quot;Third column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(2), &quot;Third column is not null&quot;)
-
-            Assert.AreEqual(&quot;1.342&quot;, reader.GetString(3), &quot;Fourth column value is correct&quot;)
-            Assert.AreEqual(Convert.ToSingle(1.342), reader.GetFloat(3), &quot;Fourth column value is correct as Float/Single&quot;)
-            Assert.AreEqual(Convert.ToDouble(1.342), reader.GetDouble(3), &quot;Fourth column value is correct as Double&quot;)
-            Assert.AreEqual(Convert.ToDecimal(1.342), reader.GetDecimal(3), &quot;Fourth column value is correct as Decimal&quot;)
-            Assert.AreEqual(GetType(String), reader.GetFieldType(3), &quot;Fourth column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(3), &quot;Fourth column is not null&quot;)
-
-            Assert.IsEmpty(reader.GetString(4), &quot;Fifth column value is empty&quot;)
-            Assert.AreEqual(GetType(System.DBNull), reader.GetFieldType(4), &quot;Fifth column is System.DBNull&quot;)
-            Assert.IsTrue(reader.IsDBNull(4), &quot;Fifth column is null&quot;)
-
-            Assert.AreEqual(&quot;False&quot;, reader.GetString(5), &quot;Sixth column value is correct&quot;)
-            Assert.IsFalse(reader.GetBoolean(5), &quot;Sixth column value is correct as Boolean&quot;)
-            Assert.AreEqual(GetType(String), reader.GetFieldType(5), &quot;Sixth column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(5), &quot;Sixth column is not null&quot;)
-
-            Assert.IsFalse(reader.IsClosed, &quot;Reader is still open until last read&quot;)
-            Assert.IsFalse(reader.Read, &quot;End of file&quot;)
-            Assert.IsFalse(reader.NextResult, &quot;NextResult always returns false&quot;)
-            Assert.AreEqual(-1, reader.RecordsAffected, &quot;RecordsAffected always returns -1&quot;)
-            Assert.IsTrue(reader.IsClosed, &quot;Reader is closed after final read&quot;)
-
-            Try
-                reader.GetData(0)
-                Assert.Fail(&quot;No exception thrown for GetData&quot;)
-            Catch ex As Exception
-                Assert.IsInstanceOfType(GetType(NotImplementedException), ex, &quot;GetData threw NotImplementedException&quot;)
-            End Try
+            ValidateHeaderedReader(reader)
+        End Using
+    End Sub
+
+    &lt;Test(Description:=&quot;Test Cav file with header and encoding&quot;)&gt; _
+    Public Sub CsvWithHeaderWithEncoding()
+        Using reader As IDataReader = New CsvDataReader(&quot;data\header.csv&quot;, System.Text.Encoding.ASCII)
+            ValidateHeaderedReader(reader)
         End Using
     End Sub
 
-    &lt;Test(Description:=&quot;Test Cav file with defined columns&quot;)&gt; _
+    &lt;Test(Description:=&quot;Test Csv file with defined columns&quot;)&gt; _
     Public Sub CsvWithColumns()
-        Dim columns As New Collection(Of DataColumn)
-        columns.Add(New DataColumn(&quot;STRING&quot;, GetType(String)))
-        columns.Add(New DataColumn(&quot;INTEGER&quot;, GetType(Integer)))
-        columns.Add(New DataColumn(&quot;DATETIME&quot;, GetType(DateTime)))
-        columns.Add(New DataColumn(&quot;DECIMAL&quot;, GetType(Decimal)))
-        columns.Add(New DataColumn(&quot;GUID&quot;, GetType(Guid)))
-        columns.Add(New DataColumn(&quot;BOOLEAN&quot;, GetType(Boolean)))
+        Dim columns As New Collection(Of CsvDataColumn)
+        columns.Add(New CsvDataColumn(&quot;STRING&quot;, GetType(String)))
+        columns.Add(New CsvDataColumn(&quot;INTEGER&quot;, GetType(Integer)))
+        columns.Add(New CsvDataColumn(&quot;DATETIME&quot;, GetType(DateTime)))
+        columns.Add(New CsvDataColumn(&quot;DECIMAL&quot;, GetType(Decimal)))
+        columns.Add(New CsvDataColumn(&quot;GUID&quot;, GetType(Guid)))
+        columns.Add(New CsvDataColumn(&quot;BOOLEAN&quot;, GetType(Boolean)))
 
         Using reader As IDataReader = New CsvDataReader(&quot;data\noheader.csv&quot;, columns)
-            Assert.IsInstanceOfType(GetType(CsvDataReader), reader, &quot;Is instance of CsvDataReader&quot;)
-            Assert.AreEqual(6, reader.FieldCount, &quot;Has correct number of fields&quot;)
+            Dim schemaTable As DataTable = reader.GetSchemaTable
+            For c As Integer = 0 To schemaTable.Columns.Count - 1
+                Me.AreEqual(columns.Item(c), schemaTable.Columns.Item(c))
+            Next
 
+            ValidateColumnedReader(reader)
+        End Using
+    End Sub
 
-            Assert.AreEqual(&quot;STRING&quot;, reader.GetName(0), &quot;Has first column name&quot;)
-            Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(0), &quot;First column type name is String&quot;)
-            Assert.AreEqual(0, reader.GetOrdinal(&quot;String&quot;), &quot;First column ordinal is correct&quot;)
+    &lt;Test(Description:=&quot;Test Csv file with defined columns with encoding&quot;)&gt; _
+    Public Sub CsvWithColumnsAndEncoding()
+        Dim columns As New Collection(Of CsvDataColumn)
+        columns.Add(New CsvDataColumn(&quot;STRING&quot;, GetType(String)))
+        columns.Add(New CsvDataColumn(&quot;INTEGER&quot;, GetType(Integer)))
+        columns.Add(New CsvDataColumn(&quot;DATETIME&quot;, GetType(DateTime)))
+        columns.Add(New CsvDataColumn(&quot;DECIMAL&quot;, GetType(Decimal)))
+        columns.Add(New CsvDataColumn(&quot;GUID&quot;, GetType(Guid)))
+        columns.Add(New CsvDataColumn(&quot;BOOLEAN&quot;, GetType(Boolean)))
+
+        Using reader As IDataReader = New CsvDataReader(&quot;data\noheader.csv&quot;, columns, System.Text.Encoding.ASCII)
+            Dim schemaTable As DataTable = reader.GetSchemaTable
+            For c As Integer = 0 To schemaTable.Columns.Count - 1
+                Me.AreEqual(columns.Item(c), schemaTable.Columns.Item(c))
+            Next
+
+            ValidateColumnedReader(reader)
+        End Using
+    End Sub
+
+#End Region
+
+#Region &quot;Tab Seperated Values Tests&quot;
+
+    &lt;Test(Description:=&quot;Test Tsv file with header&quot;)&gt; _
+    Public Sub TsvWithHeader()
+        Using reader As IDataReader = New CsvDataReader(&quot;data\header.tsv&quot;)
+            DirectCast(reader, CsvDataReader).FieldSeparator = vbTab
+            ValidateHeaderedReader(reader)
+        End Using
+    End Sub
 
+    &lt;Test(Description:=&quot;Test Tsv file with defined columns&quot;)&gt; _
+    Public Sub TsvWithColumns()
+        Dim columns As New Collection(Of CsvDataColumn)
+        columns.Add(New CsvDataColumn(&quot;STRING&quot;, GetType(String)))
+        columns.Add(New CsvDataColumn(&quot;INTEGER&quot;, GetType(Integer)))
+        columns.Add(New CsvDataColumn(&quot;DATETIME&quot;, GetType(DateTime)))
+        columns.Add(New CsvDataColumn(&quot;DECIMAL&quot;, GetType(Decimal)))
+        columns.Add(New CsvDataColumn(&quot;GUID&quot;, GetType(Guid)))
+        columns.Add(New CsvDataColumn(&quot;BOOLEAN&quot;, GetType(Boolean)))
+
+        Using reader As IDataReader = New CsvDataReader(&quot;data\noheader.tsv&quot;, columns)
+            DirectCast(reader, CsvDataReader).FieldSeparator = vbTab
 
             Dim schemaTable As DataTable = reader.GetSchemaTable
             For c As Integer = 0 To schemaTable.Columns.Count - 1
                 Me.AreEqual(columns.Item(c), schemaTable.Columns.Item(c))
             Next
 
+            ValidateColumnedReader(reader)
+        End Using
+    End Sub
+
+#End Region
+
+#Region &quot;Fixed Field Tests&quot;
+
+    &lt;Test(Description:=&quot;Test fixed width file without columns&quot;)&gt; _
+    &lt;ExpectedException(GetType(MalformedLineException))&gt; _
+    Public Sub FixedWidthNoColumns()
+        Using reader As IDataReader = New CsvDataReader(&quot;data\fixed.txt&quot;)
+            DirectCast(reader, CsvDataReader).FieldType = FieldType.FixedWidth
+
+            reader.Read()
+        End Using
+    End Sub
+
+    &lt;Test(Description:=&quot;Test fixed width file with defined columns&quot;)&gt; _
+    Public Sub FixedWidthWithColumns()
+        Dim columns As New Collection(Of CsvDataColumn)
+        columns.Add(New CsvDataColumn(&quot;STRING&quot;, GetType(String), 15))
+        columns.Add(New CsvDataColumn(&quot;INTEGER&quot;, GetType(Integer), 4))
+        columns.Add(New CsvDataColumn(&quot;DATETIME&quot;, GetType(DateTime), 20))
+        columns.Add(New CsvDataColumn(&quot;DECIMAL&quot;, GetType(Decimal), 8))
+        columns.Add(New CsvDataColumn(&quot;GUID&quot;, GetType(Guid), 38))
+        columns.Add(New CsvDataColumn(&quot;BOOLEAN&quot;, GetType(Boolean), 5))
+
+        Using reader As IDataReader = New CsvDataReader(&quot;data\fixed.txt&quot;, columns)
+            DirectCast(reader, CsvDataReader).FieldSeparator = &quot;,&quot;
+            DirectCast(reader, CsvDataReader).FieldType = FieldType.FixedWidth
+            Assert.IsTrue(String.IsNullOrEmpty(DirectCast(reader, CsvDataReader).FieldSeparator), &quot;FieldSeparator is empty after setting fixed width&quot;)
 
-            Assert.AreEqual(&quot;INTEGER&quot;, reader.GetName(1), &quot;Has second column name&quot;)
-            Assert.AreEqual(&quot;Int32&quot;, reader.GetDataTypeName(1), &quot;Second column type name is String&quot;)
-            Assert.AreEqual(1, reader.GetOrdinal(&quot;INTEGER&quot;), &quot;Second column ordinal is correct&quot;)
-
-            Assert.AreEqual(&quot;DATETIME&quot;, reader.GetName(2), &quot;Has third column name&quot;)
-            Assert.AreEqual(&quot;DateTime&quot;, reader.GetDataTypeName(2), &quot;Third column type name is String&quot;)
-            Assert.AreEqual(2, reader.GetOrdinal(&quot;DATETIME&quot;), &quot;Third column ordinal is correct&quot;)
-
-            Assert.AreEqual(&quot;DECIMAL&quot;, reader.GetName(3), &quot;Has fourth column name&quot;)
-            Assert.AreEqual(&quot;Decimal&quot;, reader.GetDataTypeName(3), &quot;Fourth column type name is String&quot;)
-            Assert.AreEqual(3, reader.GetOrdinal(&quot;DECIMAL&quot;), &quot;Fourth column ordinal is correct&quot;)
-
-            Assert.AreEqual(&quot;GUID&quot;, reader.GetName(4), &quot;Has fifth column name&quot;)
-            Assert.AreEqual(&quot;Guid&quot;, reader.GetDataTypeName(4), &quot;Fifth column type name is String&quot;)
-            Assert.AreEqual(4, reader.GetOrdinal(&quot;GUID&quot;), &quot;Fifth column ordinal is correct&quot;)
-
-            Assert.AreEqual(&quot;BOOLEAN&quot;, reader.GetName(5), &quot;Has sixth column name&quot;)
-            Assert.AreEqual(&quot;Boolean&quot;, reader.GetDataTypeName(5), &quot;Sixth column type name is Boolean&quot;)
-            Assert.AreEqual(5, reader.GetOrdinal(&quot;BOOLEAN&quot;), &quot;Sixth column ordinal is correct&quot;)
-
-
-            Assert.IsTrue(reader.Read, &quot;Read first line&quot;)
-            Assert.AreEqual(&quot;Christopher&quot;, reader.GetString(0), &quot;First column value is correct&quot;)
-            Assert.AreEqual(GetType(String), reader.GetFieldType(0), &quot;First column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(0), &quot;First column is not null&quot;)
-            Assert.AreEqual(&quot;C&quot;, reader.GetChar(0).ToString, &quot;GetChar returns first character&quot;)
-            Assert.AreEqual(11, reader.GetChars(0, Nothing, Nothing, Nothing, Nothing), &quot;GetChars returns length when no buffer is passed&quot;)
-            Dim chars(reader.GetString(0).Length - 1) As Char
-            Assert.AreEqual(11, reader.GetChars(0, 0, chars, 0, 11), &quot;Read characters from column&quot;)
-            Assert.AreEqual(11, chars.Length, &quot;Read correct number of character&quot;)
-            Assert.AreEqual(&quot;C&quot;, chars(0).ToString)
-            Assert.AreEqual(&quot;h&quot;, chars(1).ToString)
-            Assert.AreEqual(&quot;r&quot;, chars(2).ToString)
-            Assert.AreEqual(&quot;i&quot;, chars(3).ToString)
-            Assert.AreEqual(&quot;s&quot;, chars(4).ToString)
-            Assert.AreEqual(&quot;t&quot;, chars(5).ToString)
-            Assert.AreEqual(&quot;o&quot;, chars(6).ToString)
-            Assert.AreEqual(&quot;p&quot;, chars(7).ToString)
-            Assert.AreEqual(&quot;h&quot;, chars(8).ToString)
-            Assert.AreEqual(&quot;e&quot;, chars(9).ToString)
-            Assert.AreEqual(&quot;r&quot;, chars(10).ToString)
-
-            Assert.AreEqual(11, reader.GetBytes(0, Nothing, Nothing, Nothing, Nothing), &quot;GetBytes returns length when no buffer is passed&quot;)
-            Assert.AreEqual(Convert.ToByte(Convert.ToChar(&quot;C&quot;)), reader.GetByte(0), &quot;GetByte returns first&quot;)
-            Dim bytes(reader.GetString(0).Length - 1) As Byte
-            Assert.AreEqual(11, reader.GetBytes(0, 0, bytes, 0, 11), &quot;Read bytes from column&quot;)
-            Assert.AreEqual(11, bytes.Length, &quot;Read correct number of bytes&quot;)
-            Assert.AreEqual(67, bytes(0))
-            Assert.AreEqual(104, bytes(1))
-            Assert.AreEqual(114, bytes(2))
-            Assert.AreEqual(105, bytes(3))
-            Assert.AreEqual(115, bytes(4))
-            Assert.AreEqual(116, bytes(5))
-            Assert.AreEqual(111, bytes(6))
-            Assert.AreEqual(112, bytes(7))
-            Assert.AreEqual(104, bytes(8))
-            Assert.AreEqual(101, bytes(9))
-            Assert.AreEqual(114, bytes(10))
-
-            Assert.AreEqual(&quot;35&quot;, reader.GetString(1), &quot;Second column value is correct&quot;)
-            Assert.AreEqual(Convert.ToInt16(35), reader.GetInt16(1), &quot;Second column value is correct as Int16&quot;)
-            Assert.AreEqual(Convert.ToInt32(35), reader.GetInt32(1), &quot;Second column value is correct as Int32&quot;)
-            Assert.AreEqual(Convert.ToInt64(35), reader.GetInt64(1), &quot;Second column value is correct as Int64&quot;)
-            Assert.AreEqual(Convert.ToSingle(35), reader.GetFloat(1), &quot;Second column value is correct as Float/Single&quot;)
-            Assert.AreEqual(Convert.ToDouble(35), reader.GetDouble(1), &quot;Second column value is correct as Double&quot;)
-            Assert.AreEqual(Convert.ToDecimal(35), reader.GetDecimal(1), &quot;Second column value is correct as Decimal&quot;)
-            Assert.AreEqual(GetType(Int32), reader.GetFieldType(1), &quot;Second column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(1), &quot;Second column is not null&quot;)
-
-            Assert.AreEqual(&quot;1/2/2003 2:34:56 AM&quot;, reader.GetString(2), &quot;Third column value is correct&quot;)
-            Assert.AreEqual(DateTime.Parse(&quot;1/2/2003 2:34:56&quot;), reader.GetDateTime(2), &quot;Third column value is correct as DateTime&quot;)
-            Assert.AreEqual(GetType(DateTime), reader.GetFieldType(2), &quot;Third column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(2), &quot;Third column is not null&quot;)
-
-            Assert.AreEqual(&quot;1.23&quot;, reader.GetString(3), &quot;Fourth column value is correct&quot;)
-            Assert.AreEqual(Convert.ToSingle(1.23), reader.GetFloat(3), &quot;Fourth column value is correct as Float/Single&quot;)
-            Assert.AreEqual(Convert.ToDouble(1.23), reader.GetDouble(3), &quot;Fourth column value is correct as Double&quot;)
-            Assert.AreEqual(Convert.ToDecimal(1.23), reader.GetDecimal(3), &quot;Fourth column value is correct as Decimal&quot;)
-            Assert.AreEqual(GetType(Decimal), reader.GetFieldType(3), &quot;Fourth column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(3), &quot;Fourth column is not null&quot;)
-
-            Assert.AreEqual(&quot;11111111-2222-3333-4444-555555555555&quot;, reader.GetString(4), &quot;Fifth column value is correct&quot;)
-            Assert.AreEqual(New Guid(&quot;11111111-2222-3333-4444-555555555555&quot;), reader.GetGuid(4), &quot;Fifth column value is correct as Decimal&quot;)
-            Assert.AreEqual(GetType(Guid), reader.GetFieldType(4), &quot;Fifth column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(4), &quot;Fifth column is not null&quot;)
-
-            Assert.AreEqual(&quot;True&quot;, reader.GetString(5), &quot;Sixth column value is correct&quot;)
-            Assert.IsTrue(reader.GetBoolean(5), &quot;Sixth column value is correct as Boolean&quot;)
-            Assert.AreEqual(GetType(Boolean), reader.GetFieldType(5), &quot;Sixth column is System.Boolean&quot;)
-            Assert.IsFalse(reader.IsDBNull(5), &quot;Sixth column is not null&quot;)
-
-
-            Assert.IsTrue(reader.Read, &quot;Read second line&quot;)
-            Assert.IsEmpty(reader.GetString(0), &quot;First column value is empty&quot;)
-            Assert.AreEqual(GetType(System.DBNull), reader.GetFieldType(0), &quot;First column is System.DBNull&quot;)
-            Assert.IsTrue(reader.IsDBNull(0), &quot;First column is null&quot;)
-
-            Assert.AreEqual(&quot;23&quot;, reader.GetString(1), &quot;Second column value is correct&quot;)
-            Assert.AreEqual(Convert.ToInt16(23), reader.GetInt16(1), &quot;Second column value is correct as Int16&quot;)
-            Assert.AreEqual(Convert.ToInt32(23), reader.GetInt32(1), &quot;Second column value is correct as Int32&quot;)
-            Assert.AreEqual(Convert.ToInt64(23), reader.GetInt64(1), &quot;Second column value is correct as Int64&quot;)
-            Assert.AreEqual(Convert.ToSingle(23), reader.GetFloat(1), &quot;Second column value is correct as Float/Single&quot;)
-            Assert.AreEqual(Convert.ToDouble(23), reader.GetDouble(1), &quot;Second column value is correct as Double&quot;)
-            Assert.AreEqual(Convert.ToDecimal(23), reader.GetDecimal(1), &quot;Second column value is correct as Decimal&quot;)
-            Assert.AreEqual(GetType(Int32), reader.GetFieldType(1), &quot;Second column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(1), &quot;Second column is not null&quot;)
-
-            Assert.AreEqual(&quot;2/3/2004 12:00:00 AM&quot;, reader.GetString(2), &quot;Third column value is correct&quot;)
-            Assert.AreEqual(DateTime.Parse(&quot;2/3/2004&quot;), reader.GetDateTime(2), &quot;Third column value is correct as DateTime&quot;)
-            Assert.AreEqual(GetType(DateTime), reader.GetFieldType(2), &quot;Third column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(2), &quot;Third column is not null&quot;)
-
-            Assert.AreEqual(&quot;1.342&quot;, reader.GetString(3), &quot;Fourth column value is correct&quot;)
-            Assert.AreEqual(Convert.ToSingle(1.342), reader.GetFloat(3), &quot;Fourth column value is correct as Float/Single&quot;)
-            Assert.AreEqual(Convert.ToDouble(1.342), reader.GetDouble(3), &quot;Fourth column value is correct as Double&quot;)
-            Assert.AreEqual(Convert.ToDecimal(1.342), reader.GetDecimal(3), &quot;Fourth column value is correct as Decimal&quot;)
-            Assert.AreEqual(GetType(Decimal), reader.GetFieldType(3), &quot;Fourth column is System.String&quot;)
-            Assert.IsFalse(reader.IsDBNull(3), &quot;Fourth column is not null&quot;)
-
-            Assert.IsEmpty(reader.GetString(4), &quot;Fifth column value is empty&quot;)
-            Assert.AreEqual(GetType(System.DBNull), reader.GetFieldType(4), &quot;Fifth column is System.DBNull&quot;)
-            Assert.IsTrue(reader.IsDBNull(4), &quot;Fifth column is null&quot;)
-
-            Assert.AreEqual(&quot;False&quot;, reader.GetString(5), &quot;Sixth column value is correct&quot;)
-            Assert.IsFalse(reader.GetBoolean(5), &quot;Sixth column value is correct as Boolean&quot;)
-            Assert.AreEqual(GetType(Boolean), reader.GetFieldType(5), &quot;Sixth column is System.Boolean&quot;)
-            Assert.IsFalse(reader.IsDBNull(5), &quot;Sixth column is not null&quot;)
-
-            Assert.IsFalse(reader.IsClosed, &quot;Reader is still open until last read&quot;)
-            Assert.IsFalse(reader.Read, &quot;End of file&quot;)
-            Assert.IsTrue(reader.IsClosed, &quot;Reader is closed after final read&quot;)
-
-            reader.Close()
+            Dim schemaTable As DataTable = reader.GetSchemaTable
+            For c As Integer = 0 To schemaTable.Columns.Count - 1
+                Me.AreEqual(columns.Item(c), schemaTable.Columns.Item(c))
+            Next
+
+            ValidateColumnedReader(reader)
         End Using
     End Sub
 
+#End Region
+
     Private Sub AreEqual(ByVal expected As DataColumn, ByVal actual As DataColumn)
         Assert.AreEqual(expected, actual, &quot;Columns objects are equal&quot;)
         Assert.AreEqual(expected.ColumnName, actual.ColumnName, &quot;Column names are equal&quot;)
@@ -385,5 +161,387 @@ Public Class CsvDataReaderTests
         Assert.AreEqual(expected.AllowDBNull, actual.AllowDBNull, &quot;Column nulls are equal&quot;)
     End Sub
 
+    Private Sub ValidateColumnedReader(ByVal reader As IDataReader)
+        Assert.IsInstanceOfType(GetType(CsvDataReader), reader, &quot;Is instance of CsvDataReader&quot;)
+        Assert.AreEqual(6, reader.FieldCount, &quot;Has correct number of fields&quot;)
+        Assert.AreEqual(0, reader.Depth, &quot;Depth is always zero&quot;)
+
+        Assert.AreEqual(&quot;STRING&quot;, reader.GetName(0), &quot;Has first column name&quot;)
+        Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(0), &quot;First column type name is String&quot;)
+        Assert.AreEqual(0, reader.GetOrdinal(&quot;String&quot;), &quot;First column ordinal is correct&quot;)
+
+        Assert.AreEqual(&quot;INTEGER&quot;, reader.GetName(1), &quot;Has second column name&quot;)
+        Assert.AreEqual(&quot;Int32&quot;, reader.GetDataTypeName(1), &quot;Second column type name is String&quot;)
+        Assert.AreEqual(1, reader.GetOrdinal(&quot;INTEGER&quot;), &quot;Second column ordinal is correct&quot;)
+
+        Assert.AreEqual(&quot;DATETIME&quot;, reader.GetName(2), &quot;Has third column name&quot;)
+        Assert.AreEqual(&quot;DateTime&quot;, reader.GetDataTypeName(2), &quot;Third column type name is String&quot;)
+        Assert.AreEqual(2, reader.GetOrdinal(&quot;DATETIME&quot;), &quot;Third column ordinal is correct&quot;)
+
+        Assert.AreEqual(&quot;DECIMAL&quot;, reader.GetName(3), &quot;Has fourth column name&quot;)
+        Assert.AreEqual(&quot;Decimal&quot;, reader.GetDataTypeName(3), &quot;Fourth column type name is String&quot;)
+        Assert.AreEqual(3, reader.GetOrdinal(&quot;DECIMAL&quot;), &quot;Fourth column ordinal is correct&quot;)
+
+        Assert.AreEqual(&quot;GUID&quot;, reader.GetName(4), &quot;Has fifth column name&quot;)
+        Assert.AreEqual(&quot;Guid&quot;, reader.GetDataTypeName(4), &quot;Fifth column type name is String&quot;)
+        Assert.AreEqual(4, reader.GetOrdinal(&quot;GUID&quot;), &quot;Fifth column ordinal is correct&quot;)
+
+        Assert.AreEqual(&quot;BOOLEAN&quot;, reader.GetName(5), &quot;Has sixth column name&quot;)
+        Assert.AreEqual(&quot;Boolean&quot;, reader.GetDataTypeName(5), &quot;Sixth column type name is Boolean&quot;)
+        Assert.AreEqual(5, reader.GetOrdinal(&quot;BOOLEAN&quot;), &quot;Sixth column ordinal is correct&quot;)
+
+
+        Assert.IsTrue(reader.Read, &quot;Read first line&quot;)
+        Dim values(reader.FieldCount - 1) As Object
+        Assert.AreEqual(6, reader.GetValues(values), &quot;GetValues returns the number of columns&quot;)
+        Assert.AreEqual(6, values.Length, &quot;Values array has corrent length&quot;)
+
+        Assert.AreEqual(&quot;Chris,topher&quot;, reader.GetString(0), &quot;First column value is correct&quot;)
+        Assert.AreEqual(GetType(String), reader.GetFieldType(0), &quot;First column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(0), &quot;First column is not null&quot;)
+        Assert.AreEqual(values(0), reader.GetValue(0), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(values(0), reader.Item(0), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(values(0), reader.Item(reader.GetName(0)), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(&quot;C&quot;, reader.GetChar(0).ToString, &quot;GetChar returns first character&quot;)
+        Assert.AreEqual(12, reader.GetChars(0, Nothing, Nothing, Nothing, Nothing), &quot;GetChars returns length when no buffer is passed&quot;)
+        Dim chars(reader.GetString(0).Length - 1) As Char
+        Assert.AreEqual(12, reader.GetChars(0, 0, chars, 0, 12), &quot;Read characters from column&quot;)
+        Assert.AreEqual(12, chars.Length, &quot;Read correct number of character&quot;)
+        Assert.AreEqual(&quot;C&quot;, chars(0).ToString)
+        Assert.AreEqual(&quot;h&quot;, chars(1).ToString)
+        Assert.AreEqual(&quot;r&quot;, chars(2).ToString)
+        Assert.AreEqual(&quot;i&quot;, chars(3).ToString)
+        Assert.AreEqual(&quot;s&quot;, chars(4).ToString)
+        Assert.AreEqual(&quot;,&quot;, chars(5).ToString)
+        Assert.AreEqual(&quot;t&quot;, chars(6).ToString)
+        Assert.AreEqual(&quot;o&quot;, chars(7).ToString)
+        Assert.AreEqual(&quot;p&quot;, chars(8).ToString)
+        Assert.AreEqual(&quot;h&quot;, chars(9).ToString)
+        Assert.AreEqual(&quot;e&quot;, chars(10).ToString)
+        Assert.AreEqual(&quot;r&quot;, chars(11).ToString)
+
+        Assert.AreEqual(12, reader.GetBytes(0, Nothing, Nothing, Nothing, Nothing), &quot;GetBytes returns length when no buffer is passed&quot;)
+        Assert.AreEqual(Convert.ToByte(Convert.ToChar(&quot;C&quot;)), reader.GetByte(0), &quot;GetByte returns first&quot;)
+        Dim bytes(reader.GetString(0).Length - 1) As Byte
+        Assert.AreEqual(12, reader.GetBytes(0, 0, bytes, 0, 11), &quot;Read bytes from column&quot;)
+        Assert.AreEqual(12, bytes.Length, &quot;Read correct number of bytes&quot;)
+        Assert.AreEqual(67, bytes(0))
+        Assert.AreEqual(104, bytes(1))
+        Assert.AreEqual(114, bytes(2))
+        Assert.AreEqual(105, bytes(3))
+        Assert.AreEqual(115, bytes(4))
+        Assert.AreEqual(44, bytes(5))
+        Assert.AreEqual(116, bytes(6))
+        Assert.AreEqual(111, bytes(7))
+        Assert.AreEqual(112, bytes(8))
+        Assert.AreEqual(104, bytes(9))
+        Assert.AreEqual(101, bytes(10))
+        Assert.AreEqual(114, bytes(11))
+
+        Assert.AreEqual(&quot;35&quot;, reader.GetString(1), &quot;Second column value is correct&quot;)
+        Assert.AreEqual(Convert.ToInt16(35), reader.GetInt16(1), &quot;Second column value is correct as Int16&quot;)
+        Assert.AreEqual(Convert.ToInt32(35), reader.GetInt32(1), &quot;Second column value is correct as Int32&quot;)
+        Assert.AreEqual(Convert.ToInt64(35), reader.GetInt64(1), &quot;Second column value is correct as Int64&quot;)
+        Assert.AreEqual(Convert.ToSingle(35), reader.GetFloat(1), &quot;Second column value is correct as Float/Single&quot;)
+        Assert.AreEqual(Convert.ToDouble(35), reader.GetDouble(1), &quot;Second column value is correct as Double&quot;)
+        Assert.AreEqual(Convert.ToDecimal(35), reader.GetDecimal(1), &quot;Second column value is correct as Decimal&quot;)
+        Assert.AreEqual(GetType(Int32), reader.GetFieldType(1), &quot;Second column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(1), &quot;Second column is not null&quot;)
+        Assert.AreEqual(values(1), reader.GetValue(1), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(values(1), reader.Item(1), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(values(1), reader.Item(reader.GetName(1)), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(&quot;3&quot;, reader.GetChar(1).ToString, &quot;GetChar returns first character&quot;)
+
+        Assert.AreEqual(&quot;1/2/2003 2:34:56 AM&quot;, reader.GetString(2), &quot;Third column value is correct&quot;)
+        Assert.AreEqual(DateTime.Parse(&quot;1/2/2003 2:34:56&quot;), reader.GetDateTime(2), &quot;Third column value is correct as DateTime&quot;)
+        Assert.AreEqual(GetType(DateTime), reader.GetFieldType(2), &quot;Third column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(2), &quot;Third column is not null&quot;)
+        Assert.AreEqual(values(2), reader.GetValue(2), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(values(2), reader.Item(2), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(values(2), reader.Item(reader.GetName(2)), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(&quot;1&quot;, reader.GetChar(2).ToString, &quot;GetChar returns first character&quot;)
+
+        Assert.AreEqual(&quot;1.23&quot;, reader.GetString(3), &quot;Fourth column value is correct&quot;)
+        Assert.AreEqual(Convert.ToSingle(1.23), reader.GetFloat(3), &quot;Fourth column value is correct as Float/Single&quot;)
+        Assert.AreEqual(Convert.ToDouble(1.23), reader.GetDouble(3), &quot;Fourth column value is correct as Double&quot;)
+        Assert.AreEqual(Convert.ToDecimal(1.23), reader.GetDecimal(3), &quot;Fourth column value is correct as Decimal&quot;)
+        Assert.AreEqual(GetType(Decimal), reader.GetFieldType(3), &quot;Fourth column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(3), &quot;Fourth column is not null&quot;)
+        Assert.AreEqual(values(3), reader.GetValue(3), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(values(3), reader.Item(3), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(values(3), reader.Item(reader.GetName(3)), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(&quot;1&quot;, reader.GetChar(3).ToString, &quot;GetChar returns first character&quot;)
+
+        Assert.AreEqual(&quot;11111111-2222-3333-4444-555555555555&quot;, reader.GetString(4), &quot;Fifth column value is correct&quot;)
+        Assert.AreEqual(New Guid(&quot;11111111-2222-3333-4444-555555555555&quot;), reader.GetGuid(4), &quot;Fifth column value is correct as Decimal&quot;)
+        Assert.AreEqual(GetType(Guid), reader.GetFieldType(4), &quot;Fifth column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(4), &quot;Fifth column is not null&quot;)
+        Assert.AreEqual(values(4), reader.GetValue(4), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(values(4), reader.Item(4), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(values(4), reader.Item(reader.GetName(4)), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(&quot;1&quot;, reader.GetChar(4).ToString, &quot;GetChar returns first character&quot;)
+
+        Assert.AreEqual(&quot;True&quot;, reader.GetString(5), &quot;Sixth column value is correct&quot;)
+        Assert.IsTrue(reader.GetBoolean(5), &quot;Sixth column value is correct as Boolean&quot;)
+        Assert.AreEqual(GetType(Boolean), reader.GetFieldType(5), &quot;Sixth column is System.Boolean&quot;)
+        Assert.IsFalse(reader.IsDBNull(5), &quot;Sixth column is not null&quot;)
+        Assert.AreEqual(values(5), reader.GetValue(5), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(values(5), reader.Item(5), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(values(5), reader.Item(reader.GetName(5)), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(&quot;T&quot;, reader.GetChar(5).ToString, &quot;GetChar returns first character&quot;)
+
+
+        Assert.IsTrue(reader.Read, &quot;Read second line&quot;)
+        Array.Clear(values, 0, values.Length)
+        Array.Resize(values, 2)
+        Assert.AreEqual(2, reader.GetValues(values), &quot;GetValues returns the number value slize&quot;)
+        Assert.AreEqual(2, values.Length, &quot;Values array has corrent length&quot;)
+
+        Assert.IsEmpty(reader.GetString(0), &quot;First column value is empty&quot;)
+        Assert.AreEqual(GetType(System.DBNull), reader.GetFieldType(0), &quot;First column is System.DBNull&quot;)
+        Assert.IsTrue(reader.IsDBNull(0), &quot;First column is null&quot;)
+        Assert.AreEqual(values(0), reader.GetValue(0), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(Char.MinValue, reader.GetChar(0), &quot;GetChar returns Char.MinValue for DbNull&quot;)
+
+        Assert.AreEqual(&quot;23&quot;, reader.GetString(1), &quot;Second column value is correct&quot;)
+        Assert.AreEqual(Convert.ToInt16(23), reader.GetInt16(1), &quot;Second column value is correct as Int16&quot;)
+        Assert.AreEqual(Convert.ToInt32(23), reader.GetInt32(1), &quot;Second column value is correct as Int32&quot;)
+        Assert.AreEqual(Convert.ToInt64(23), reader.GetInt64(1), &quot;Second column value is correct as Int64&quot;)
+        Assert.AreEqual(Convert.ToSingle(23), reader.GetFloat(1), &quot;Second column value is correct as Float/Single&quot;)
+        Assert.AreEqual(Convert.ToDouble(23), reader.GetDouble(1), &quot;Second column value is correct as Double&quot;)
+        Assert.AreEqual(Convert.ToDecimal(23), reader.GetDecimal(1), &quot;Second column value is correct as Decimal&quot;)
+        Assert.AreEqual(GetType(Int32), reader.GetFieldType(1), &quot;Second column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(1), &quot;Second column is not null&quot;)
+        Assert.AreEqual(values(1), reader.GetValue(1), &quot;GetValues item sames as GetValue&quot;)
+
+        Assert.AreEqual(&quot;2/3/2004 12:00:00 AM&quot;, reader.GetString(2), &quot;Third column value is correct&quot;)
+        Assert.AreEqual(DateTime.Parse(&quot;2/3/2004&quot;), reader.GetDateTime(2), &quot;Third column value is correct as DateTime&quot;)
+        Assert.AreEqual(GetType(DateTime), reader.GetFieldType(2), &quot;Third column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(2), &quot;Third column is not null&quot;)
+
+        Assert.AreEqual(&quot;1.342&quot;, reader.GetString(3), &quot;Fourth column value is correct&quot;)
+        Assert.AreEqual(Convert.ToSingle(1.342), reader.GetFloat(3), &quot;Fourth column value is correct as Float/Single&quot;)
+        Assert.AreEqual(Convert.ToDouble(1.342), reader.GetDouble(3), &quot;Fourth column value is correct as Double&quot;)
+        Assert.AreEqual(Convert.ToDecimal(1.342), reader.GetDecimal(3), &quot;Fourth column value is correct as Decimal&quot;)
+        Assert.AreEqual(GetType(Decimal), reader.GetFieldType(3), &quot;Fourth column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(3), &quot;Fourth column is not null&quot;)
+
+        Assert.IsEmpty(reader.GetString(4), &quot;Fifth column value is empty&quot;)
+        Assert.AreEqual(GetType(System.DBNull), reader.GetFieldType(4), &quot;Fifth column is System.DBNull&quot;)
+        Assert.IsTrue(reader.IsDBNull(4), &quot;Fifth column is null&quot;)
+
+        Assert.AreEqual(&quot;False&quot;, reader.GetString(5), &quot;Sixth column value is correct&quot;)
+        Assert.IsFalse(reader.GetBoolean(5), &quot;Sixth column value is correct as Boolean&quot;)
+        Assert.AreEqual(GetType(Boolean), reader.GetFieldType(5), &quot;Sixth column is System.Boolean&quot;)
+        Assert.IsFalse(reader.IsDBNull(5), &quot;Sixth column is not null&quot;)
+
+        Assert.IsFalse(reader.IsClosed, &quot;Reader is still open until last read&quot;)
+        Assert.IsFalse(reader.Read, &quot;End of file&quot;)
+        Assert.IsFalse(reader.NextResult, &quot;NextResult always returns false&quot;)
+        Assert.AreEqual(-1, reader.RecordsAffected, &quot;RecordsAffected always returns -1&quot;)
+        Assert.IsTrue(reader.IsClosed, &quot;Reader is closed after final read&quot;)
+
+        Try
+            reader.GetData(0)
+            Assert.Fail(&quot;No exception thrown for GetData&quot;)
+        Catch ex As Exception
+            Assert.IsInstanceOfType(GetType(NotImplementedException), ex, &quot;GetData threw NotImplementedException&quot;)
+        End Try
+
+        reader.Close()
+    End Sub
+
+    Private Sub ValidateHeaderedReader(ByVal reader As IDataReader)
+        Assert.IsInstanceOfType(GetType(CsvDataReader), reader, &quot;Is instance of CsvDataReader&quot;)
+        Assert.AreEqual(6, reader.FieldCount, &quot;Has correct number of fields&quot;)
+        Assert.AreEqual(0, reader.Depth, &quot;Depth is always zero&quot;)
+
+        Assert.AreEqual(&quot;STRING&quot;, reader.GetName(0), &quot;Has first column name&quot;)
+        Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(0), &quot;First column type name is String&quot;)
+        Assert.AreEqual(0, reader.GetOrdinal(&quot;String&quot;), &quot;First column ordinal is correct&quot;)
+
+        Assert.AreEqual(&quot;INTEGER&quot;, reader.GetName(1), &quot;Has second column name&quot;)
+        Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(1), &quot;Second column type name is String&quot;)
+        Assert.AreEqual(1, reader.GetOrdinal(&quot;INTEGER&quot;), &quot;Second column ordinal is correct&quot;)
+
+        Assert.AreEqual(&quot;DATETIME&quot;, reader.GetName(2), &quot;Has third column name&quot;)
+        Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(2), &quot;Third column type name is String&quot;)
+        Assert.AreEqual(2, reader.GetOrdinal(&quot;DATETIME&quot;), &quot;Third column ordinal is correct&quot;)
+
+        Assert.AreEqual(&quot;DECIMAL&quot;, reader.GetName(3), &quot;Has fourth column name&quot;)
+        Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(3), &quot;Fourth column type name is String&quot;)
+        Assert.AreEqual(3, reader.GetOrdinal(&quot;DECIMAL&quot;), &quot;Fourth column ordinal is correct&quot;)
+
+        Assert.AreEqual(&quot;GUID&quot;, reader.GetName(4), &quot;Has fifth column name&quot;)
+        Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(4), &quot;Fifth column type name is String&quot;)
+        Assert.AreEqual(4, reader.GetOrdinal(&quot;GUID&quot;), &quot;Fifth column ordinal is correct&quot;)
+
+        Assert.AreEqual(&quot;BOOLEAN&quot;, reader.GetName(5), &quot;Has sixth column name&quot;)
+        Assert.AreEqual(&quot;String&quot;, reader.GetDataTypeName(5), &quot;Sixth column type name is String&quot;)
+        Assert.AreEqual(5, reader.GetOrdinal(&quot;BOOLEAN&quot;), &quot;Sixth column ordinal is correct&quot;)
+
+
+        Assert.IsTrue(reader.Read, &quot;Read first line&quot;)
+        Dim values(reader.FieldCount - 1) As Object
+        Assert.AreEqual(6, reader.GetValues(values), &quot;GetValues returns the number of columns&quot;)
+        Assert.AreEqual(6, values.Length, &quot;Values array has corrent length&quot;)
+
+        Assert.AreEqual(&quot;Chris,topher&quot;, reader.GetString(0), &quot;First column value is correct&quot;)
+        Assert.AreEqual(GetType(String), reader.GetFieldType(0), &quot;First column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(0), &quot;First column is not null&quot;)
+        Assert.AreEqual(values(0), reader.GetValue(0), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(values(0), reader.Item(0), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(values(0), reader.Item(reader.GetName(0)), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(&quot;C&quot;, reader.GetChar(0).ToString, &quot;GetChar returns first character&quot;)
+        Assert.AreEqual(12, reader.GetChars(0, Nothing, Nothing, Nothing, Nothing), &quot;GetChars returns length when no buffer is passed&quot;)
+        Dim chars(reader.GetString(0).Length - 1) As Char
+        Assert.AreEqual(12, reader.GetChars(0, 0, chars, 0, 12), &quot;Read characters from column&quot;)
+        Assert.AreEqual(12, chars.Length, &quot;Read correct number of character&quot;)
+        Assert.AreEqual(&quot;C&quot;, chars(0).ToString)
+        Assert.AreEqual(&quot;h&quot;, chars(1).ToString)
+        Assert.AreEqual(&quot;r&quot;, chars(2).ToString)
+        Assert.AreEqual(&quot;i&quot;, chars(3).ToString)
+        Assert.AreEqual(&quot;s&quot;, chars(4).ToString)
+        Assert.AreEqual(&quot;,&quot;, chars(5).ToString)
+        Assert.AreEqual(&quot;t&quot;, chars(6).ToString)
+        Assert.AreEqual(&quot;o&quot;, chars(7).ToString)
+        Assert.AreEqual(&quot;p&quot;, chars(8).ToString)
+        Assert.AreEqual(&quot;h&quot;, chars(9).ToString)
+        Assert.AreEqual(&quot;e&quot;, chars(10).ToString)
+        Assert.AreEqual(&quot;r&quot;, chars(11).ToString)
+
+        Assert.AreEqual(12, reader.GetBytes(0, Nothing, Nothing, Nothing, Nothing), &quot;GetBytes returns length when no buffer is passed&quot;)
+        Assert.AreEqual(Convert.ToByte(Convert.ToChar(&quot;C&quot;)), reader.GetByte(0), &quot;GetByte returns first&quot;)
+        Dim bytes(reader.GetString(0).Length - 1) As Byte
+        Assert.AreEqual(12, reader.GetBytes(0, 0, bytes, 0, 12), &quot;Read bytes from column&quot;)
+        Assert.AreEqual(12, bytes.Length, &quot;Read correct number of bytes&quot;)
+        Assert.AreEqual(67, bytes(0))
+        Assert.AreEqual(104, bytes(1))
+        Assert.AreEqual(114, bytes(2))
+        Assert.AreEqual(105, bytes(3))
+        Assert.AreEqual(115, bytes(4))
+        Assert.AreEqual(44, bytes(5))
+        Assert.AreEqual(116, bytes(6))
+        Assert.AreEqual(111, bytes(7))
+        Assert.AreEqual(112, bytes(8))
+        Assert.AreEqual(104, bytes(9))
+        Assert.AreEqual(101, bytes(10))
+        Assert.AreEqual(114, bytes(11))
+
+
+
+
+
+        Assert.AreEqual(&quot;35&quot;, reader.GetString(1), &quot;Second column value is correct&quot;)
+        Assert.AreEqual(Convert.ToInt16(35), reader.GetInt16(1), &quot;Second column value is correct as Int16&quot;)
+        Assert.AreEqual(Convert.ToInt32(35), reader.GetInt32(1), &quot;Second column value is correct as Int32&quot;)
+        Assert.AreEqual(Convert.ToInt64(35), reader.GetInt64(1), &quot;Second column value is correct as Int64&quot;)
+        Assert.AreEqual(Convert.ToSingle(35), reader.GetFloat(1), &quot;Second column value is correct as Float/Single&quot;)
+        Assert.AreEqual(Convert.ToDouble(35), reader.GetDouble(1), &quot;Second column value is correct as Double&quot;)
+        Assert.AreEqual(Convert.ToDecimal(35), reader.GetDecimal(1), &quot;Second column value is correct as Decimal&quot;)
+        Assert.AreEqual(GetType(String), reader.GetFieldType(1), &quot;Second column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(1), &quot;Second column is not null&quot;)
+        Assert.AreEqual(values(1), reader.GetValue(1), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(values(1), reader.Item(1), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(values(1), reader.Item(reader.GetName(1)), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(&quot;3&quot;, reader.GetChar(1).ToString, &quot;GetChar returns first character&quot;)
+
+        Assert.AreEqual(&quot;1/2/2003 2:34:56&quot;, reader.GetString(2), &quot;Third column value is correct&quot;)
+        Assert.AreEqual(DateTime.Parse(&quot;1/2/2003 2:34:56&quot;), reader.GetDateTime(2), &quot;Third column value is correct as DateTime&quot;)
+        Assert.AreEqual(GetType(String), reader.GetFieldType(2), &quot;Third column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(2), &quot;Third column is not null&quot;)
+        Assert.AreEqual(values(2), reader.GetValue(2), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(values(2), reader.Item(2), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(values(2), reader.Item(reader.GetName(2)), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(&quot;1&quot;, reader.GetChar(2).ToString, &quot;GetChar returns first character&quot;)
+
+        Assert.AreEqual(&quot;1.23&quot;, reader.GetString(3), &quot;Fourth column value is correct&quot;)
+        Assert.AreEqual(Convert.ToSingle(1.23), reader.GetFloat(3), &quot;Fourth column value is correct as Float/Single&quot;)
+        Assert.AreEqual(Convert.ToDouble(1.23), reader.GetDouble(3), &quot;Fourth column value is correct as Double&quot;)
+        Assert.AreEqual(Convert.ToDecimal(1.23), reader.GetDecimal(3), &quot;Fourth column value is correct as Decimal&quot;)
+        Assert.AreEqual(GetType(String), reader.GetFieldType(3), &quot;Fourth column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(3), &quot;Fourth column is not null&quot;)
+        Assert.AreEqual(values(3), reader.GetValue(3), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(values(3), reader.Item(3), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(values(3), reader.Item(reader.GetName(3)), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(&quot;1&quot;, reader.GetChar(3).ToString, &quot;GetChar returns first character&quot;)
+
+        Assert.AreEqual(&quot;11111111-2222-3333-4444-555555555555&quot;, reader.GetString(4), &quot;Fifth column value is correct&quot;)
+        Assert.AreEqual(New Guid(&quot;11111111-2222-3333-4444-555555555555&quot;), reader.GetGuid(4), &quot;Fifth column value is correct as Decimal&quot;)
+        Assert.AreEqual(GetType(String), reader.GetFieldType(4), &quot;Fifth column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(4), &quot;Fifth column is not null&quot;)
+        Assert.AreEqual(values(4), reader.GetValue(4), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(values(4), reader.Item(4), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(values(4), reader.Item(reader.GetName(4)), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(&quot;1&quot;, reader.GetChar(4).ToString, &quot;GetChar returns first character&quot;)
+
+        Assert.AreEqual(&quot;True&quot;, reader.GetString(5), &quot;Sixth column value is correct&quot;)
+        Assert.IsTrue(reader.GetBoolean(5), &quot;Sixth column value is correct as Boolean&quot;)
+        Assert.AreEqual(GetType(String), reader.GetFieldType(5), &quot;Sixth column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(5), &quot;Sixth column is not null&quot;)
+        Assert.AreEqual(values(5), reader.GetValue(5), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(values(5), reader.Item(5), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(values(5), reader.Item(reader.GetName(5)), &quot;GetValues item sames as Item&quot;)
+        Assert.AreEqual(&quot;T&quot;, reader.GetChar(5).ToString, &quot;GetChar returns first character&quot;)
+
+
+        Assert.IsTrue(reader.Read, &quot;Read second line&quot;)
+        Array.Clear(values, 0, values.Length)
+        Array.Resize(values, 2)
+        Assert.AreEqual(2, reader.GetValues(values), &quot;GetValues returns the number value slize&quot;)
+        Assert.AreEqual(2, values.Length, &quot;Values array has corrent length&quot;)
+
+        Assert.IsEmpty(reader.GetString(0), &quot;First column value is empty&quot;)
+        Assert.AreEqual(GetType(System.DBNull), reader.GetFieldType(0), &quot;First column is System.DBNull&quot;)
+        Assert.IsTrue(reader.IsDBNull(0), &quot;First column is null&quot;)
+        Assert.AreEqual(values(0), reader.GetValue(0), &quot;GetValues item sames as GetValue&quot;)
+        Assert.AreEqual(Char.MinValue, reader.GetChar(0), &quot;GetChar returns Char.MinValue for DbNull&quot;)
+
+        Assert.AreEqual(&quot;23&quot;, reader.GetString(1), &quot;Second column value is correct&quot;)
+        Assert.AreEqual(Convert.ToInt16(23), reader.GetInt16(1), &quot;Second column value is correct as Int16&quot;)
+        Assert.AreEqual(Convert.ToInt32(23), reader.GetInt32(1), &quot;Second column value is correct as Int32&quot;)
+        Assert.AreEqual(Convert.ToInt64(23), reader.GetInt64(1), &quot;Second column value is correct as Int64&quot;)
+        Assert.AreEqual(Convert.ToSingle(23), reader.GetFloat(1), &quot;Second column value is correct as Float/Single&quot;)
+        Assert.AreEqual(Convert.ToDouble(23), reader.GetDouble(1), &quot;Second column value is correct as Double&quot;)
+        Assert.AreEqual(Convert.ToDecimal(23), reader.GetDecimal(1), &quot;Second column value is correct as Decimal&quot;)
+        Assert.AreEqual(GetType(String), reader.GetFieldType(1), &quot;Second column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(1), &quot;Second column is not null&quot;)
+        Assert.AreEqual(values(1), reader.GetValue(1), &quot;GetValues item sames as GetValue&quot;)
+
+        Assert.AreEqual(&quot;2/3/2004&quot;, reader.GetString(2), &quot;Third column value is correct&quot;)
+        Assert.AreEqual(DateTime.Parse(&quot;2/3/2004&quot;), reader.GetDateTime(2), &quot;Third column value is correct as DateTime&quot;)
+        Assert.AreEqual(GetType(String), reader.GetFieldType(2), &quot;Third column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(2), &quot;Third column is not null&quot;)
+
+        Assert.AreEqual(&quot;1.342&quot;, reader.GetString(3), &quot;Fourth column value is correct&quot;)
+        Assert.AreEqual(Convert.ToSingle(1.342), reader.GetFloat(3), &quot;Fourth column value is correct as Float/Single&quot;)
+        Assert.AreEqual(Convert.ToDouble(1.342), reader.GetDouble(3), &quot;Fourth column value is correct as Double&quot;)
+        Assert.AreEqual(Convert.ToDecimal(1.342), reader.GetDecimal(3), &quot;Fourth column value is correct as Decimal&quot;)
+        Assert.AreEqual(GetType(String), reader.GetFieldType(3), &quot;Fourth column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(3), &quot;Fourth column is not null&quot;)
+
+        Assert.IsEmpty(reader.GetString(4), &quot;Fifth column value is empty&quot;)
+        Assert.AreEqual(GetType(System.DBNull), reader.GetFieldType(4), &quot;Fifth column is System.DBNull&quot;)
+        Assert.IsTrue(reader.IsDBNull(4), &quot;Fifth column is null&quot;)
+
+        Assert.AreEqual(&quot;False&quot;, reader.GetString(5), &quot;Sixth column value is correct&quot;)
+        Assert.IsFalse(reader.GetBoolean(5), &quot;Sixth column value is correct as Boolean&quot;)
+        Assert.AreEqual(GetType(String), reader.GetFieldType(5), &quot;Sixth column is System.String&quot;)
+        Assert.IsFalse(reader.IsDBNull(5), &quot;Sixth column is not null&quot;)
+
+        Assert.IsFalse(reader.IsClosed, &quot;Reader is still open until last read&quot;)
+        Assert.IsFalse(reader.Read, &quot;End of file&quot;)
+        Assert.IsFalse(reader.NextResult, &quot;NextResult always returns false&quot;)
+        Assert.AreEqual(-1, reader.RecordsAffected, &quot;RecordsAffected always returns -1&quot;)
+        Assert.IsTrue(reader.IsClosed, &quot;Reader is closed after final read&quot;)
+
+        Try
+            reader.GetData(0)
+            Assert.Fail(&quot;No exception thrown for GetData&quot;)
+        Catch ex As Exception
+            Assert.IsInstanceOfType(GetType(NotImplementedException), ex, &quot;GetData threw NotImplementedException&quot;)
+        End Try
+    End Sub
 End Class
 
+</diff>
      <filename>CsvDataReaderTests/CsvDataReaderTests.vb</filename>
    </modified>
    <modified>
      <diff>@@ -57,7 +57,8 @@
     &lt;Import Include=&quot;System.Diagnostics&quot; /&gt;
   &lt;/ItemGroup&gt;
   &lt;ItemGroup&gt;
-    &lt;Compile Include=&quot;CsvDataReaderTests.vb&quot; /&gt;
+    &lt;Compile Include=&quot;CsvDataReaderTests.vb&quot;&gt;
+    &lt;/Compile&gt;
     &lt;Compile Include=&quot;My Project\AssemblyInfo.vb&quot; /&gt;
     &lt;Compile Include=&quot;My Project\Application.Designer.vb&quot;&gt;
       &lt;AutoGen&gt;True&lt;/AutoGen&gt;
@@ -84,6 +85,15 @@
   &lt;/ItemGroup&gt;
   &lt;ItemGroup&gt;
     &lt;None Include=&quot;app.config&quot; /&gt;
+    &lt;Content Include=&quot;data\fixed.txt&quot;&gt;
+      &lt;CopyToOutputDirectory&gt;Always&lt;/CopyToOutputDirectory&gt;
+    &lt;/Content&gt;
+    &lt;None Include=&quot;data\noheader.tsv&quot;&gt;
+      &lt;CopyToOutputDirectory&gt;Always&lt;/CopyToOutputDirectory&gt;
+    &lt;/None&gt;
+    &lt;None Include=&quot;data\header.tsv&quot;&gt;
+      &lt;CopyToOutputDirectory&gt;Always&lt;/CopyToOutputDirectory&gt;
+    &lt;/None&gt;
     &lt;None Include=&quot;data\header.csv&quot;&gt;
       &lt;CopyToOutputDirectory&gt;Always&lt;/CopyToOutputDirectory&gt;
     &lt;/None&gt;</diff>
      <filename>CsvDataReaderTests/CsvDataReaderTests.vbproj</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
 &#65279;STRING, INTEGER, DATETIME, DECIMAL, GUID, BOOLEAN
-Christopher, 35, 1/2/2003 2:34:56, 1.23, 11111111-2222-3333-4444-555555555555, True
+&quot;Chris,topher&quot;, 35, &quot;1/2/2003 2:34:56&quot;, 1.23, 11111111-2222-3333-4444-555555555555, True
  , 23, 2/3/2004, 1.342, ,False
 </diff>
      <filename>CsvDataReaderTests/data/header.csv</filename>
    </modified>
    <modified>
      <diff>@@ -1,2 +1,2 @@
-&#65279;Christopher, 35, 1/2/2003 2:34:56, 1.23, 11111111-2222-3333-4444-555555555555, True
+&#65279;&quot;Chris,topher&quot;, 35, &quot;1/2/2003 2:34:56&quot;, 1.23, 11111111-2222-3333-4444-555555555555, True
  , 23, 2/3/2004, 1.342, ,False</diff>
      <filename>CsvDataReaderTests/data/noheader.csv</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>2d154897b292097e13d05560a96d8139d501dacc</id>
    </parent>
  </parents>
  <author>
    <name>Christopher H. Laco</name>
    <email>claco@chrislaco.com</email>
  </author>
  <url>http://github.com/claco/csvdatareader/commit/94860f9fb0d08da328c01e8acbaddf0276026959</url>
  <id>94860f9fb0d08da328c01e8acbaddf0276026959</id>
  <committed-date>2008-09-17T21:21:50-07:00</committed-date>
  <authored-date>2008-09-17T21:21:50-07:00</authored-date>
  <message>Added CsvDataColumn
Added tests for Tab Delimited and Fixed Width formats
Added Licens file (MIT)</message>
  <tree>d8209036d6a3eca6fa0fcc531c554eedf796a041</tree>
  <committer>
    <name>Christopher H. Laco</name>
    <email>claco@chrislaco.com</email>
  </committer>
</commit>
