【问题标题】:FileHelpers - Column mappingFileHelpers - 列映射
【发布时间】:2014-10-16 08:42:53
【问题描述】:

关于文件助手库的快速问题:

我已经使用文件帮助引擎来读取流,进行验证,如果 CSV 文件没有标题,我们需要将其匹配/映射到我的模型:即

身份证、姓名、年龄、电话、性别、 但 CSV 可能不会一直以这种格式/顺序出现,我们需要使用每列的下拉列表来匹配它们。

有什么办法可以做到吗?

谢谢,

【问题讨论】:

  • 快速回答:filehelper 是一个库,没有 GUI。如果您想使用下拉列表,您必须自己使用 wpf 或 asp.net 构建一个 GUI,无论哪种方式最适合您。
  • 已经这样做了,从 json 文件中获取这些字段,我现在需要从 CSV 文件中获取标题。我可以在文件助手中做到这一点吗?或者如果他们没有标题调用 Column1, Column2 ...

标签: c# stream filehelpers


【解决方案1】:

简短的回答,不。但是你可以动态创建一个依赖类:

由于您的 JSON 文件中有可能的字段列表,我建议您对第一个数据行执行基本的 System.IO ReadLine,然后通过分隔符解析各个标题。即:

string headerString;
var headers = new List<String>();

var file = new System.IO.StreamReader("C:\\myFile.txt");
headerString = file.ReadLine();
file.Close();

headers = headerString.Split(',').ToList();

现在您有了与 JSON 文件匹配的第一行的字符串列表。然后你可以使用 System.Reflection.Emit 创建你的依赖类(参考下面的链接)

typeBuilder.SetParent(typeof(MyFileHelperBaseClass));
// can place the property definitions in a for loop against your headers
foreach(string h in headers){
    typeBuilder.DefineProperty("<header/col#>", ..., typeof(System.Int32), null);
}

stackoverflow article 14724822: How Can I add properties to a class on runtime in C#?

文件助手有时会有点挑剔,因此需要进行一些调整。

希望对你有帮助

【讨论】:

    【解决方案2】:

    您可以使用File.ReadLines(@"C:\myfile.txt").First() 读取第一行并获取标题。

    然后您可以使用FileHelpers CodeBuilder 来构建您的运行时类。来自分隔 csv 文件的示例:

    DelimitedClassBuilder cb = new DelimitedClassBuilder("Customers", ",");
    cb.IgnoreFirstLines = 1;
    cb.IgnoreEmptyLines = true;
    
    cb.AddField("BirthDate", typeof(DateTime));
    cb.LastField.TrimMode = TrimMode.Both;
    cb.LastField.FieldNullValue = DateTime.Today;
    
    cb.AddField("Name", typeof(string));
    cb.LastField.FieldQuoted = true;
    cb.LastField.QuoteChar = '"';
    
    cb.AddField("Age", typeof(int));
    
    engine = new FileHelperEngine(cb.CreateRecordClass());
    
    DataTable dt = engine.ReadFileAsDT("testCustomers.txt");
    

    然后就可以遍历生成的数据表了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 2016-08-13
      • 2021-06-12
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多