Skip to content

Commit 091f274

Browse files
authored
Merge pull request #18 from FrendsPlatform/ISSUE-16
ISSUE-16: Added option to ignore quotes in row data
2 parents 595a3b6 + 01db0fc commit 091f274

File tree

5 files changed

+137
-80
lines changed

5 files changed

+137
-80
lines changed

Frends.Csv.Tests/Tests.cs

Lines changed: 96 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Data;
43
using Newtonsoft.Json.Linq;
54
using NUnit.Framework;
65

@@ -27,10 +26,10 @@ public void TestParseSkipRowsWithAutomaticHeaders()
2726
dynamic resultJArray = result.ToJson();
2827
var resultXml = result.ToXml();
2928
var resultData = result.Data;
30-
Assert.That(resultData.Count, Is.EqualTo(2));
31-
Assert.That(resultJArray.Count, Is.EqualTo(2));
32-
Assert.That(resultXml, Does.Contain("<year>2000</year>"));
33-
Assert.That(resultJArray[0].price.ToString(), Is.EqualTo("2,34"));
29+
Assert.AreEqual(resultData.Count, 2);
30+
Assert.AreEqual(resultJArray.Count, 2);
31+
Assert.IsTrue(resultXml.Contains("<year>2000</year>"));
32+
Assert.AreEqual(resultJArray[0].price.ToString(), "2,34");
3433
}
3534

3635
[Test]
@@ -54,10 +53,10 @@ public void TestParseWithColumnSpecAndMissingHeader()
5453
var resultJArray = result.ToJson() as JArray;
5554
var resultXml = result.ToXml();
5655
var resultData = result.Data;
57-
Assert.That(resultData.Count, Is.EqualTo(2));
58-
Assert.That(resultJArray.Count, Is.EqualTo(2));
59-
Assert.That(resultXml, Does.Contain("<Year>2000</Year>"));
60-
Assert.That(resultJArray[0]["Price"].Value<decimal>(), Is.EqualTo(2.34));
56+
Assert.AreEqual(resultData.Count, 2);
57+
Assert.AreEqual(resultJArray.Count, 2);
58+
Assert.IsTrue(resultXml.Contains("<Year>2000</Year>"));
59+
Assert.AreEqual(resultJArray[0]["Price"].Value<decimal>(), 2.34);
6160
}
6261

6362
[Test]
@@ -76,10 +75,10 @@ public void TestParseWithNoColumnSpecAndNoHeader()
7675
var resultJArray = result.ToJson() as JArray;
7776
var resultXml = result.ToXml();
7877
var resultData = result.Data;
79-
Assert.That(resultData.Count, Is.EqualTo(2));
80-
Assert.That(resultJArray.Count, Is.EqualTo(2));
81-
Assert.That(resultXml, Does.Contain("<0>2000</0>"));
82-
Assert.That(resultJArray[0]["3"].Value<string>(), Is.EqualTo("2,34"));
78+
Assert.AreEqual(resultData.Count, 2);
79+
Assert.AreEqual(resultJArray.Count, 2);
80+
Assert.IsTrue(resultXml.Contains("<0>2000</0>"));
81+
Assert.AreEqual(resultJArray[0]["3"].Value<string>(), "2,34");
8382
}
8483

8584
[Test]
@@ -105,36 +104,36 @@ public void TestParseWillAllKindOfDataTypes()
105104
},
106105
Delimiter = ";",
107106
Csv = csv
108-
}, new ParseOption() { ContainsHeaderRow = true, CultureInfo = "fi-FI" });
109-
var resultJson = (JArray)result.ToJson();
110-
Assert.That(resultJson[0]["Long"].Value<long>(), Is.EqualTo(4294967296));
107+
}, new ParseOption() { ContainsHeaderRow = true, CultureInfo = "fi-FI", IgnoreReferences = true });
108+
var resultJson = (JArray) result.ToJson();
109+
Assert.AreEqual(resultJson[0]["Long"].Value<long>(), 4294967296);
111110
var resultXml = result.ToXml();
112-
Assert.That(resultXml, Does.Contain("<DateTime2>1.5.2008 10.34.42</DateTime2>"));
111+
Assert.IsTrue(resultXml.Contains("<DateTime2>1.5.2008 10.34.42</DateTime2>"));
113112
var resultData = result.Data;
114113
var itemArray = resultData[0];
115-
Assert.That(itemArray[0].GetType(), Is.EqualTo(typeof(int)));
116-
Assert.That(itemArray[0], Is.EqualTo(1997));
114+
Assert.AreEqual(itemArray[0].GetType(), typeof(int));
115+
Assert.AreEqual(itemArray[0], 1997);
117116

