检查文件是否匹配

时间:2011-09-07 19:59:33

标签: c# duplicates match streamwriter

我将列表中的每一行保存到文件的末尾......

但我想做的是检查该文件是否已包含该行,因此它不会保存同一行两次。

因此,在使用StreamWriter编写文件之前,我要检查列表中的 每个 项,以查看它是否存在于文件中。如果是,我想在使用StreamWriter之前将其从列表中删除。

.....除非当然有更好的方法可以做到这一点吗?

4 个答案:

答案 0 :(得分:1)

我想你可以做的是从文件中初始化列表,将每一行添加为列表中的新条目。

然后,当您添加到列表中时,检查它是否已包含该行。

    List<string> l = new List<string>{"A", "B", "C"};  //This would be initialized from the file.
    string s;
    if(!l.Contains(s))
        l.Add(s);

准备好保存文件时,只需写出列表中的内容即可。

答案 1 :(得分:1)

假设您的文件很小并且您只能使用平面文件而且数据库表不是一个选项等,那么您可以将现有项目读入列表,然后根据检查列表进行写入操作条件。再说一遍,如果可能的话,我会尝试另一种方法(数据库表等),但只是最直接的回答你的问题......

string line = "your line to append";

// Read existing lines into list
List<string> existItems = new List<string>();
    using (StreamReader sr = new StreamReader(path))
        while (!sr.EndOfStream)
            existItems.Add(sr.ReadLine());

// Conditional write new line to file
if (existItems.Contains(line))
    using (StreamWriter sw = new StreamWriter(path))
        sw.WriteLine(line);

答案 2 :(得分:0)

这将很慢,特别是如果您有大量数据进入表格。

如果可能,您是否可以将所有行存储在文本列中具有主键的数据库表中?然后添加列值是否不存在,并在完成后将表转储到文本文件中?我想这就是我要做的事。

我想指出我不认为这是理想的,但它应该是相当高效的(使用mssql语法):

create table foo (
    rowdata varchar(1000) primary key
    );

-- for insertion (where @rowdata is new text line):

insert into foo (rowdata)
select @rowdata
where not exists(select 1 from foo where rowdata = @rowdata)

-- for output
select rowdata from foo;

答案 3 :(得分:0)

如果您可以在每次保存时对文件进行排序,那么确定特定条目是否存在会快得多。

如前所述,数据库表也是一个好主意,因为您可以搜索要添加到表中的条目,如果它不存在则添加它。

这取决于你是否遵循速度(db),快速实现(文件访问)或不关心(在文件变得太大,烧毁和崩溃之前在内存列表中使用。)

可以找到类似的案例here