根据一个字段识别大文件中的重复项并删除记录

问题描述 投票:0回答:1

我有一个相对较大的csv文件,有很多列。我需要读取该文件,并确定是否有多个记录具有相同的“测试文件名”字段,并且仅获取第一条记录(按日期)并将其复制到新文件,从本质上删除“重复”。这些记录不是真正的重复项,因为每个记录都有不同的数据,但具有相同的“测试文件名”,因此,一般的“删除重复项”方法对我不起作用。重复项很少且间隔很远,因此我需要循环遍历所有记录并仅获取输入的第一个记录,该记录由记录中的“日期时间”字段确定。

我只需要每个“测试文件名”之一

Duplicate Records

Identifying fields

我尝试了分组依据和排序依据,但我不确定我做得是否正确,因为它没有删除第二条记录。

更新:让我澄清一下,该文件并没有那么大,不到 1 MB,但有数千条记录。我正在尝试在 SSIS 包的脚本任务中执行此过程。对于我在这里发帖以及总体主题的无知,我深表歉意。我是 C# 新手,因为我主要使用 SQL。

c# linq ssis
1个回答
0
投票

嗯,像下面这样的东西对你有用。这个想法是逐行读取 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

© www.soinside.com 2019 - 2024. All rights reserved.