예제 #1
0
        /// <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;
            }
        }
예제 #2
0
        /// <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;
            }
        }
예제 #3
0
        /// <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;
            }
        }
예제 #4
0
 /// <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;
     }
 }
예제 #5
0
        /// <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;
            }
        }
예제 #6
0
        /// <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;
            }
        }
예제 #7
0
        /// <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;
            }
        }