118-
Assert.That(itemArray[1].GetType(), Is.EqualTo(typeof(string)));
119-
Assert.That(itemArray[1], Is.EqualTo("Fo;rd"));
117+
Assert.AreEqual(itemArray[1].GetType(), typeof(string));
118+
Assert.AreEqual(itemArray[1], "Fo;rd");
120119

121-
Assert.That(itemArray[2].GetType(), Is.EqualTo(typeof(decimal)));
122-
Assert.That(itemArray[2], Is.EqualTo(2.34d));
120+
Assert.AreEqual(itemArray[2].GetType(), typeof(decimal));
121+
Assert.AreEqual(itemArray[2], 2.34d);
123122

124-
Assert.That(itemArray[3].GetType(), Is.EqualTo(typeof(bool)));
125-
Assert.That(itemArray[3], Is.EqualTo(true));
123+
Assert.AreEqual(itemArray[3].GetType(), typeof(bool));
124+
Assert.AreEqual(itemArray[3], true);
126125

127-
Assert.That(itemArray[4].GetType(), Is.EqualTo(typeof(bool)));
128-
Assert.That(itemArray[4], Is.EqualTo(true));
126+
Assert.AreEqual(itemArray[4].GetType(), typeof(bool));
127+
Assert.AreEqual(itemArray[4], true);
129128

130-
Assert.That(itemArray[5].GetType(), Is.EqualTo(typeof(long)));
131-
Assert.That(itemArray[5], Is.EqualTo(4294967296));
129+
Assert.AreEqual(itemArray[5].GetType(), typeof(long));
130+
Assert.AreEqual(itemArray[5], 4294967296);
132131

133-
Assert.That(itemArray[6].GetType(), Is.EqualTo(typeof(char)));
134-
Assert.That(itemArray[6], Is.EqualTo('f'));
132+
Assert.AreEqual(itemArray[6].GetType(), typeof(char));
133+
Assert.AreEqual(itemArray[6], 'f');
135134

136-
Assert.That(itemArray[7].GetType(), Is.EqualTo(typeof(DateTime)));
137-
Assert.That(itemArray[7], Is.EqualTo(new DateTime(2008, 9, 15)));
135+
Assert.AreEqual(itemArray[7].GetType(), typeof(DateTime));
136+
Assert.AreEqual(itemArray[7], new DateTime(2008, 9, 15));
138137

139138
Assert.That(itemArray[8].GetType(), Is.EqualTo(typeof(DateTime)));
140139
Assert.That(itemArray[8], Is.EqualTo(new DateTime(2008, 5, 1, 10, 34, 42)));
@@ -156,15 +155,15 @@ public void TestParseTreatMissingFieldsAsNullSetToTrue()
156155
Csv = csv
157156
}, new ParseOption() { ContainsHeaderRow = true, CultureInfo = "fi-FI", TreatMissingFieldsAsNulls = true });
158157
var resultJson = (JArray)result.ToJson();
159-
Assert.That(resultJson[2].Value<string>("header3"), Is.EqualTo(null));
158+
Assert.AreEqual(resultJson[2].Value<string>("header3"), null);
160159

161160
var resultXml = result.ToXml();
162-
Assert.That(resultXml, Does.Contain("<header3 />"));
161+
Assert.IsTrue(resultXml.Contains("<header3 />"));
163162

164163
var resultData = result.Data;
165164
var nullItem = resultData[2][2];
166165

167-
Assert.That(nullItem, Is.EqualTo(null));
166+
Assert.AreEqual(nullItem, null);
168167
}
169168

170169
[Test]
@@ -193,7 +192,7 @@ public void TestParseTreatMissingFieldsAsNullDefaultValue()
193192
{
194193
var options = new ParseOption();
195194

196-
Assert.That(options.TreatMissingFieldsAsNulls, Is.EqualTo(false));
195+
Assert.AreEqual(options.TreatMissingFieldsAsNulls, false);
197196
}
198197

