/// <summary> /// Writes the record to the CSV file. /// </summary> /// <typeparam name="T">The type of the record.</typeparam> /// <param name="record">The record to write.</param> public virtual void WriteRecord <T>(T record) { #if !NET_2_0 && !NET_3_5 && !PCL var dynamicRecord = record as IDynamicMetaObjectProvider; if (dynamicRecord != null) { if (configuration.HasHeaderRecord && !hasHeaderBeenWritten) { WriteDynamicHeader(dynamicRecord); NextRecord(); } if (!typeActions.ContainsKey(dynamicRecord.GetType())) { CreateActionForDynamic(dynamicRecord); } } #endif try { GetWriteRecordAction <T>()(record); hasRecordBeenWritten = true; } catch (Exception ex) { var csvHelperException = ex as CsvHelperException ?? new CsvWriterException("An unexpected error occurred.", ex); ExceptionHelper.AddExceptionData(csvHelperException, Row, record.GetType(), null, null, currentRecord.ToArray()); throw csvHelperException; } }
/// <summary> /// Reads a record from the CSV file. /// </summary> /// <returns>A <see cref="T:String[]" /> of fields for the record read.</returns> public virtual string[] Read() { try { if (configuration.HasExcelSeparator && !hasExcelSeparatorBeenRead) { ReadExcelSeparator(); } reader.ClearRawRecord(); var row = ReadLine(); if (configuration.DetectColumnCountChanges && row != null) { if (columnCount > 0 && columnCount != row.Length) { throw new CsvBadDataException("An inconsistent number of columns has been detected."); } columnCount = row.Length; } return(row); } catch (Exception ex) { var csvHelperException = ex as CsvHelperException ?? new CsvParserException("An unexpected error occurred.", ex); ExceptionHelper.AddExceptionData(csvHelperException, Row, null, null, null, record.ToArray()); throw csvHelperException; } }
/// <summary> /// Writes the record to the CSV file. /// </summary> /// <typeparam name="T">The type of the record.</typeparam> /// <param name="record">The record to write.</param> public virtual void WriteRecord <T>(T record) { var dynamicRecord = record as IDynamicMetaObjectProvider; if (dynamicRecord != null) { if (configuration.HasHeaderRecord && !hasHeaderBeenWritten) { WriteDynamicHeader(dynamicRecord); NextRecord(); } } try { GetWriteRecordAction(record).DynamicInvoke(record); hasRecordBeenWritten = true; } catch (Exception ex) { var csvHelperException = ex as CsvHelperException ?? new CsvWriterException("An unexpected error occurred.", ex); ExceptionHelper.AddExceptionData(csvHelperException, Row, record.GetType(), null, null, currentRecord.ToArray()); throw csvHelperException; } }
/// <summary> /// Ends writing of the current record and starts a new record. /// This needs to be called to serialize the row to the writer. /// </summary> public virtual void NextRecord() { try { serializer.Write(currentRecord.ToArray()); currentRecord.Clear(); row++; } catch (Exception ex) { var csvHelperException = ex as CsvHelperException ?? new CsvWriterException("An unexpected error occurred.", ex); ExceptionHelper.AddExceptionData(csvHelperException, Row, null, null, null, currentRecord.ToArray()); throw csvHelperException; } }
/// <summary> /// Reads a record from the CSV file. /// </summary> /// <returns>A <see cref="T:String[]" /> of fields for the record read.</returns> public virtual string[] Read() { try { reader.ClearRawRecord(); var row = ReadLine(); return(row); } catch (Exception ex) { var csvHelperException = ex as CsvHelperException ?? new CsvParserException("An unexpected error occurred.", ex); ExceptionHelper.AddExceptionData(csvHelperException, Row, null, null, null, record.ToArray()); throw csvHelperException; } }
/// <summary> /// Writes the list of records to the CSV file. /// </summary> /// <param name="records">The list of records to write.</param> public virtual void WriteRecords(IEnumerable records) { Type recordType = null; try { if (configuration.HasExcelSeparator && !hasExcelSeperatorBeenRead) { WriteExcelSeparator(); NextRecord(); hasExcelSeperatorBeenRead = true; } // Write the header. If records is a List<dynamic>, the header won't be written. // This is because typeof( T ) = Object. var genericEnumerable = records.GetType().GetInterfaces().FirstOrDefault(t => t.GetTypeInfo().IsGenericType&& t.GetGenericTypeDefinition() == typeof(IEnumerable <>)); if (genericEnumerable != null) { recordType = genericEnumerable.GetGenericArguments().Single(); var isPrimitive = recordType.GetTypeInfo().IsPrimitive; if (configuration.HasHeaderRecord && !hasHeaderBeenWritten && !isPrimitive) { WriteHeader(recordType); if (hasHeaderBeenWritten) { NextRecord(); } } } foreach (var record in records) { recordType = record.GetType(); #if !NET_3_5 && !PCL var dynamicObject = record as IDynamicMetaObjectProvider; if (dynamicObject != null) { if (configuration.HasHeaderRecord && !hasHeaderBeenWritten) { WriteDynamicHeader(dynamicObject); NextRecord(); } if (!typeActions.ContainsKey(recordType)) { CreateActionForDynamic(dynamicObject); } } else { #endif // If records is a List<dynamic>, the header hasn't been written yet. // Write the header based on the record type. var isPrimitive = recordType.GetTypeInfo().IsPrimitive; if (configuration.HasHeaderRecord && !hasHeaderBeenWritten && !isPrimitive) { WriteHeader(recordType); NextRecord(); } #if !NET_3_5 && !PCL } #endif try { GetWriteRecordAction(record.GetType()).DynamicInvoke(record); } catch (TargetInvocationException ex) { throw ex.InnerException; } NextRecord(); } } catch (Exception ex) { var csvHelperException = ex as CsvHelperException ?? new CsvWriterException("An unexpected error occurred.", ex); ExceptionHelper.AddExceptionData(csvHelperException, Row, recordType, null, null, currentRecord.ToArray()); throw csvHelperException; } }
/// <summary> /// Writes the list of records to the CSV file. /// </summary> /// <param name="records">The list of records to write.</param> public virtual void WriteRecords <T>(IEnumerable <T> records) { try { if (configuration.HasExcelSeparator && !hasExcelSeperatorBeenRead) { WriteExcelSeparator(); NextRecord(); hasExcelSeperatorBeenRead = true; } // Write the header. If records is a List<dynamic>, the header won't be written. // This is because typeof( T ) = Object. var isDynamic = false; #if !NET_2_0 && !NET_3_5 && !PCL var dynamicRecord = records.FirstOrDefault() as IDynamicMetaObjectProvider; isDynamic = dynamicRecord != null; #endif var isPrimitive = typeof(T).GetTypeInfo().IsPrimitive; if (configuration.HasHeaderRecord && !hasHeaderBeenWritten) { #if !NET_2_0 && !NET_3_5 && !PCL if (dynamicRecord != null) { WriteDynamicHeader(dynamicRecord); } #endif if (!hasHeaderBeenWritten && !isPrimitive) { WriteHeader(typeof(T)); } if (hasHeaderBeenWritten) { NextRecord(); } } foreach (var record in records) { #if !NET_2_0 && !NET_3_5 && !PCL if (isDynamic) { if (!typeActions.ContainsKey(typeof(T)) && !typeActions.ContainsKey(typeof(ExpandoObject))) { CreateActionForDynamic(record as IDynamicMetaObjectProvider); } } #endif try { GetWriteRecordAction(record.GetType()).DynamicInvoke(record); } catch (TargetInvocationException ex) { throw ex.InnerException; } NextRecord(); } } catch (Exception ex) { var csvHelperException = ex as CsvHelperException ?? new CsvHelperException("An unexpected error occurred.", ex); ExceptionHelper.AddExceptionData(csvHelperException, Row, typeof(T), null, null, currentRecord.ToArray()); throw csvHelperException; } }