Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 获取C中的第一列和最后一列值_C#_.net_Web Services_Parsing_Csv - Fatal编程技术网

C# 获取C中的第一列和最后一列值

C# 获取C中的第一列和最后一列值,c#,.net,web-services,parsing,csv,C#,.net,Web Services,Parsing,Csv,我在.NETWeb服务中使用以下代码,以CSV文件的形式获取其数据 private List<Item> ietms = new List<Item>(); public ItemRepository() { string filename = HttpRuntime.AppDomainAppPath + "App_Data\\items.csv"; var lines = File.ReadAllLines(filename).Skip(1).ToL

我在.NETWeb服务中使用以下代码,以CSV文件的形式获取其数据

private List<Item> ietms = new List<Item>();

public ItemRepository()
{
    string filename = HttpRuntime.AppDomainAppPath + "App_Data\\items.csv";

    var lines = File.ReadAllLines(filename).Skip(1).ToList();

    for (int i = 0; i < lines.Count; i++)
    {
        var line = lines[i];

        var columns = line.Split('$');

        //get rid of newline characters in the middle of data lines
        while (columns.Length < 9)
        {
            i += 1;
            line = line.Replace("\n", " ") + lines[i];
            columns = line.Split('$');
        }

        //Remove Starting and Trailing open quotes from fields
        columns = columns.Select(c => { if (string.IsNullOrEmpty(c) == false) { return c.Substring(1, c.Length - 2); } return string.Empty; }).ToArray();

        var temp = columns[5].Split('|', '>');

        items.Add(new Item()
        {
            Id = int.Parse(columns[0]),
            Name = columns[1],
            Description = columns[2], 
            Category = temp[0]
        });
    }
}
此代码从CSV文件中获取产品列表及其名称、描述等。每个产品属于一个或两个类别:Category=temp[0]

在csv文件的一列中可以找到每个产品的类别,其数据结构如下:

组>子组>项目,在这种情况下,此产品属于类别组

产品的“类别”列的结构也可以是:

MajorGroup | Groups>Subgroup>item,在这种情况下,此产品属于MajorGroup类别

此外,在许多情况下,产品的“类别”列的结构可能为:

MajorGroup | Groups>Subgroup>item | SecondGroup,在这种情况下,此产品同时属于MajorGroup和SecondGroup类别

我目前使用的上述代码完成了一半的工作。如果产品的类别在CSV文件中定义为MajorGroup | Groups>Subgroup>item | SecondGroup,则会将其分配给类别MajorGroup,而不是SecondGroup

此行var temp=columns[5]。拆分“|”和“>”;获取以taht方式构造并由管道分隔的第一个值,并在此处将其设置为产品的类别category=temp[0]

如何解决此问题,以便如果类别的结构为MajorGroup | Groups>Subgroup>item | SecondGroup,包含两个类别,那么它将显示在两个类别中

如何根据类别列数据的结构将产品分配给一个或多个类别

这在很大程度上是有效的,但是如何修改代码来检查和分配这两个类别


我是否可以更改此变量temp=columns[5]。拆分“|”和“>”;要同时获取第一个和最后一个值(如果存在),并将其分配给Category=temp[0]。

您肯定应该使用一些CSV解析器,而不是手动执行此操作。手动解析CSV时存在太多的潜在问题,使用某些现有工具(如:


要获得指定的问题语句的第二组值,可以执行以下操作

    ...
    var temp = columns[5].Split('|', '>');
    string categories= temp[0];
    if (input.Count(x => x == '|') >= 2)
    {
        categories+= "," + temp.Last();
    }
    ...
    Category = categories;
然后可以通过以下函数获得分配给类别的项目列表:

    static public IList<Item> GetProductsByCategory(string category, IList<Item> items)
    {
        return items.Where(x => x.Category.Split(',').Contains(category,StringComparer.OrdinalIgnoreCase)).ToList();
    }

一个更干净的解决方案是将类别存储在Item类中作为实现的东西。

这实际上是一项正在进行的工作。但现在我迫切需要将其作为占位符进行修复。您能为要从中提取类别的字符串提供一个规则列表吗?您提供的3个示例让我对格式感到疑惑,例如,SecondGroup是否也可以有子组:MajorGroup | Groups>Subgroup>item | SecondGroup | Groups2>Subb2>item。@TimothyWalters No。问题中定义的示例是类别列结构的唯一变体。我的CSV文件中的产品类别将采用上述三种方式中的一种。如果两个类别匹配,是否要用逗号将它们连接起来,例如,第三个示例中的category=MajorGroup,SecondGroup?@timothy不确定在这种情况下如何工作。因为我想将一个产品链接到一个或两个类别,这样我就可以在它所属的任何一个类别下浏览该产品。例如,在我的服务产品控制器中,我有一个链接查询,可以获取特定类别中的所有产品public IEnumerable GetProductsByCategorystring category{return repository.GetAllProducts.Where p=>string.Equalsp.category,category,StringComparison.OrdinalIgnoreCase;}`这与category中的值匹配