From 99afe1b24140adaeb7a4d0a34d90a198a846b593 Mon Sep 17 00:00:00 2001 From: Fabian de Groot Date: Mon, 1 Sep 2014 17:22:20 +0200 Subject: [PATCH 1/6] Added null check for column names --- LINQtoCSV.Tests/CsvContextReadTests.cs | 37 ++++++++++++++++++++ LINQtoCSV/CsvFileDescription.cs | 3 ++ LINQtoCSV/Exceptions.cs | 11 ++++++ LINQtoCSV/FieldMapper.cs | 8 +++++ article.htm | 48 ++++++++++++++++++++++---- 5 files changed, 100 insertions(+), 7 deletions(-) diff --git a/LINQtoCSV.Tests/CsvContextReadTests.cs b/LINQtoCSV.Tests/CsvContextReadTests.cs index b8f57d8..925829b 100644 --- a/LINQtoCSV.Tests/CsvContextReadTests.cs +++ b/LINQtoCSV.Tests/CsvContextReadTests.cs @@ -347,6 +347,43 @@ public void FileWithUnknownColumns_ShouldDiscardColumns() { @"Id,Name,Last Name,Age,City 1,John,Doe,15,Washington 2,Jane,Doe,20,New York +"; + var expected = new[] + { + new Person + { + Name = "John", + LastName = "Doe", + Age = 15 + }, + new Person + { + Name = "Jane", + LastName = "Doe", + Age = 20 + }, + }; + + AssertRead(input, description, expected); + + } + + [TestMethod()] + public void FileWithTrailingEmptyColumns_ShouldDiscardColumns() + { + var description = new CsvFileDescription { + SeparatorChar = ',', + FirstLineHasColumnNames = true, + IgnoreUnknownColumns = true, + IgnoreTrailingEmptyColumns = true + }; + + //The following input has 5 columns: Id | Name | Last Name | Age | City. Only the Name, Last Name and Age will be read. + + string input = +@"Id,Name,Last Name,Age,City, , , ,,,, +1,John,Doe,15,Washington, , , , , +2,Jane,Doe,20,New York,, , , "; var expected = new[] { diff --git a/LINQtoCSV/CsvFileDescription.cs b/LINQtoCSV/CsvFileDescription.cs index b983ca8..87bff7c 100644 --- a/LINQtoCSV/CsvFileDescription.cs +++ b/LINQtoCSV/CsvFileDescription.cs @@ -98,6 +98,8 @@ public int MaximumNbrExceptions // --------------- + public bool IgnoreTrailingEmptyColumns { get; set; } + public CsvFileDescription() { m_cultureInfo = CultureInfo.CurrentCulture; @@ -112,6 +114,7 @@ public CsvFileDescription() UseFieldIndexForReadingData = false; UseOutputFormatForParsingCsvValue = false; IgnoreUnknownColumns = false; + IgnoreTrailingEmptyColumns = false; } } } diff --git a/LINQtoCSV/Exceptions.cs b/LINQtoCSV/Exceptions.cs index 56df4b0..349e4b1 100644 --- a/LINQtoCSV/Exceptions.cs +++ b/LINQtoCSV/Exceptions.cs @@ -136,6 +136,17 @@ public ToBeWrittenButMissingFieldIndexException( /// /////////////////////////////////////////////////////////////////////// /// Exceptions related to reading column names from file + /// + /// Thrown when the file has a column without a name + /// + public class EmptyNameException : LINQtoCSVException + { + public EmptyNameException() : + base("The input file has a column without a name in the first record which is not allowed when FirstLineHasColumnNames is set to true.") + { + } + } + /// /// Thrown when the file has a column name without a counterpart in the data class definition /// diff --git a/LINQtoCSV/FieldMapper.cs b/LINQtoCSV/FieldMapper.cs index 9ef9dfc..b13e8a6 100644 --- a/LINQtoCSV/FieldMapper.cs +++ b/LINQtoCSV/FieldMapper.cs @@ -410,6 +410,14 @@ public void ReadNames(IDataRow row) int currentNameIndex = 0; for (int i = 0; i < row.Count; i++) { + if (row[i].Value == null) { + if (m_fileDescription.IgnoreTrailingEmptyColumns) { + break; + } + + throw new EmptyNameException(); + } + if (!m_NameToInfo.ContainsKey(row[i].Value)) { //If we have to ignore this column if (m_fileDescription.IgnoreUnknownColumns) { diff --git a/article.htm b/article.htm index 55adc4b..75e92ba 100644 --- a/article.htm +++ b/article.htm @@ -452,6 +452,8 @@

CsvFileDescription

  • IgnoreTrailingSeparatorChar
  • IgnoreUnknownColumns
  • + +
  • IgnoreTrailingEmptyColumns
  • SeparatorChar

    @@ -898,7 +900,45 @@

    Example:

    then the columns "Id" and "City" will be ignored without an exception.

    +

    IgnoreTrailingEmptyColumns

    + + + + + + + + + + + + + + + + + + + + + +
    Type:bool
    Default:false
    Applies to:Reading only
    +

    Example:

    +

    + When FirstLineHasColumnNames is enabled it's not allowed to have empty column names. This flag gives you the option to stop checking for more columns at the first occurence of an empty string or whitespace-only column name to prevent an EmptyNameException. Consider the following raw CSV file: +

    +
    +Id,Name,Last Name,Age,City, , , ,,,,
    +1,John,Doe,15,Washington, , , , , 
    +2,Jane,Doe,20,New York,, , ,
    +
    +

    + Note that the input file has quite a few empty column names, this would normally cause an exception. +

    +

    + However, if you set

    fd.IgnoreTrailingEmptyColumns = true;
    then the first five columns will be read without an exception. +

    CsvColumn Attribute

    @@ -1828,10 +1868,4 @@

    New Features and Bug Fixes

    If you found a bug or have an idea for a new feature, please feel free contribute to this project. Details: https://github.com/mperdeck/LINQtoCSV -

    - - - - - - +

    \ No newline at end of file From 32fedd13889cb611887638d4b73a5277b91a68ab Mon Sep 17 00:00:00 2001 From: Fabian de Groot Date: Thu, 2 Apr 2015 15:06:49 +0200 Subject: [PATCH 2/6] Bumped version to v1.5.1 --- LINQtoCSV/Properties/AssemblyInfo.cs | 4 ++-- NuGet/GeneratedPackages/LINQtoCSV.1.5.1.0.nupkg | Bin 0 -> 15478 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 NuGet/GeneratedPackages/LINQtoCSV.1.5.1.0.nupkg diff --git a/LINQtoCSV/Properties/AssemblyInfo.cs b/LINQtoCSV/Properties/AssemblyInfo.cs index 0605278..0779ce6 100644 --- a/LINQtoCSV/Properties/AssemblyInfo.cs +++ b/LINQtoCSV/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.5.0.0")] -[assembly: AssemblyFileVersion("1.5.0.0")] +[assembly: AssemblyVersion("1.5.1.0")] +[assembly: AssemblyFileVersion("1.5.1.0")] diff --git a/NuGet/GeneratedPackages/LINQtoCSV.1.5.1.0.nupkg b/NuGet/GeneratedPackages/LINQtoCSV.1.5.1.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..23f5df694d45c84ce2de0e771582fcc7f8d10679 GIT binary patch literal 15478 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

    cFJAPhlSXRl>~Qgx{`f0prskq< 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 Date: Thu, 2 Apr 2015 15:21:42 +0200 Subject: [PATCH 3/6] Added support for guids --- LINQtoCSV.Tests/CsvContextWriteTests.cs | 14 +++++++------- LINQtoCSV.Tests/ProductData.cs | 6 +++++- LINQtoCSV/FieldMapper.cs | 2 +- LINQtoCSV/Properties/AssemblyInfo.cs | 4 ++-- NuGet/GeneratedPackages/LINQtoCSV.1.5.2.0.nupkg | Bin 0 -> 15504 bytes 5 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 NuGet/GeneratedPackages/LINQtoCSV.1.5.2.0.nupkg diff --git a/LINQtoCSV.Tests/CsvContextWriteTests.cs b/LINQtoCSV.Tests/CsvContextWriteTests.cs index aebc0a1..078ec49 100644 --- a/LINQtoCSV.Tests/CsvContextWriteTests.cs +++ b/LINQtoCSV.Tests/CsvContextWriteTests.cs @@ -16,9 +16,9 @@ public void GoodFileCommaDelimitedNamesInFirstLineNLnl() // Arrange List dataRows_Test = new List(); - dataRows_Test.Add(new ProductData { retailPrice = 4.59M, name = "Wooden toy", startDate = new DateTime(2008, 2, 1), nbrAvailable = 67 }); - dataRows_Test.Add(new ProductData { onsale = true, weight = 4.03, shopsAvailable = "Ashfield", description = "" }); - dataRows_Test.Add(new ProductData { name = "Metal box", launchTime = new DateTime(2009, 11, 5, 4, 50, 0), description = "Great\nproduct" }); + dataRows_Test.Add(new ProductData { id = Guid.NewGuid(), retailPrice = 4.59M, name = "Wooden toy", startDate = new DateTime(2008, 2, 1), nbrAvailable = 67 }); + dataRows_Test.Add(new ProductData { id = Guid.NewGuid(), onsale = true, weight = 4.03, shopsAvailable = "Ashfield", description = "" }); + dataRows_Test.Add(new ProductData { id = Guid.NewGuid(), name = "Metal box", launchTime = new DateTime(2009, 11, 5, 4, 50, 0), description = "Great\nproduct" }); CsvFileDescription fileDescription_namesNl2 = new CsvFileDescription { @@ -30,11 +30,11 @@ public void GoodFileCommaDelimitedNamesInFirstLineNLnl() }; string expected = -@"name,startDate,launchTime,weight,shopsAvailable,code,price,onsale,description,nbrAvailable,unusedField -Wooden toy,1-2-2008,01 jan 00:00:00,""000,000"",,0,""€ 4,59"",False,,67, -,1-1-0001,01 jan 00:00:00,""004,030"",Ashfield,0,""€ 0,00"",True,"""",0, +@"name,startDate,launchTime,weight,shopsAvailable,code,price,onsale,description,id,nbrAvailable,unusedField +Wooden toy,1-2-2008,01 jan 00:00:00,""000,000"",,0,""€ 4,59"",False,," + dataRows_Test[0].id + @",67, +,1-1-0001,01 jan 00:00:00,""004,030"",Ashfield,0,""€ 0,00"",True,""""," + dataRows_Test[1].id + @",0, Metal box,1-1-0001,05 nov 04:50:00,""000,000"",,0,""€ 0,00"",False,""Great -product"",0, +product""," + dataRows_Test[2].id + @",0, "; // Act and Assert diff --git a/LINQtoCSV.Tests/ProductData.cs b/LINQtoCSV.Tests/ProductData.cs index f9103a4..5ff481f 100644 --- a/LINQtoCSV.Tests/ProductData.cs +++ b/LINQtoCSV.Tests/ProductData.cs @@ -56,7 +56,10 @@ internal class ProductData : IAssertable public decimal retailPrice { get; set; } [CsvColumn(FieldIndex = 30)] - public string description; + public string description; + + [CsvColumn(FieldIndex = 40)] + public Guid id; #pragma warning restore 0169, 0414, 0649 @@ -74,6 +77,7 @@ public void AssertEqual(ProductData other) Assert.AreEqual(other.onsale, onsale, "onsale"); Assert.AreEqual(other.retailPrice, retailPrice, "retailPrice"); Assert.AreEqual(Utils.NormalizeString(other.description), Utils.NormalizeString(description), "description"); + Assert.AreEqual(other.id, id, "id"); } } } diff --git a/LINQtoCSV/FieldMapper.cs b/LINQtoCSV/FieldMapper.cs index b13e8a6..ffc2978 100644 --- a/LINQtoCSV/FieldMapper.cs +++ b/LINQtoCSV/FieldMapper.cs @@ -340,7 +340,7 @@ public void WriteObject(T obj, List row) string resultString = null; if (objValue != null) { - if ((objValue is IFormattable)) + if ((objValue is IFormattable) && !(objValue is Guid)) { resultString = ((IFormattable)objValue).ToString( diff --git a/LINQtoCSV/Properties/AssemblyInfo.cs b/LINQtoCSV/Properties/AssemblyInfo.cs index 0779ce6..1b16123 100644 --- a/LINQtoCSV/Properties/AssemblyInfo.cs +++ b/LINQtoCSV/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.5.1.0")] -[assembly: AssemblyFileVersion("1.5.1.0")] +[assembly: AssemblyVersion("1.5.2.0")] +[assembly: AssemblyFileVersion("1.5.2.0")] diff --git a/NuGet/GeneratedPackages/LINQtoCSV.1.5.2.0.nupkg b/NuGet/GeneratedPackages/LINQtoCSV.1.5.2.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..bb1a90b9dbd090128bbdf5b32746e52958bd8d39 GIT binary patch literal 15504 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 VMHv{_-(oP}UoY_Td*S=t`aj_XMP2{^ literal 0 HcmV?d00001 From 8debbfbdc1ec5fdd39cebd72324b7af90b96f21a Mon Sep 17 00:00:00 2001 From: Fabian de Groot Date: Wed, 22 Apr 2015 12:32:58 +0200 Subject: [PATCH 4/6] Replaced VS UnitTestFramework with NUnit --- .gitignore | 2 +- LINQtoCSV.Tests/CsvContextReadTests.cs | 24 ++--- LINQtoCSV.Tests/CsvContextWriteTests.cs | 52 +++++---- LINQtoCSV.Tests/LINQtoCSV.Tests.csproj | 7 +- LINQtoCSV.Tests/Person.cs | 2 +- LINQtoCSV.Tests/ProductData.cs | 102 +++++++++--------- .../ProductDataSpecificFieldIndex.cs | 2 +- LINQtoCSV.Tests/Test.cs | 2 +- LINQtoCSV.Tests/packages.config | 4 + 9 files changed, 102 insertions(+), 95 deletions(-) create mode 100644 LINQtoCSV.Tests/packages.config diff --git a/.gitignore b/.gitignore index b9d6bd9..4ead766 100644 --- a/.gitignore +++ b/.gitignore @@ -130,7 +130,7 @@ publish/ # NuGet Packages Directory ## TODO: If you have NuGet Package Restore enabled, uncomment the next line -#packages/ +packages/ # Windows Azure Build Output csx diff --git a/LINQtoCSV.Tests/CsvContextReadTests.cs b/LINQtoCSV.Tests/CsvContextReadTests.cs index 925829b..4a88129 100644 --- a/LINQtoCSV.Tests/CsvContextReadTests.cs +++ b/LINQtoCSV.Tests/CsvContextReadTests.cs @@ -1,15 +1,15 @@ using LINQtoCSV; -using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.IO; using System.Collections.Generic; +using NUnit.Framework; namespace LINQtoCSV.Tests { - [TestClass()] + [TestFixture] public class CsvContextReadTests : Test { - [TestMethod()] + [Test] public void GoodFileUsingOutputFormatForParsingDatesCharUSEnglish() { // Arrange @@ -45,7 +45,7 @@ public void GoodFileUsingOutputFormatForParsingDatesCharUSEnglish() AssertRead(testInput, fileDescription_namesUs, expected); } - [TestMethod()] + [Test] public void GoodFileNoSeparatorCharUseOutputFormatForParsingUSEnglish() { // Arrange @@ -81,7 +81,7 @@ public void GoodFileNoSeparatorCharUseOutputFormatForParsingUSEnglish() AssertRead(testInput, fileDescription_namesUs, expected); } - [TestMethod()] + [Test] public void GoodFileNoSeparatorCharUSEnglish() { // Arrange @@ -117,7 +117,7 @@ public void GoodFileNoSeparatorCharUSEnglish() AssertRead(testInput, fileDescription_namesUs, expected); } - [TestMethod()] + [Test] public void GoodFileCommaDelimitedUseFieldIndexForReadingDataCharUSEnglish() { // Arrange @@ -154,7 +154,7 @@ public void GoodFileCommaDelimitedUseFieldIndexForReadingDataCharUSEnglish() AssertRead(testInput, fileDescription_namesUs, expected); } - [TestMethod()] + [Test] public void GoodFileCommaDelimitedUseFieldIndexForReadingDataCharUseOutputFormatForParsingUSEnglish() { // Arrange @@ -194,7 +194,7 @@ public void GoodFileCommaDelimitedUseFieldIndexForReadingDataCharUseOutputFormat } - [TestMethod()] + [Test] public void GoodFileCommaDelimitedNamesInFirstLineUSEnglish() { // Arrange @@ -242,7 +242,7 @@ and a quoted ""string""" AssertRead(testInput, fileDescription_namesUs, expected); } - [TestMethod()] + [Test] public void GoodFileTabDelimitedNoNamesInFirstLineNLnl() { // Arrange @@ -283,7 +283,7 @@ and a quoted ""string""" AssertRead(testInput, fileDescription_nonamesNl, expected); } - [TestMethod()] + [Test] public void GoodFileCommaDelimitedWithTrailingSeparatorChars() { // Arrange @@ -332,7 +332,7 @@ and a quoted ""string""" AssertRead(testInput, fileDescription_namesUs, expected); } - [TestMethod()] + [Test] public void FileWithUnknownColumns_ShouldDiscardColumns() { var description = new CsvFileDescription { @@ -368,7 +368,7 @@ public void FileWithUnknownColumns_ShouldDiscardColumns() { } - [TestMethod()] + [Test] public void FileWithTrailingEmptyColumns_ShouldDiscardColumns() { var description = new CsvFileDescription { diff --git a/LINQtoCSV.Tests/CsvContextWriteTests.cs b/LINQtoCSV.Tests/CsvContextWriteTests.cs index 078ec49..1f66c37 100644 --- a/LINQtoCSV.Tests/CsvContextWriteTests.cs +++ b/LINQtoCSV.Tests/CsvContextWriteTests.cs @@ -1,35 +1,33 @@ -using LINQtoCSV; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.IO; +using System; using System.Collections.Generic; using System.Text; +using NUnit.Framework; namespace LINQtoCSV.Tests { - [TestClass()] - public class CsvContextWriteTests : Test - { - [TestMethod()] - public void GoodFileCommaDelimitedNamesInFirstLineNLnl() - { - // Arrange + [TestFixture] + public class CsvContextWriteTests : Test + { + [Test] + public void GoodFileCommaDelimitedNamesInFirstLineNLnl() + { + // Arrange - List dataRows_Test = new List(); - dataRows_Test.Add(new ProductData { id = Guid.NewGuid(), retailPrice = 4.59M, name = "Wooden toy", startDate = new DateTime(2008, 2, 1), nbrAvailable = 67 }); + List dataRows_Test = new List(); + dataRows_Test.Add(new ProductData { id = Guid.NewGuid(), retailPrice = 4.59M, name = "Wooden toy", startDate = new DateTime(2008, 2, 1), nbrAvailable = 67 }); dataRows_Test.Add(new ProductData { id = Guid.NewGuid(), onsale = true, weight = 4.03, shopsAvailable = "Ashfield", description = "" }); dataRows_Test.Add(new ProductData { id = Guid.NewGuid(), name = "Metal box", launchTime = new DateTime(2009, 11, 5, 4, 50, 0), description = "Great\nproduct" }); - CsvFileDescription fileDescription_namesNl2 = new CsvFileDescription - { - SeparatorChar = ',', - FirstLineHasColumnNames = true, - EnforceCsvColumnAttribute = false, - TextEncoding = Encoding.Unicode, - FileCultureName = "nl-Nl" // default is the current culture - }; + CsvFileDescription fileDescription_namesNl2 = new CsvFileDescription + { + SeparatorChar = ',', + FirstLineHasColumnNames = true, + EnforceCsvColumnAttribute = false, + TextEncoding = Encoding.Unicode, + FileCultureName = "nl-Nl" // default is the current culture + }; - string expected = + string expected = @"name,startDate,launchTime,weight,shopsAvailable,code,price,onsale,description,id,nbrAvailable,unusedField Wooden toy,1-2-2008,01 jan 00:00:00,""000,000"",,0,""€ 4,59"",False,," + dataRows_Test[0].id + @",67, ,1-1-0001,01 jan 00:00:00,""004,030"",Ashfield,0,""€ 0,00"",True,""""," + dataRows_Test[1].id + @",0, @@ -37,9 +35,9 @@ public void GoodFileCommaDelimitedNamesInFirstLineNLnl() product""," + dataRows_Test[2].id + @",0, "; - // Act and Assert + // Act and Assert - AssertWrite(dataRows_Test, fileDescription_namesNl2, expected); - } - } -} + AssertWrite(dataRows_Test, fileDescription_namesNl2, expected); + } + } +} \ No newline at end of file diff --git a/LINQtoCSV.Tests/LINQtoCSV.Tests.csproj b/LINQtoCSV.Tests/LINQtoCSV.Tests.csproj index 38d8f6b..1dd2654 100644 --- a/LINQtoCSV.Tests/LINQtoCSV.Tests.csproj +++ b/LINQtoCSV.Tests/LINQtoCSV.Tests.csproj @@ -33,7 +33,9 @@ 4 - + + ..\packages\NUnit.2.6.4\lib\nunit.framework.dll + 3.5 @@ -68,6 +70,9 @@ LINQtoCSV + + +