使用FileHelperAsyncEngine崩溃,没有异常

时间:2017-06-11 13:46:39

标签: c# csv exception crash filehelpers

我正在使用FileHelpers Engine FileHelperAsyncEngine<T>。读取超过500,000行的大型CSV文件,我需要提取一些字段以填充SHP文件(ArcGIS)。

但是当我使用BeginReadFile并尝试选择一些数据时,应用程序崩溃没有任何异常,即使我已经做了全局异常。但是没有任何异常,我打印了线程正在读取的CSV行。

当程序崩溃时,日志文件中的最后一行每次都不同。

这是我的代码:

1.使用FileHelpersEngine

的方法
public Dictionary<int, double> FetchByStepIndex(int stepindex)
{
    try
    {
        using (var engine = new FileHelperAsyncEngine<Mike2DDynamicData>())
        {
            using (engine.BeginReadFile(CsvPath))
            {
                var temp=new Dictionary<int, double>();
                foreach (var itemData in engine)
                {
                    if (itemData.StepIndex != stepindex) continue;
                    temp.Add(itemData.ElementID,double.Parse(itemData.TotalWaterDepth));
                    LogHelper.WriteLog(
                        itemData.StepIndex + "_" + itemData.ElementID + "_" + itemData.TotalWaterDepth,
                        LogMessageType.Info);
                }
                /* The codes when not debugging like ↓
                var temp = engine.Where(w => w.StepIndex == stepindex)
                    .Select(s => new { s.ElementID, s.TotalWaterDepth })
                    .ToDictionary(d => d.ElementID, d => d.TotalWaterDepth);
                    */
                engine.Close();
                return temp;
            }
        }
    }
    catch (FileHelpersException e)
    {
        throw e;
    }
}

2.Class:Mike2DDynamicData:

[DelimitedRecord(",")]
[IgnoreFirst]
public class Mike2DDynamicData
{
    public int StepIndex;

    [FieldNullValue(typeof(DateTime),"2017-1-1 00:00:00")]
    [FieldConverter(ConverterKind.Date,"yyyy-MM-dd HH:mm:ss")]
    public DateTime Time;
    public int ElementID;

    [FieldValueDiscarded]
    public string SurfaceElevation;

    public string TotalWaterDepth;

    [FieldValueDiscarded] public string CurrentSpeed;
}

1 个答案:

答案 0 :(得分:0)

对于你的简单csv文件,使用第三部分dll是不值得的。只需自己编写代码即可。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.csv";
        static void Main(string[] args)
        {
            new Mike2DDynamicData(FILENAME);
        }
    }
    public class Mike2DDynamicData
    {
        public static List<Mike2DDynamicData> data = new List<Mike2DDynamicData>();


        public int StepIndex;

        public DateTime Time;
        public int ElementID;

        public string SurfaceElevation;

        public string TotalWaterDepth;

        public string CurrentSpeed;

        public Mike2DDynamicData() { }
        public Mike2DDynamicData(string filename)
        {

            StreamReader reader = new StreamReader(filename);

            string inputline = "";
            int lineNumber = 0;
            while((inputline = reader.ReadLine()) != null)
            {
                if (++lineNumber > 1)
                {
                    string[] splitArray = inputline.Split(new char[] { ',' });

                    Mike2DDynamicData newRow = new Mike2DDynamicData();
                    data.Add(newRow);

                    newRow.StepIndex = int.Parse(splitArray[0]);
                    newRow.Time = DateTime.Parse(splitArray[1]);
                    newRow.ElementID = int.Parse(splitArray[2]);
                    newRow.SurfaceElevation = splitArray[3];
                    newRow.TotalWaterDepth = splitArray[4];
                    newRow.CurrentSpeed = splitArray[5];

                }
            }
        }



    }

}