我有一个相对较大的csv文件,有很多列。我需要读取该文件,并确定是否有多个记录具有相同的“测试文件名”字段,并且仅获取第一条记录(按日期)并将其复制到新文件,从本质上删除“重复”。这些记录不是真正的重复项,因为每个记录都有不同的数据,但具有相同的“测试文件名”,因此,一般的“删除重复项”方法对我不起作用。重复项很少且间隔很远,因此我需要循环遍历所有记录并仅获取输入的第一个记录,该记录由记录中的“日期时间”字段确定。
我只需要每个“测试文件名”之一
我尝试了分组依据和排序依据,但我不确定我做得是否正确,因为它没有删除第二条记录。
更新:让我澄清一下,该文件并没有那么大,不到 1 MB,但有数千条记录。我正在尝试在 SSIS 包的脚本任务中执行此过程。对于我在这里发帖以及总体主题的无知,我深表歉意。我是 C# 新手,因为我主要使用 SQL。
嗯,像下面这样的东西对你有用。这个想法是逐行读取 CSV 文件,获取
FileName
字段,将其保存在 HashSet
中,并写入一个新的 CSV 文件,每个 FileName
仅包含一条记录:
var fileNameSet = new HashSet<string>();
using var reader = new StreamReader("path\\to\file.csv"));
using var writer = new StreamReader("path\\to\newfile.csv"));
using var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture));
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
csv.Read();
csv.ReadHeader();
while (csv.Read())
{
var @record = csv.GetRecord<Foo>();
var fileName = @record.FileName;
if(fileNameSet.Contains(fileName)) continue;
csvWriter.WriteRecord(@record);
csvWriter.NextRecord();
fileNameSet.Add(fileName);
}
您可能想使用
HashSet<int>
代替字符串,并将 var fileName = record.FileName;
更改为 var fileName = record.FileName.GetHashCode();
,这样会消耗更少的内存。此示例使用 CsvHelper