public void ReplacePropertyAtTest3() { var wrapper = new CsvRecordWrapper(); const string prop1Name = "Prop1"; const string prop2Name = "Prop2"; const string prop3Name = "Prop3"; var prop1 = new CsvProperty(prop1Name, new string[] { "Hallo1" }, Converters.CsvConverterFactory.CreateConverter(Converters.CsvTypeCode.String, true)); var prop2 = new CsvProperty(prop2Name, new string[] { "Hallo2" }, Converters.CsvConverterFactory.CreateConverter(Converters.CsvTypeCode.String, true)); var prop3 = new CsvProperty(prop3Name, new string[] { "Hallo3" }, Converters.CsvConverterFactory.CreateConverter(Converters.CsvTypeCode.String, true)); wrapper.AddProperty(prop1); wrapper.AddProperty(prop2); wrapper.ReplacePropertyAt(4711, prop3); }
public void ReplacePropertyTest1() { var wrapper = new CsvRecordWrapper(); const string prop1Name = "Prop1"; const string prop2Name = "Prop2"; const string prop3Name = "Prop3"; var prop1 = new CsvProperty(prop1Name, new string[] { "Hallo1" }, Converters.CsvConverterFactory.CreateConverter(Converters.CsvTypeCode.String, true)); var prop2 = new CsvProperty(prop2Name, new string[] { "Hallo2" }, Converters.CsvConverterFactory.CreateConverter(Converters.CsvTypeCode.String, true)); var prop3 = new CsvProperty(prop3Name, new string[] { "Hallo3" }, Converters.CsvConverterFactory.CreateConverter(Converters.CsvTypeCode.String, true)); wrapper.AddProperty(prop1); wrapper.AddProperty(prop2); Assert.AreEqual(2, wrapper.Count); Assert.AreEqual(prop1Name, wrapper.PropertyNames[0]); Assert.AreEqual(prop2Name, wrapper.PropertyNames[1]); wrapper.ReplaceProperty(prop1Name, prop3); Assert.AreEqual(2, wrapper.Count); Assert.AreEqual(prop3Name, wrapper.PropertyNames[0]); Assert.AreEqual(prop2Name, wrapper.PropertyNames[1]); }
public void ReplacePropertyTest2b() { var wrapper = new CsvRecordWrapper(); const string prop1Name = "Prop1"; var prop1 = new CsvProperty(prop1Name, new string[] { "Hallo1" }, Converters.CsvConverterFactory.CreateConverter(Converters.CsvTypeCode.String, true)); wrapper.ReplaceProperty("bla", prop1); }
public void InsertPropertyTest4() { var wrapper = new CsvRecordWrapper(); const string prop1Name = "Prop1"; var prop1 = new CsvProperty(prop1Name, new string[] { "Hallo1" }, Converters.CsvConverterFactory.CreateConverter(Converters.CsvTypeCode.String, true)); wrapper.InsertProperty(4711, prop1); }
public AccessBenchmark() { _csv = Properties.Resources.Test1; ICsvTypeConverter conv = CsvConverterFactory.CreateConverter(CsvTypeCode.String); _indexWrapper = new CsvRecordWrapper(); _indexWrapper.AddProperty(new CsvIndexProperty("Column0", 0, conv)); _indexWrapper.AddProperty(new CsvIndexProperty("Column1", 1, conv)); _indexWrapper.AddProperty(new CsvIndexProperty("Column2", 2, conv)); _nameWrapper = new CsvRecordWrapper(); _nameWrapper.AddProperty(new CsvProperty("Column0", new string[] { "Column0" }, conv)); _nameWrapper.AddProperty(new CsvProperty("Column1", new string[] { "Column1" }, conv)); _nameWrapper.AddProperty(new CsvProperty("Column2", new string[] { "Column2" }, conv)); }
public void TryGetMemberTest() { var wrapper = new CsvRecordWrapper(); const string prop1Name = "Prop1"; var prop1 = new CsvProperty(prop1Name, new string[] { "Hallo1" }, Converters.CsvConverterFactory.CreateConverter(Converters.CsvTypeCode.Int32, true)); wrapper.AddProperty(prop1); dynamic dyn = wrapper; _ = dyn.Prop1; }
public void InsertPropertyTest2() { var wrapper = new CsvRecordWrapper(); const string prop1Name = "Prop1"; var prop1 = new CsvProperty(prop1Name, new string[] { "Hallo1" }, Converters.CsvConverterFactory.CreateConverter(Converters.CsvTypeCode.String, true)); wrapper.InsertProperty(0, prop1); Assert.AreEqual(1, wrapper.Count); Assert.AreEqual(prop1Name, wrapper.PropertyNames[0]); }
public void DynPropTest(int wildcardTimeout) { var rec = new CsvRecord(new string[] { "Hallo1", "Blabla" }, false, false, true, false); var wrapper = new CsvRecordWrapper { Record = rec }; const string prop1Name = "Prop1"; const string prop2Name = "Prop2"; var prop1 = new CsvProperty(prop1Name, new string[] { "Hallo1" }, Converters.CsvConverterFactory.CreateConverter(Converters.CsvTypeCode.Int32, true)); wrapper.AddProperty(prop1); var prop2 = new CsvProperty(prop2Name, new string[] { "Blub", null !, "Bla*" },
private static CsvRecordWrapper InitCsvRecordWrapper() { var wrapper = new CsvRecordWrapper(); // Store the stringConverter because you can reuse the same // converter for more than one property in CsvRecordWrapper. ICsvTypeConverter stringConverter = CsvConverterFactory.CreateConverter(CsvTypeCode.String, maybeDBNull: true); wrapper.AddProperty ( new CsvProperty(PUPILS_NAME, new string[] { PUPILS_NAME }, stringConverter) ); wrapper.AddProperty ( new CsvProperty(SUBJECT, new string[] { SUBJECT }, stringConverter) ); wrapper.AddProperty ( new CsvProperty(LESSON_DAY, new string[] { LESSON_DAY }, CsvConverterFactory .CreateEnumConverter <DayOfWeek>("G", maybeDBNull: true)) ); wrapper.AddProperty ( new CsvProperty(LESSON_BEGIN, new string[] { LESSON_BEGIN }, CsvConverterFactory .CreateConverter(CsvTypeCode.TimeSpan, maybeDBNull: true)) ); return(wrapper); }
protected override void FillCsvRecordNonStandardProp(Contact contact, ContactProp prop, CsvRecordWrapper wrapper, int index) { switch ((AdditionalProp)prop) { case AdditionalProp.Phone1Type: wrapper[index] = GetTelephoneTypeFromPhone(contact.PhoneNumbers, 0); break; case AdditionalProp.Phone1Value: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers, 0); break; case AdditionalProp.Phone2Type: wrapper[index] = GetTelephoneTypeFromPhone(contact.PhoneNumbers, 1); break; case AdditionalProp.Phone2Value: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers, 1); break; case AdditionalProp.Phone3Type: wrapper[index] = GetTelephoneTypeFromPhone(contact.PhoneNumbers, 2); break; case AdditionalProp.Phone3Value: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers, 2); break; case AdditionalProp.Phone4Type: wrapper[index] = GetTelephoneTypeFromPhone(contact.PhoneNumbers, 3); break; case AdditionalProp.Phone4Value: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers, 3); break; case AdditionalProp.Phone5Type: wrapper[index] = GetTelephoneTypeFromPhone(contact.PhoneNumbers, 4); break; case AdditionalProp.Phone5Value: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers, 4); break; case AdditionalProp.Phone6Type: wrapper[index] = GetTelephoneTypeFromPhone(contact.PhoneNumbers, 5); break; case AdditionalProp.Phone6Value: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers, 5); break; case AdditionalProp.Phone7Type: wrapper[index] = GetTelephoneTypeFromPhone(contact.PhoneNumbers, 6); break; case AdditionalProp.Phone7Value: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers, 6); break; case AdditionalProp.Phone8Type: wrapper[index] = GetTelephoneTypeFromPhone(contact.PhoneNumbers, 7); break; case AdditionalProp.Phone8Value: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers, 7); break; case AdditionalProp.Phone9Type: wrapper[index] = GetTelephoneTypeFromPhone(contact.PhoneNumbers, 8); break; case AdditionalProp.Phone9Value: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers, 8); break; case AdditionalProp.AddressHomeType: wrapper[index] = contact.AddressHome is null ? null : PropertyClassType.Home; break; case AdditionalProp.AddressWorkType: wrapper[index] = contact.Work?.AddressWork is null ? null : PropertyClassType.Work; break; case AdditionalProp.RelationType: if (contact.Person?.Spouse != null) { wrapper[index] = RelationType.Spouse; } break; case AdditionalProp.WebHomeType: wrapper[index] = PropertyClassType.Home; break; case AdditionalProp.WebWorkType: wrapper[index] = PropertyClassType.Work; break; case AdditionalProp.EventType: { DateTime?anniversary = contact.Person?.Anniversary; if (anniversary.HasValue) { wrapper[index] = EventType.Anniversary; } } break; case AdditionalProp.InstantMessenger1Type: wrapper[index] = contact.InstantMessengerHandles?.FirstOrDefault() ?? PropertyClassType.Other; break; case AdditionalProp.InstantMessenger1Service: wrapper[index] = GetIMService(contact.InstantMessengerHandles?.FirstOrDefault()); break; case AdditionalProp.InstantMessenger2Type: wrapper[index] = contact.InstantMessengerHandles?.ElementAtOrDefault(1) is null ? null : PropertyClassType.Other; break; case AdditionalProp.InstantMessenger2Service: wrapper[index] = GetIMService(contact.InstantMessengerHandles?.ElementAtOrDefault(1)); break; case AdditionalProp.Swap: // Dummy-Property ohne eigene Daten. Dient dazu AM ENDE der Initialsierung von CSVRecordWrapper // AddressWork AddressHome zuzuweisen, wenn AddressHome null war. (Google unterscheidet nur zwischen // Address 1 und Address 2 und weist diesen den Typ [Home | Work] explizit zu.) // Das gleiche gilt für HomePagePersonal und HomePageWork if (contact.AddressHome is null) { var adrWorkType = wrapper[nameof(ColumnName.AddressWorkType)]; if (adrWorkType != null) { wrapper[nameof(ColumnName.AddressHomeType)] = adrWorkType; wrapper[nameof(ColumnName.AddressWorkType)] = null; wrapper[nameof(ColumnName.AddressHomeStreet)] = wrapper[nameof(ColumnName.AddressWorkStreet)]; wrapper[nameof(ColumnName.AddressWorkStreet)] = null; wrapper[nameof(ColumnName.AddressHomeCity)] = wrapper[nameof(ColumnName.AddressWorkCity)]; wrapper[nameof(ColumnName.AddressWorkCity)] = null; wrapper[nameof(ColumnName.AddressHomePostalCode)] = wrapper[nameof(ColumnName.AddressWorkPostalCode)]; wrapper[nameof(ColumnName.AddressWorkPostalCode)] = null; wrapper[nameof(ColumnName.AddressHomeState)] = wrapper[nameof(ColumnName.AddressWorkState)]; wrapper[nameof(ColumnName.AddressWorkState)] = null; wrapper[nameof(ColumnName.AddressHomeCountry)] = wrapper[nameof(ColumnName.AddressWorkCountry)]; wrapper[nameof(ColumnName.AddressWorkCountry)] = null; } } if (contact.WebPagePersonal is null) { var webWorkType = wrapper[nameof(ColumnName.WebWorkType)]; if (webWorkType != null) { wrapper[nameof(ColumnName.WebHomeType)] = webWorkType; wrapper[nameof(ColumnName.WebWorkType)] = null; wrapper[nameof(ColumnName.WebHomeValue)] = wrapper[nameof(ColumnName.WebWorkValue)]; wrapper[nameof(ColumnName.WebWorkValue)] = null; } } break; default: break; } }
protected override void InitCsvRecordWrapperUndefinedValues(Tuple <string, ContactProp?, IList <string> > tpl, CsvRecordWrapper wrapper) { Debug.Assert(tpl.Item2.HasValue); wrapper.AddProperty( new CsvProperty( tpl.Item1, tpl.Item3, this.StringConverter)); }
public static void TestDeserializingClassesFromCsv() { const string csvFileName = "Objects.csv"; // Create a nonstandard CSV-File File.WriteAllText(csvFileName, new StringBuilder() .AppendLine( "Unterrichtstag;Unterrichtsbeginn;Vollständiger Name;Unterrichtsfach;") .AppendLine( "Wednesday;14:30;Susi Meyer;Piano") .AppendLine( "Thursday;15:15;Carl Czerny;Piano;") .AppendLine( ";;Frederic Chopin") .ToString()); // Initialize a CsvRecordWrapper which retrieves the data from // the CSV-Columns and converts it to the right data type. // Aliases with wildcards can be used to match the column-headers // of the CSV file. var wrapper = new CsvRecordWrapper(); // Reuse a converter for more than one property: ICsvTypeConverter stringConverter = CsvConverterFactory.CreateConverter(CsvTypeCode.String, nullable: true); wrapper.AddProperty ( new CsvProperty("Name", new string[] { "*name" }, stringConverter) ); wrapper.AddProperty ( new CsvProperty("Subject", new string[] { "*subject", "*fach" }, stringConverter) ); wrapper.AddProperty ( new CsvProperty("LessonDay", new string[] { "*day", "*tag" }, CsvConverterFactory .CreateEnumConverter <DayOfWeek>(nullable: true)) ); wrapper.AddProperty ( new CsvProperty("LessonBegin", new string[] { "*begin?" }, CsvConverterFactory .CreateConverter(CsvTypeCode.TimeSpan, nullable: true)) ); // Analyze the CSV file to determine the right parameters // for proper reading: var analyzer = new CsvAnalyzer(); analyzer.Analyze(csvFileName); // Read the CSV file: using var reader = new CsvReader(csvFileName, analyzer.HasHeaderRow, analyzer.Options, analyzer.FieldSeparator); var pupilsList = new List <Pupil>(); foreach (CsvRecord record in reader.Read()) { wrapper.Record = record; // Using a dynamic variable enables you to assign // the properties without having to explicitely cast them // to the target data type: dynamic dynWrapper = wrapper; pupilsList.Add(new Pupil { Name = dynWrapper.Name, LessonBegin = dynWrapper.LessonBegin, LessonDay = dynWrapper.LessonDay, Subject = dynWrapper.Subject }); } // Write the results to Console: foreach (Pupil pupil in pupilsList) { Console.WriteLine(pupil); Console.WriteLine(); } }
protected override void InitContactNonStandardProp(Contact contact, ContactProp prop, CsvRecordWrapper wrapper, int index) { Debug.Assert(wrapper[index] != null); switch ((AdditionalProp)prop) { case AdditionalProp.Phone1Type: { var newNumber = new PhoneNumber(); AddPhoneNumber(contact, newNumber); SetTelephoneType(newNumber, (string?)wrapper[index]); } break; case AdditionalProp.Phone2Type: case AdditionalProp.Phone3Type: case AdditionalProp.Phone4Type: case AdditionalProp.Phone5Type: case AdditionalProp.Phone6Type: case AdditionalProp.Phone7Type: case AdditionalProp.Phone8Type: case AdditionalProp.Phone9Type: { if (contact.PhoneNumbers is null) { contact.PhoneNumbers = new PhoneNumber(); } PhoneNumber lastNumber = contact.PhoneNumbers.Last() !; if (lastNumber.IsEmpty) { SetTelephoneType(lastNumber, (string?)wrapper[index]); } else { var newNumber = new PhoneNumber(); AddPhoneNumber(contact, newNumber); SetTelephoneType(newNumber, (string?)wrapper[index]); } } break; case AdditionalProp.Phone1Value: case AdditionalProp.Phone2Value: case AdditionalProp.Phone3Value: case AdditionalProp.Phone4Value: case AdditionalProp.Phone5Value: case AdditionalProp.Phone6Value: case AdditionalProp.Phone7Value: case AdditionalProp.Phone8Value: case AdditionalProp.Phone9Value: { if (contact.PhoneNumbers is null) { contact.PhoneNumbers = new PhoneNumber(); } PhoneNumber lastNumber = contact.PhoneNumbers.Last() !; lastNumber.Value = (string?)wrapper[index]; } break; //case AdditionalProp.AddressHomeType: // break; //case AdditionalProp.AddressWorkType: // break; //case AdditionalProp.InstantMessenger1Type: // break; //case AdditionalProp.InstantMessenger1Service: // break; //case AdditionalProp.InstantMessenger2Type: // break; //case AdditionalProp.InstantMessenger2Service: // break; //case AdditionalProp.RelationType: // break; //case AdditionalProp.WebHomeType: // break; //case AdditionalProp.WebWorkType: // break; //case AdditionalProp.EventType: // break; case AdditionalProp.Swap: // diverse Aufräumarbeiten { // Swap Addresses: Address?addrHome = contact.AddressHome; Address?addrWork = contact.Work?.AddressWork; #if NET40 if (((string?)wrapper[nameof(ColumnName.AddressHomeType)])?.ToUpperInvariant().Contains(PropertyClassType.WorkUpperCase) ?? false) #else if (((string?)wrapper[nameof(ColumnName.AddressHomeType)])?.Contains(PropertyClassType.Work, StringComparison.OrdinalIgnoreCase) ?? false) #endif { Work?work = contact.Work ?? new Work(); contact.Work = work; work.AddressWork = addrHome; contact.AddressHome = null; #if NET40 if (!((string?)wrapper[nameof(ColumnName.AddressWorkType)])?.ToUpperInvariant().Contains(PropertyClassType.WorkUpperCase) ?? true) #else if (!((string?)wrapper[nameof(ColumnName.AddressWorkType)])?.Contains(PropertyClassType.Work, StringComparison.OrdinalIgnoreCase) ?? true) #endif { contact.AddressHome = addrWork; } } Person?person = contact.Person; if (person != null) { // check RelationType #if NET40 if (!((string?)wrapper[nameof(ColumnName.RelationType)])?.ToUpperInvariant().Contains(RelationType.SpouseUpperCase) ?? true) #else if (!((string?)wrapper[nameof(ColumnName.RelationType)])?.Contains(RelationType.Spouse, StringComparison.OrdinalIgnoreCase) ?? true) #endif { person.Spouse = null; } // check Anniversary #if NET40 if (!((string?)wrapper[nameof(ColumnName.EventType)])?.ToUpperInvariant().Contains(EventType.AnniversaryUpperCase) ?? true) #else if (!((string?)wrapper[nameof(ColumnName.EventType)])?.Contains(EventType.Anniversary, StringComparison.OrdinalIgnoreCase) ?? true) #endif { Debug.Assert(contact.Person != null); contact.Person.Anniversary = null; } } // swap Homepages var homePagePersonal = contact.WebPagePersonal; var homePageWork = contact.WebPageWork; #if NET40 if (((string?)wrapper[nameof(ColumnName.WebHomeType)])?.ToUpperInvariant().Contains(PropertyClassType.WorkUpperCase) ?? false) #else if (((string?)wrapper[nameof(ColumnName.WebHomeType)])?.Contains(PropertyClassType.Work, StringComparison.OrdinalIgnoreCase) ?? false) #endif { contact.WebPageWork = homePagePersonal; contact.WebPagePersonal = null; #if NET40 if (!((string?)wrapper[nameof(ColumnName.WebWorkType)])?.ToUpperInvariant().Contains(PropertyClassType.WorkUpperCase) ?? true) #else if (!((string?)wrapper[nameof(ColumnName.WebWorkType)])?.Contains(PropertyClassType.Work, StringComparison.OrdinalIgnoreCase) ?? true) #endif { contact.WebPagePersonal = homePageWork; } } // Split CombinedValues var emails = (List <string>?)contact.EmailAddresses; if (emails != null) { for (int i = emails.Count - 1; i >= 0; i--) { var currentEmail = emails[i]; if (!ContainsGoogleSeparator(currentEmail)) { continue; } var arr = SplitAtGoogleSeparator(currentEmail); if (arr.Length > 1) { emails.RemoveAt(i); int j = 0; while (j < arr.Length) { emails.Insert(i + j, arr[j]); j++; } } } } var ims = (List <string>?)contact.InstantMessengerHandles; if (ims != null) { for (int i = ims.Count - 1; i >= 0; i--) { var currentIms = ims[i]; if (!ContainsGoogleSeparator(currentIms)) { continue; } var arr = SplitAtGoogleSeparator(currentIms); if (arr.Length > 1) { ims.RemoveAt(i); int j = 0; while (j < arr.Length) { ims.Insert(i + j, arr[j]); j++; } } } } IEnumerable <PhoneNumber?>?contactPhones = contact.PhoneNumbers; if (contactPhones != null && contactPhones.Any(x => x !.Value != null && ContainsGoogleSeparator(x.Value))) { List <PhoneNumber> phones; if (contactPhones is PhoneNumber pn) { phones = new List <PhoneNumber>() { pn }; contact.PhoneNumbers = phones; } else { Debug.Assert(contactPhones is List <PhoneNumber>); phones = (List <PhoneNumber>)contactPhones; } for (int i = phones.Count - 1; i >= 0; i--) { PhoneNumber phone = phones[i]; string?phoneNumber = phone.Value; if (phoneNumber != null && ContainsGoogleSeparator(phoneNumber)) { string[] arr = SplitAtGoogleSeparator(phoneNumber); if (arr.Length > 1) { phones.RemoveAt(i); int j = 0; while (j < arr.Length) { phone = j == 0 ? phone : (PhoneNumber)phone.Clone(); phone.Value = arr[j]; phones.Insert(i + j, phone); j++; } } } } } } break; default: break; } }
protected override void InitCsvRecordWrapperUndefinedValues(Tuple <string, ContactProp?, IList <string> > tpl, CsvRecordWrapper wrapper) { Debug.Assert(tpl.Item2.HasValue); if (tpl.Item2 == (ContactProp)AdditionalProp.Swap) { wrapper.AddProperty( new CsvProperty( tpl.Item1, tpl.Item3, CsvConverterFactory.CreateConverter(CsvTypeCode.String, false))); } else { wrapper.AddProperty( new CsvProperty( tpl.Item1, tpl.Item3, this.StringConverter)); } }
protected override void InitContactNonStandardProp(Contact contact, ContactProp prop, CsvRecordWrapper wrapper, int index) { Debug.Assert(wrapper[index] != null); switch ((AdditionalProp)prop) { case AdditionalProp.BusinessStreet2: case AdditionalProp.BusinessStreet3: { contact.Work ??= new Work(); Address?adrWork = contact.Work.AddressWork; adrWork ??= new Address(); contact.Work.AddressWork = adrWork; adrWork.Street += $" {(string?)wrapper[index]}"; } break; case AdditionalProp.HomeStreet2: case AdditionalProp.HomeStreet3: { Address?adrHome = contact.AddressHome ?? new Address(); contact.AddressHome = adrHome; adrHome.Street += $" {(string?)wrapper[index]}"; } break; case AdditionalProp.AssistantsPhone: case AdditionalProp.BusinessPhone2: case AdditionalProp.CompanyMainPhone: { AddPhoneNumber(contact, new PhoneNumber((string?)wrapper[index], true)); } break; case AdditionalProp.HomePhone2: case AdditionalProp.ISDN: case AdditionalProp.RadioPhone: case AdditionalProp.TTY_TDD_Phone: { AddPhoneNumber(contact, new PhoneNumber((string?)wrapper[index])); } break; case AdditionalProp.OtherFax: { AddPhoneNumber(contact, new PhoneNumber((string?)wrapper[index], isFax: true)); } break; default: break; } }
public static void TestCsvToDataTable() { using DataTable dataTable = InitDataTable(); CsvRecordWrapper wrapper = InitCsvRecordWrapper(); // Write the CSV file: // (We can sort the columns of the CSV file differently than those // of the DataTable - CsvRecordWrapper will reorder that.) string[] columns = new string[] { SUBJECT, LESSON_BEGIN, PUPILS_NAME, LESSON_DAY }; using (var writer = new CsvWriter(FILE_NAME, columns)) { // (CsvWriter reuses the same record.) wrapper.Record = writer.Record; foreach (DataRow?obj in dataTable.Rows) { if (obj is DataRow dataRow) { // The properties of the CsvRecordWrapper match the columns // of the DataTable in data type and order (but not the // columns of the CSV file). for (int i = 0; i < wrapper.Count; i++) { wrapper[i] = dataRow[i]; } writer.WriteRecord(); } } } dataTable.Clear(); // Refill the DataTable from the CSV-file: using (var reader = new CsvReader(FILE_NAME)) { foreach (CsvRecord record in reader.Read()) { wrapper.Record = record; DataRow dataRow = dataTable.NewRow(); dataTable.Rows.Add(dataRow); // It doesn't matter that the columns in the CSV file have a // different order than the columns of the DataTable: // CsvRecordWrapper reorders that for us. for (int i = 0; i < wrapper.Count; i++) { dataRow[i] = wrapper[i]; } } } WriteConsole(dataTable); // Console output: // Csv file: // // Subject,Begin,Name,Day // Piano,14:30:00,Susi Meyer, Wednesday // Piano,15:15:00,Carl Czerny, Thursday // ,, Frederic Chopin, // // // Content of the refilled DataTable: // Susi Meyer Piano 3 14:30:00 // Carl Czerny Piano 4 15:15:00 // Frederic Chopin <DBNull> < DBNull > < DBNull > }
public void InsertPropertyTest3() { var wrapper = new CsvRecordWrapper(); wrapper.InsertProperty(0, null !); }
protected override void FillCsvRecordNonStandardProp(Contact contact, ContactProp prop, CsvRecordWrapper wrapper, int index) { switch ((AdditionalProp)prop) { case AdditionalProp.BusinessStreet2: case AdditionalProp.BusinessStreet3: case AdditionalProp.HomeStreet2: case AdditionalProp.HomeStreet3: break; case AdditionalProp.AssistantsPhone: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers?.Where(x => x != null && x.IsWork && !x.IsFax), 2); break; case AdditionalProp.BusinessPhone2: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers?.Where(x => x != null && x.IsWork && !x.IsFax), 3); break; case AdditionalProp.CompanyMainPhone: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers?.Where(x => x != null && x.IsWork && !x.IsFax), 4); break; case AdditionalProp.HomePhone2: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers?.Where(x => x != null && !x.IsWork && !x.IsFax), 7); break; case AdditionalProp.ISDN: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers?.Where(x => x != null && !x.IsWork && !x.IsFax), 8); break; case AdditionalProp.RadioPhone: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers?.Where(x => x != null && !x.IsWork && !x.IsFax), 9); break; case AdditionalProp.TTY_TDD_Phone: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers?.Where(x => x != null && !x.IsWork && !x.IsFax), 10); break; case AdditionalProp.OtherFax: wrapper[index] = GetValueFromPhone(contact.PhoneNumbers?.Where(x => x != null && x.IsFax), 2); break; default: break; } }
public void CsvRecordWrapperTest() { var wrapper = new CsvRecordWrapper(); Assert.IsInstanceOfType(wrapper, typeof(CsvRecordWrapper)); }