我在.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]
。
答案 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的内容。