【问题标题】:Checking a File for matches检查文件是否匹配
【发布时间】:2011-11-12 11:32:31
【问题描述】:

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

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

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

.....当然,除非有更好的方法来做这件事?

【问题讨论】:

  • 是否有最大行数,还是完全开放式,文件可以任意增长?
  • @Neil Fenwick:它是开放式的:-/

标签: c# duplicates match streamwriter


【解决方案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】:

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

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

        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);
    

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

    【讨论】:

    • 如果文件是 10 或 100 MB 怎么办?
    【解决方案3】:

    这会很慢,尤其是当您有大量数据进入表时。

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

    我想指出我不认为这是理想的,但它应该是相当高性能的(使用 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;
    

    【讨论】:

    • 所以你会检查文本中的一列以查看该列是否已经存在?你能解释一下你的意思吗?也许是伪代码/代码来帮助演示?
    【解决方案4】:

    如果您可以在每次保存时对文件进行排序,则可以更快地确定特定条目是否存在。

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

    这取决于您是追求速度 (db)、快速实现(文件访问)还是不在乎(在内存列表中使用,直到文件变得太大并烧毁和崩溃。)

    类似案例可以找到here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 2010-10-13
      • 1970-01-01
      • 2017-06-15
      • 2014-03-05
      • 2013-03-21
      • 1970-01-01
      相关资源
      最近更新 更多