/// <summary> /// Read a file as CSV, using specific behaviour, layout and conversion options. /// </summary> /// <param name="path">The full or relative path name</param> /// <param name="encoding">The encoding of the file.</param> /// <param name="quote">The quote character. Default '"'</param> /// <param name="delimiter">Field delimiter. Default ','</param> /// <param name="escape">Quote escape character (for quotes inside fields). Default '\'</param> /// <param name="comment">Comment marker. Default '#'</param> /// <param name="hasHeaders">Is the first line a header line (default false)?</param> /// <param name="trimmingOptions">How should fields be trimmed?</param> /// <param name="missingFieldAction">What should happen when a field is missing from a line?</param> /// <param name="skipEmptyLines">Should empty lines be skipped?</param> /// <param name="quotesInsideQuotedFieldAction">What should happen when a quote is found inside a quoted field?</param> /// <param name="cultureInfo">Culture info to be used for parsing culture-sensitive data (such as date/time and decimal numbers)</param> /// <returns>a DataReader instance to read the contents of the CSV file</returns> public static IEnumerable <T> FromString <T>( string input, char quote = '"', char delimiter = ',', char escape = '"', char comment = '#', bool hasHeaders = false, ValueTrimmingOptions trimmingOptions = ValueTrimmingOptions.UnquotedOnly, MissingFieldAction missingFieldAction = MissingFieldAction.ParseError, bool skipEmptyLines = true, QuotesInsideQuotedFieldAction quotesInsideQuotedFieldAction = QuotesInsideQuotedFieldAction.Ignore, CultureInfo cultureInfo = null) { var schema = new CsvSchemaBuilder(cultureInfo).From <T>().Schema; return(FromString( input, quote, delimiter, escape, comment, hasHeaders, trimmingOptions, missingFieldAction, skipEmptyLines, quotesInsideQuotedFieldAction, schema, cultureInfo) .AsEnumerable <T>()); }
public void WhenSchemaCreatedFromClass_ExpectedValuesAreReturned() { CsvSchema schema = new CsvSchemaBuilder().From <MyClass>().Schema; var item = ReadCsv .FromString(input, delimiter: ';', hasHeaders: true, schema: schema) .AsEnumerable <MyClass>() .Single(); Verify(item); }
public void WriteCsv_ReadBack_ReturnsExpectedResult() { var cultureInfo = CultureInfo.CreateSpecificCulture("be"); var schema = new CsvSchemaBuilder(cultureInfo).From <Item>().Schema; var result = WriteCsv.ToString(new[] { new Item { Value = 123.5m } }, cultureInfo: cultureInfo); Assert.AreEqual($"\"123,5\"{NewLine}", result); var readback = ReadCsv.FromString(result, schema: schema).AsEnumerable <Item>().Single().Value; Assert.AreEqual(123.5m, readback); }
public void WithSchemaFromClass_CanReturnAsDynamicWithType() { CsvSchema schema = new CsvSchemaBuilder() .From <MyClass>() .Schema; var item = ReadCsv .FromString(input, delimiter: ';', hasHeaders: true, schema: schema) .AsEnumerable(typeof(MyClass)) .Single(); Verify(item); }
public void WithSchemaFromClassWithColumnsInOtherOrder_CanReturnAsDynamicWithType() { CsvSchema schema = new CsvSchemaBuilder() .From <MyClass>() .Schema; var input = "Last;First;BirthDate;Quantity;Price;Count;LargeValue;SomeDateTimeOffset;IsActive;NullableCustom\r\n" + "\"Peters\";John;19701115;123;US$ 5.98;;2147483647;2020-11-13T10:20:30.0000000+02:00;yes;\r\n"; var item = ReadCsv .FromString(input, delimiter: ';', hasHeaders: true, schema: schema) .AsEnumerable(typeof(MyClass)) .Single(); Verify(item); }
private readonly string _endpoint;// = "http://acornbox.webui"; void IGenerateSchema.GenerateSchema(Guid id) { System.Threading.Thread.Sleep(60 * 1000); string resourceUrl = _endpoint + $"/api/FileEntry/{id}"; FileEntryDto fileEntry; try { fileEntry = resourceUrl.GetJsonAsync <FileEntryDto>() .GetAwaiter() .GetResult(); } catch (FlurlHttpException ex) { throw; } using FileStream fs = new FileStream(fileEntry.Path, FileMode.Open, FileAccess.Read, FileShare.Read); using StreamReader sr = new StreamReader(fs, Encoding.Default, true); using CsvReader csvReader = new CsvReader(sr); CsvSchemaBuilder csvSchemaBuilder = new CsvSchemaBuilder(csvReader.HeaderRecord); csvSchemaBuilder.Refine(csvReader); CsvSchema csvSchema = csvSchemaBuilder.Build(); string csvSchemaStr = Newtonsoft.Json.JsonConvert.SerializeObject(csvSchema, Newtonsoft.Json.Formatting.Indented); fileEntry.Schema = csvSchemaStr; fileEntry.GenerateSchemaWorker = Environment.MachineName; try { resourceUrl.PutJsonAsync(fileEntry).GetAwaiter().GetResult(); } catch (FlurlHttpException ex) { throw; } }
public void WithSchema_CanReturnAsDynamicAndAllPropertiesAreTyped() { CsvSchema schema = new CsvSchemaBuilder() .AddString(nameof(MyRecord.First)) .Add(nameof(MyRecord.Last), s => new Custom(s), false) .AddDateTime(nameof(MyRecord.BirthDate), "yyyyMMdd") .AddInt32(nameof(MyRecord.Quantity)) .Add(nameof(MyRecord.Price), s => Amount.Parse(s, CultureInfo.InvariantCulture), false) .AddInt16(nameof(MyRecord.Count)) .AddDecimal(nameof(MyRecord.LargeValue)) .AddDateTimeOffset(nameof(MyRecord.SomeDateTimeOffset)) .AddBoolean(nameof(MyRecord.IsActive), "yes", "no") .Add(nameof(MyRecord.NullableCustom), s => new Custom(s), true) .Schema; var item = ReadCsv .FromString(input, delimiter: ';', hasHeaders: true, schema: schema) .AsEnumerable() .Single(); Verify(item); }