C# 获取C中的第一列和最后一列值
我在.NETWeb服务中使用以下代码,以CSV文件的形式获取其数据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
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中的值匹配