Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从FileHelper解析值?或者这超出了程序的功能_C#_.net_Filehelpers - Fatal编程技术网

C# 从FileHelper解析值?或者这超出了程序的功能

C# 从FileHelper解析值?或者这超出了程序的功能,c#,.net,filehelpers,C#,.net,Filehelpers,我想知道我是否要抛弃文件助手,自己做这件事,因为我认为我可能会超出它的设计目的 我希望用户能够上传任何csv文件(可能在未来的excel文件)。第一行将有标题 C1 C2 C3 C4 C5 C6 一旦上传,它看起来就像 C1,C2,C3,C4,C5,C6 a、 b、c、d、e、f 现在我想看看页眉,基本上看一些。例如,我想要C2、C3、C4。其余的都是我不关心的额外信息 现在有人可能会上传一个有这个头的文件 C1 C2 C3 C4 同样,我只寻找C2、C3、C4 我知道我可以有多种格式,但我

我想知道我是否要抛弃文件助手,自己做这件事,因为我认为我可能会超出它的设计目的

我希望用户能够上传任何csv文件(可能在未来的excel文件)。第一行将有标题

C1 C2 C3 C4 C5 C6
一旦上传,它看起来就像

C1,C2,C3,C4,C5,C6 a、 b、c、d、e、f

现在我想看看页眉,基本上看一些。例如,我想要
C2、C3、C4。
其余的都是我不关心的额外信息

现在有人可能会上传一个有这个头的文件

C1 C2 C3 C4
同样,我只寻找
C2、C3、C4

我知道我可以有多种格式,但我的意思是我希望他们基本上能够上传任何带有任意数量标题的文件(我关心的可能是1000个),然后让我的应用程序尝试查找我关心的信息(因此在1000个标题的情况下,我可能只需要3个)

这可能吗

编辑

(基于shamp00评论)

我的目标是尽可能多地填写数据,不管这样的情况可能会发生。我要C1,C2,C3。他们给出了一个C1,C3,C4的文件。我有两列我需要的数据,但我没有C2

现在我有两个想法,一个是将数据显示到两个表中。表1将有C1、C2、C3,表2将有C1、C3、C4,它们基本上取表2中的数据,并将适当的数据移动到我预期的列中

用这种方法,我基本上是说“你没有给我100%我所期望的,现在你必须把每一行格式化成我的格式”

第二种方法是使用1个表,并尝试填写尽可能多的数据

例如,用户上载包含C1、C3、C4的文件。我确定它们是已知的两列,但我还没有完整的预期数据量

因此,我将向用户显示html表中的所有行,标题为

C1, C2, C3, C4
C1将被填写,C2单元格将为空(因为这是我从中丢失的数据),C3将被填写,C4将被填写(这个数据是意外的,但谁知道它可能实际上是C2应该保存的数据,但由于他们拼错了标题名,我的程序无法识别它)

然后,基本上,他们只需将从其他地方或可能从C4获得的数据填入C2

现在,他们只需在中填写一列,而不必填写预期的所有列。所以从某种意义上说,我需要一个具体的类,就像MyClass与C1、C2、C3一样,但同时我需要动态的,这样我才能持有
C4、C5…..Cn

我总是先显示C1、C2、C3,其余这些意外的会在后面出现,通过javascript的魔力,他们可以编辑丢失的信息。如果没有遗漏任何内容,则不会显示任何内容进行编辑

基于shamp00注释,我现在想知道是否需要将数据作为数据表返回(幸运的是,这似乎是一个系统类,因为现在我的代码位于服务层,我返回了一个域传输类,因为我想让我的代码独立于类似的web代码类,因此我试图找出如何生成动态类FileHelpers。)


然后不知何故(还不是100%确定)只需跟踪我真正感兴趣的3列的位置,这样我就知道哪些数据是什么。

您可以使用中所述的技术使用FileHelper

读取标题行以确定哪些列是相关的,然后遍历生成的
DataTable
仅处理这些列

差不多

public class MyClass
{
    public string SomeImportantField { get; set; }
    public string SomeOtherField { get; set; }
    public string AnotherField { get; set; }
}

public IList<MyClass> GetObjectsFromStream(Stream stream)
{
    var cb = new DelimitedClassBuilder("temp", ",") { IgnoreFirstLines = 1, IgnoreEmptyLines = true, Delimiter = "," };
    var sr = new StreamReader(stream);
    var headerArray = sr.ReadLine().Split(',');
    foreach (var header in headerArray)
    {
        var fieldName = header.Replace("\"", "").Replace(" ", "");
        cb.AddField(fieldName, typeof(string));
    }

    var engine = new FileHelperEngine(cb.CreateRecordClass());

    List<MyClass> objects = new List<MyClass>();
    DataTable dt = engine.ReadStreamAsDT(sr);
    foreach (DataRow row in dt.Rows) // Loop over the rows.
    {
        MyClass myClass = new MyClass();
        for (int i = 0; i < row.ItemArray.Length; i++) // Loop over the items.
        {
            if (headerArray[i] == "ImportantField")
                myClass.SomeImportantField = row.ItemArray[i].ToString();
            if (headerArray[i] == "OtherField")
                myClass.SomeOtherField = row.ItemArray[i].ToString();
            if (headerArray[i] == "AnotherField")
                myClass.AnotherField = row.ItemArray[i].ToString();
            objects.Add(myClass);
        }
    }
    return objects;
}
公共类MyClass
{
公共字符串SomeImportantField{get;set;}
公共字符串SomeOtherField{get;set;}
公共字符串另一个字段{get;set;}
}
公共IList GetObjectsFromStream(流)
{
var cb=new DelimitedClassBuilder(“temp”,“,”){IgnoreFirstLines=1,IgnoreEmptyLines=true,Delimiter=“,”};
var sr=新的流阅读器(流);
var headerArray=sr.ReadLine().Split(',');
foreach(表头阵列中的var表头)
{
var fieldName=header.Replace(“\”,”).Replace(“,”);
cb.AddField(字段名,类型(字符串));
}
var engine=new FileHelperEngine(cb.CreateRecordClass());
列表对象=新列表();
DataTable dt=引擎读取流ASDT(sr);
foreach(dt.Rows中的DataRow)//在行上循环。
{
MyClass MyClass=新的MyClass();
for(int i=0;i
我不熟悉FileHelper,但我使用名为LogParser的工具完成了与您描述的非常类似的工作(http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=24659)结合我自己的“DelimitedTextFileData”“类。如果您决定FileHelpers不能满足您的需要,我建议您下一步研究LogParser。即使它对您当前的项目来说有些过分,但对于未来的项目来说,它是一个非常好的工具

LogParser是一个允许“类似SQL”的工具对各种来源的查询-包括CSV文本文件。它是基于命令行的.exe,但也附带了一个API,您可以在.NET项目中引用。在我的情况下,我处理的文本文件可以由任何字符分隔,因此我开发了自己的类,让我在类实例化和然后使用simp