199198
[Test]
@@ -216,40 +215,39 @@ public void TestWriteFromListTable()
216215
new List<object>() {100, "Dilantin", "Melanie", date}
217216
};
218217

219-
var result = Csv.Create(new CreateInput() { InputType = CreateInputType.List, Delimiter = ";", Data = data, Headers = headers }, new CreateOption() { CultureInfo = "fi-FI" });
220-
Assert.That(result.Csv,
221-
Is.EqualTo(
218+
var result = Csv.Create(new CreateInput() { InputType = CreateInputType.List, Delimiter = ";", Data = data, Headers = headers}, new CreateOption() { CultureInfo = "fi-FI" });
219+
Assert.AreEqual(result.Csv,
222220
@"Dosage;Drug;Patient;Date
223221
25;Indocin;David;1.1.2000 0.00.00
224222
50;Enebrel;Sam;1.1.2000 0.00.00
225223
10;Hydralazine;Christoff;1.1.2000 0.00.00
226224
21;""Combiv;ent"";Janet;1.1.2000 0.00.00
227225
100;Dilantin;Melanie;1.1.2000 0.00.00
228-
"));
226+
");
229227
}
230228

231229
[Test]
232230
public void TestWriteFromJson()
233231
{
234232
var json = @"[{""cool"":""nice"", ""what"": ""no""}, {""cool"":""not"", ""what"": ""yes""}, {""cool"":""maybe"", ""what"": ""never""}]";
235-
var result = Csv.Create(new CreateInput() { InputType = CreateInputType.Json, Delimiter = ";", Json = json }, new CreateOption());
236-
Assert.That(result.Csv,
237-
Is.EqualTo(@"cool;what
233+
var result = Csv.Create(new CreateInput() { InputType = CreateInputType.Json, Delimiter = ";", Json = json}, new CreateOption());
234+
Assert.AreEqual(result.Csv,
235+
@"cool;what
238236
nice;no
239237
not;yes
240238
maybe;never
241-
"));
239+
");
242240
}
243241

244242
[Test]
245243
public void TestNullInputValue()
246244
{
247245
var json = @"[{""ShouldStayNull"":""null"", ""ShouldBeReplaced"": null}]";
248246
var result = Csv.Create(new CreateInput() { InputType = CreateInputType.Json, Delimiter = ";", Json = json }, new CreateOption() { ReplaceNullsWith = "replacedvalue" });
249-
Assert.That(result.Csv,
250-
Is.EqualTo(@"ShouldStayNull;ShouldBeReplaced
247+
Assert.AreEqual(result.Csv,
248+
@"ShouldStayNull;ShouldBeReplaced
251249
null;replacedvalue
252-
"));
250+
");
253251
}
254252

255253
[Test]
@@ -260,16 +258,23 @@ public void TestNoQuotesOption()
260258
""bar"" : ""I would not""
261259
}]";
262260
var result2 = Csv.Create(new CreateInput() { InputType = CreateInputType.Json, Delimiter = ";", Json = json }, new CreateOption() { NeverAddQuotesAroundValues = false });
263-
Assert.That(result2.Csv,
264-
Is.EqualTo(@"foo;bar
261+
Assert.AreEqual(result2.Csv,
262+
@"foo;bar
265263
"" Normally I would have quotes "";I would not
266-
"));
264+
");
267265

268266
var result1 = Csv.Create(new CreateInput() { InputType = CreateInputType.Json, Delimiter = ";", Json = json }, new CreateOption() { NeverAddQuotesAroundValues = true });
269-
Assert.That(result1.Csv,
270-
Is.EqualTo(@"foo;bar
267+
Assert.AreEqual(result1.Csv,
268+
@"foo;bar
271269
Normally I would have quotes ;I would not
272-
"));
270+
");
271+
272+
273+
274+
275+
276+
277+
273278
}
274279

275280
[Test]
@@ -280,10 +285,10 @@ public void TestDatetimeValue()
280285
""string"" : ""foo""
281286
}]";
282287
var result = Csv.Create(new CreateInput() { InputType = CreateInputType.Json, Delimiter = ";", Json = json }, new CreateOption() { });
283-
Assert.That(result.Csv,
284-
Is.EqualTo(@"datetime;string
288+
Assert.AreEqual(result.Csv,
289+
@"datetime;string
285290
2018-11-22T10:30:55;foo
286-
"));
291+
");
287292
}
288293

289294
[Test]
@@ -295,10 +300,10 @@ public void TestDecimalValues()
295300
""baz"" : 0.000000000000000000000000000000000000000000000000000000001
296301
}]";
297302
var result = Csv.Create(new CreateInput() { InputType = CreateInputType.Json, Delimiter = ";", Json = json }, new CreateOption() { });
298-
Assert.That(result.Csv,
299-
Is.EqualTo(@"foo;bar;baz
303+
Assert.AreEqual(result.Csv,
304+
@"foo;bar;baz
300305
0.1;1.00;0.000000000000000000000000000000000000000000000000000000001
301-
"));
306+
");
302307
}
303308

304309
[Test]
@@ -323,10 +328,10 @@ public void ParseAndWriteShouldUseSeparateCultures()
323328

324329
var result = Csv.Create(new CreateInput() { InputType = CreateInputType.List, Delimiter = ";", Data = parseResult.Data, Headers = parseResult.Headers }, new CreateOption() { CultureInfo = "fi-FI" });
325330

326-
Assert.That(result.Csv, Is.EqualTo(
331+
Assert.AreEqual(result.Csv,
327332
@"First;Second;Number;Date
328333
Foo;"" bar"";100;1.1.2000 0.00.00
329-
"));
334+
");
330335
}
331336

332337
[Test]
@@ -346,10 +351,10 @@ public void TestParseRowsWithAutomaticHeadersWhiteSpaceRemovalDefault()
346351
dynamic resultJArray = result.ToJson();
347352
var resultXml = result.ToXml();
348353
var resultData = result.Data;
349-
Assert.That(resultData.Count, Is.EqualTo(2));
350-
Assert.That(resultJArray.Count, Is.EqualTo(2));
351-
Assert.That(resultXml, Does.Contain("<year of the z>"));
352-
Assert.That(resultJArray[0].price.ToString(), Is.EqualTo("2,34"));
354+
Assert.AreEqual(resultData.Count, 2);
355+
Assert.AreEqual(resultJArray.Count, 2);
356+
Assert.IsTrue(resultXml.Contains("<year of the z>"));
357+
Assert.AreEqual(resultJArray[0].price.ToString(), "2,34");
353358
}
354359

355360
[Test]
@@ -369,10 +374,31 @@ public void TestParseRowsWithAutomaticHeadersWhiteSpaceRemovalGiven()
369374
dynamic resultJArray = result.ToJson();
370375
var resultXml = result.ToXml();
371376
var resultData = result.Data;
372-
Assert.That(resultData.Count, Is.EqualTo(2));
373-
Assert.That(resultJArray.Count, Is.EqualTo(2));
374-
Assert.That(resultXml, Does.Contain("<year_of_the_z>"));
375-
Assert.That(resultJArray[0].price.ToString(), Is.EqualTo("2,34"));
377+
Assert.AreEqual(resultData.Count, 2);
378+
Assert.AreEqual(resultJArray.Count, 2);
379+
Assert.IsTrue(resultXml.Contains("<year_of_the_z>"));
380+
Assert.AreEqual(resultJArray[0].price.ToString(), "2,34");
376381
}
382+
383+
[Test]
384+
public void TestParseIgnoresQuotesInRowData()
385+
{
386+
var csv = "asdasd\nCoolio\nyear;car\";mark;price\n1997;Ford;E350;2,34\n2000;Mercury;Cougar;2,38";
387+
var result = Csv.Parse(new ParseInput()
388+
{
389+
ColumnSpecifications = new ColumnSpecification[0],
390+
Delimiter = ";",
391+
Csv = csv
392+
}, new ParseOption() { ContainsHeaderRow = true, SkipRowsFromTop = 2, SkipEmptyRows = false, IgnoreQuotes = true });
393+
394+
dynamic resultJArray = result.ToJson();
395+
var resultXml = result.ToXml();
396+
var resultData = result.Data;
397+
Assert.AreEqual(resultData.Count, 2);
398+
Assert.AreEqual(resultJArray.Count, 2);
399+
Assert.IsTrue(resultXml.Contains("<year>2000</year>"));
400+
Assert.AreEqual(resultJArray[0].price.ToString(), "2,34");
401+
}
402+
377403
}
378404
}

Frends.Csv/Csv.cs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,31 @@ public class Csv
2020
/// <returns>Object { List&lt;List&lt;object&gt;&gt; Data, List&lt;string&gt; Headers, JToken ToJson(), string ToXml() } </returns>
2121
public static ParseResult Parse([PropertyTab] ParseInput input, [PropertyTab] ParseOption option)
2222
{
23-
var configuration = new CsvConfiguration(new CultureInfo(option.CultureInfo))
23+
CsvConfiguration configuration;
24+
25+
if (!option.IgnoreReferences && option.IgnoreQuotes)
2426
{
25-
HasHeaderRecord = option.ContainsHeaderRow,
26-
Delimiter = input.Delimiter,
27-
TrimOptions = option.TrimOutput ? TrimOptions.None : TrimOptions.Trim,
28-
IgnoreBlankLines = option.SkipEmptyRows
29-
};
27+
configuration = new CsvConfiguration(new CultureInfo(option.CultureInfo))
28+
{
29+
HasHeaderRecord = option.ContainsHeaderRow,
30+
Delimiter = input.Delimiter,
31+
TrimOptions = option.TrimOutput ? TrimOptions.None : TrimOptions.Trim,
32+
IgnoreBlankLines = option.SkipEmptyRows,
33+
IgnoreReferences = option.IgnoreReferences,
34+
Mode = !option.IgnoreReferences && option.IgnoreQuotes ? CsvMode.NoEscape : CsvMode.Escape,
35+
};
36+
}
37+
else
38+
{
39+
configuration = new CsvConfiguration(new CultureInfo(option.CultureInfo))
40+
{
41+
HasHeaderRecord = option.ContainsHeaderRow,
42+
Delimiter = input.Delimiter,
43+
TrimOptions = option.TrimOutput ? TrimOptions.None : TrimOptions.Trim,
44+
IgnoreBlankLines = option.SkipEmptyRows,
45+
IgnoreReferences = option.IgnoreReferences
46+
};
47+
}
3048

3149
// Setting the MissingFieldFound -delegate property of configuration to null when
3250
// option.TreatMissingFieldsAsNulls is set to true for returning null values for missing fields.

Frends.Csv/Definitions.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
using System.IO;
77
using System.Text;
88
using System.Xml;
9-
using Newtonsoft.Json;
109
using Newtonsoft.Json.Linq;
1110
using Formatting = Newtonsoft.Json.Formatting;
1211

@@ -164,6 +163,18 @@ public class ParseOption
164163
/// </summary>
165164
[DefaultValue("false")]
166165
public bool TreatMissingFieldsAsNulls { get; set; } = false;
166+
/// <summary>
167+
/// A flag to let the reader know if reference should be ignored.
168+
/// </summary>
169+
[DefaultValue("false")]
170+
public bool IgnoreReferences { get; set; } = false;
171+
172+
/// <summary>
173+
/// A flag to let the reader know if quotes should be ignored.
174+
/// </summary>
175+
[DefaultValue("false")]
176+
public bool IgnoreQuotes { get; set; } = false;
177+
167178
}
168179

169180
public class ParseResult

Frends.Csv/Frends.Csv.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
5-
<Version>1.0.0</Version>
5+
<Version>1.0.1</Version>
66
<GenerateDocumentationFile>true</GenerateDocumentationFile>
77
<Company>HiQ Finland</Company>
88
<Authors>HiQ Finland</Authors>
@@ -15,7 +15,7 @@
1515
</ItemGroup>
1616
<ItemGroup>
1717
<PackageReference Include="CsvHelper" Version="30.0.1" />
18-
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
19-
<PackageReference Include="System.ComponentModel.Annotations" Version="4.7.0" />
18+
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
19+
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
2020
</ItemGroup>
2121
</Project>

0 commit comments

Comments
 (0)