代码之家  ›  专栏  ›  技术社区  ›  Transformer

如何在运行时检测列数据类型,同时分析带有头的csv文件

  •  -1
  • Transformer  · 技术社区  · 6 年前

    我正在使用 FileHelpers 要加载csv数据,(credit-搜索时找到 this 答案/搜索结果)。

    用户浏览一个目录,选择带有标题的文件,然后上传进行解析。我的问题是 时间文件,其 cols/classes/types以前不知道 .

    问题 怎么能 解析时检测到列的数据类型?

    在搜索之后,我发现了一个名为 public Type RecordType { get; } 它提供记录类型。我需要帮助来获取记录中的col数据类型。

    var fNengine = new FileHelperEngine<AttendeeEventManifesto>();
    var fNrecords = engine.ReadFile("AttendeesByEvents.csv"); 
    
    // How to get the Col types?
    // HeaderText = typeof(..*notKNown*).GetCsvHeader();
    //..var headers = fNrecords.HeaderText();
    
    //foreach (var header in headers)
      //  Console.WriteLine(header.RecordType() + `\n`);     
    

    我也找到了这个答案 SO ,但是@shmap00提到的运行时帮助程序或他所指的帮助不再存在,我也查看了源代码树。有人能给我指一下链接吗

    1 回复  |  直到 6 年前
        1
  •  0
  •   shamp00    6 年前

    你可以用 class builder 要在运行时像这样构建类:

    DelimitedClassBuilder cb = new DelimitedClassBuilder("MyProduct", delimiter: ",");
    
    cb.AddField("Name", typeof(string));
    cb.LastField.TrimMode = TrimMode.Both;
    
    cb.AddField("Description", typeof(string));
    cb.LastField.FieldQuoted = true;
    cb.LastField.QuoteChar = '"';
    cb.LastField.QuoteMode = QuoteMode.OptionalForBoth;
    
    // etc... e.g., add a date field
    cb.AddField("SomeDate", typeof(DateTime));
    
    engine = new FileHelperEngine(cb.CreateRecordClass());
    
    DataTable dt = engine.ReadFileAsDT("test.txt");