获取 CSV 列中的第一个值,没有重复项
本文关键字:CSV 第一个 获取 | 更新日期: 2023-09-27 18:37:15
我使用以下代码通过 Web API 从 csv 文件中获取项目列表:
private List<Item> items = 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 = temp[0],
Description = columns[2],
Photo = columns[7]
});
}
}
项目列表的 Name 属性必须来自结构如下的列:
Groups>Subgroup>item
因此,我在代码中使用var temp = columns[5].Split('|', '>');
来获取">"之前列的第一个元素,在上述情况下是 Groups。这工作正常。
但是,我在结果中得到了许多重复项。这是因为列中的其他项目可能是:
(这些是我的csv第9列中的一些条目) Groups>Subgroup2>item2
、Groups>Subgroup3>item4
、Groups>Subgroup4>item9
都从Groups
开始,但我只想得到一次Groups
。
因为它是我得到一长串Groups
.如何停止重复?
我希望如果列表中的项目返回Name
"组",则不会返回具有该名称的其他项目。如何进行此检查并实施它?
如果成功获取组列表,请获取该组列表并使用 LINQ:
var undupedList = dupedList
.Distinct();
更新:明显不起作用的原因是因为您的代码不仅请求名称,还请求描述等......如果你只要求名称,Distinct() 将起作用。
更新 2:试试这个:
//Check whether already exists
if((var match = items.Where(q=>q.Name == temp[0])).Count==0)
{
items.add(...);
}
使用列表来存储 Item.Name 怎么样?然后在调用项目之前检查 List.Contains()。添加()
简单,只有 3 行代码,它可以工作。
IList<string> listNames = new List();
//
for (int i = 0; i < lines.Count; i++)
{
//
var temp = columns[5].Split('|', '>');
if (!listNames.Contains(temp[0]))
{
listNames.Add(temp[0]);
items.Add(new Item()
{
//
});
}
}