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

时间:2014-02-03 21:25:12

标签: c# .net web-services parsing csv

我在.NET Web服务中使用以下代码,将其数据形成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文件的一列中找到,其数据结构如下:

Groups>Subgroup>item,在这种情况下,此产品属于“群组”类别。

产品的类别列也可以结构化为:

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

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

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

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

这一行var temp = columns[5].Split('|', '>');得到第一个结构化值,并用管道分隔,并在此处将其设置为产品的类别Category = temp[0]

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

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

这大部分都有效,但是如何更改代码以检查和分配两个类别?

我是否可以更改此var temp = columns[5].Split('|', '>');以获取第一个和最后一个值(如果存在)并将它们分配给Category = temp[0]

2 个答案:

答案 0 :(得分:0)

你绝对应该使用一些CSV解析器而不是手动执行此操作。手动解析CSV时存在太多潜在问题和问题,使用现有工具更容易,更快捷:

答案 1 :(得分:0)

要获得指定问题陈述的第二组值,您可以执行以下操作。

    ...
    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类中的类别存储为实现ILIST的内容。