'Using CsvReader (or another lib) to parse CSV with uneven columns
I hav a CSV file that looks like this:
 |------------|-----------|------------|-----------|
 |Generic Text|           |            |           |
 |------------|-----------|------------|-----------|
 |Generic Text|           |            |           |
 |------------|-----------|------------|-----------|
 |Header 1    |Header 2   |Header 3    | Header 4  |
 |------------|-----------|------------|-----------|
 |Val 1       | Val 2     |    Val 3   |   Val 4   |
 |------------|-----------|------------|-----------|
 |Val 1       | Val 2     |    Val 3   |   Val 4   |
 |------------|-----------|------------|-----------|
 |Val 1       | Val 2     |    Val 3   |   Val 4   |
 |------------|-----------|------------|-----------|
 
  
The problem is, the first 2 lines of the CSV file appear as though the entire file only has one column - ie it's something like:
  Generic Text
  Generict Text
  Header 1,Header 2,Header 3,Header 4 
  Val 1,Val 2,Val 3,Val 4 
  Val 1,Val 2,Val 3,Val 4 
  etc etc
When I run the following (from CsvReader NuGet package from LumenWorks), the outcome appears to only register 1 column for every row.
This is the code:
  var csvTable = new DataTable();         
  using (var csvReader = new CsvReader(new StreamReader(System.IO.File.OpenRead(filePath)), true))
  {
      csvTable.Load(csvReader);
  }
Problem: As mentioned above - CsvTable result only has a single column as opposed to registering 4 columns.
What can I do in order register the remaining 3 columns (as blanks) for the first 2 rows?
Solution 1:[1]
You can try Cinchoo ETL - An open source library to parse such files.
If you want to load your CSV file ignoring the first 2 lines, you can do so as below
string csv = @"Generic Text1
Generict Text2
Header 1,Header 2,Header 3,Header 4 
Val 1,Val 2,Val 3,Val 4 
Val 1,Val 2,Val 3,Val 4";
using (var r = ChoCSVReader.LoadText(csv).WithHeaderLineAt(3)
      )
{
    foreach (var rec in r)
        rec.Print();
}
Sample fiddle: https://dotnetfiddle.net/o6F3Cd
On the other hand, you want to load your CSV file including the first 2 lines as well, you can do so as below
string csv = @"Generic Text1
Generict Text2
Header 1,Header 2,Header 3,Header 4 
Val 1,Val 2,Val 3,Val 4 
Val 1,Val 2,Val 3,Val 4";
using (var r = ChoCSVReader.LoadText(csv)
       .WithField("Col1")
       .WithField("Col2")
       .WithField("Col3")
       .WithField("Col4").ThrowAndStopOnMissingField(false)
      )
{
    foreach (var rec in r)
        rec.Print();
}
Sample fiddle: https://dotnetfiddle.net/zNDrlg
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | Cinchoo | 
