Проверка файла на совпадения - PullRequest
0 голосов
/ 07 сентября 2011

Я сохраняю каждую строку в списке в конец файла ...

Но я бы хотел проверить, есть ли в этом файле эта строка, поэтому он не сохраняет ту же строкудважды.

Поэтому, прежде чем использовать StreamWriter для записи файла, я хочу проверить каждый элемент в списке, чтобы увидеть, существует ли он в файле.Если это так, я хочу удалить его из списка перед использованием StreamWriter.

..... Если, конечно, есть лучший способ сделать это?

Ответы [ 4 ]

1 голос
/ 08 сентября 2011

Если у вас небольшие файлы, и вы ограничены плоскими файлами, плюс таблица базы данных не является опцией и т. Д., То вы можете просто прочитать существующие элементы в список, а затем выполнить условие операции записи на основе изучения списка.Опять же, я бы попробовал другой метод, если это вообще возможно (таблица БД и т. Д.), Но просто самый прямой ответ на ваш вопрос ...

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);
1 голос
/ 08 сентября 2011

Полагаю, вы могли бы инициализировать список из файла, добавив каждую строку в качестве новой записи в список.

Затем, когда вы добавляете в список, проверьте, содержит ли онстрока уже.

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

Когда вы будете готовы сохранить файл, просто запишите, что находится в списке.

0 голосов
/ 08 сентября 2011

Если вы можете сортировать файл каждый раз, когда сохраняете, было бы гораздо быстрее определить, существует ли конкретная запись.

Также хорошей идеей будет упомянуть таблицу базы данных, как упоминалось ранее, так как вы можете искатьзапись, которая будет добавлена ​​в таблицу, и, если она не существует, добавьте ее.

Это зависит от того, стремитесь ли вы к скорости (дБ), быстрой реализации (доступ к файлам) или вам все равно (используйте в списках памяти)пока файл не станет слишком большим и не сгорит и не падает.)

Подобный случай можно найти здесь

0 голосов
/ 08 сентября 2011

Это будет медленно, особенно если в таблицу поступает много данных.

Если возможно, можете ли вы сохранить все строки в таблице базы данных с первичным ключом в текстовом столбце?Затем добавьте, если значение столбца не существует, и когда вы закончите, дамп таблицы в текстовый файл?Я думаю, что именно это я и сделаю.

Я хотел бы отметить, что я не думаю, что это идеально, но это должно быть достаточно производительно (с использованием синтаксиса 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...