Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2016, 21:37   #1
nomerasd
Пользователь
 
Регистрация: 07.03.2016
Сообщений: 16
Вопрос Сохранение данных из List<string> в txt

многопоточный парсер html.
данные парсятся регулярными выражениями и заносятся в List <string>.
примерный вид List:
1
12
123
1234
...
то есть, каждая новая строка отличается новым добавленным последним элементом.
данные из List, периодически сохраняются в txt.
проблема в том, что в txt записываются все строки из List. отсюда получается множество дублей.
пробовал записывать последнюю строку из List - var x = vfail[vfail.Count - 1];
не помогает. почему-то все равно записывается с дублями. возможно из-за многопоточности, но почему тогда lock не срабатывает.
в общем, как решить данную проблему?

код:
List<string> vfail = new List<string>(); - глобально в проекте.
основной метод:
PHP код:
// good парсим регуляркой
foreach (Match m in good)
                    {
                        
result result m.Value "\r\n";
                        
lock (vfail)
                        
vfail.Add(result);
                    } 
по таймеру срабатывает метод:
PHP код:
lock (vfail)
                if (
vfail.Count 0)
                {
                    var 
sw = new StreamWriter("ALL.txt"true);
                    foreach (var 
akk in vfail)
                    
sw.Write(akk);
                    
sw.Close();
                    
vfail.Clear();
                } 
строки в List имеет вид:
PHP код:
YKY.RU\r\n
YKY
.RU\r\nYKY.RU\r\n
YKY
.RU\r\nYKY.RU\r\nYLC.RU\r\n
YKY
.RU\r\nYKY.RU\r\nYLC.RU\r\nYKY.RU\r\n
YKY
.RU\r\nYKY.RU\r\nYLC.RU\r\nYKY.RU\r\nYLC.RU\r\n
YKY
.RU\r\nYKY.RU\r\nYLC.RU\r\nYKY.RU\r\nYLC.RU\r\nYLF.RU\r\n
YKY
.RU\r\nYKY.RU\r\nYLC.RU\r\nYKY.RU\r\nYLC.RU\r\nYLF.RU\r\nYKY.RU\r\n
YKY
.RU\r\nYKY.RU\r\nYLC.RU\r\nYKY.RU\r\nYLC.RU\r\nYLF.RU\r\nYKY.RU\r\nYLC.RU ... 
с каждым последующим добавлением в строку: домен\r\n
вот он мне все эти строки и сохраняет в файл.
вот пример отчёта файла txt -> url

P.S.
периодическая чистка List производится - vfail.Clear();
сам проект как есть - url
можно конечно реализовать и без List, в методе main: спарсить данные, сформировать result, открыть txt, записать result, закрыть txt. Но тогда резко увеличивается время работы программы, т.к. много страниц для парсинга.

Последний раз редактировалось nomerasd; 20.03.2016 в 21:50.
nomerasd вне форума Ответить с цитированием
Старый 20.03.2016, 23:41   #2
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Цитата:
почему-то все равно записывается с дублями.
При записи в файл старый текст остаётся в result-е.

Цитата:
Сообщение от nomerasd Посмотреть сообщение
можно конечно реализовать и без List, в методе main: спарсить данные, сформировать result, открыть txt, записать result, закрыть txt. Но тогда резко увеличивается время работы программы, т.к. много страниц для парсинга.
Вы пробовали? Если дотнет кеширует запись в файл и если это соответствует спецификациям ECMA по CLI, то можно писать как есть. Файл остаётся открытым; если одновременно нужно читать его, по таймеру делаем Flush().

Если не кеширует, весь текст нужно аккумулировать в одной строке, не в коллекции. Причём result должен быть типа StringBuilder, а не string, иначе на каждой итерации у вас впустую будет создаваться новый экземпляр.

Цитата:
lock (vfail)
Не рекомендуется лочить публичные поля, лучше создать отдельный объект с минимальной видимостью.
https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx
http://stackoverflow.com/questions/6...-is-a-bad-idea

Последний раз редактировалось ds.Dante; 20.03.2016 в 23:45.
ds.Dante вне форума Ответить с цитированием
Старый 20.03.2016, 23:48   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Для парсинга HTML обычно проще взять библиотеку для парсинга HTML, чем регексп. HtmlAgilityPack например.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.03.2016, 00:39   #4
nomerasd
Пользователь
 
Регистрация: 07.03.2016
Сообщений: 16
По умолчанию

Цитата:
Сообщение от ds.Dante Посмотреть сообщение
При записи в файл старый текст остаётся в result-е.
СПАСИБО тебе, добрый человек!!!
nomerasd вне форума Ответить с цитированием
Старый 21.03.2016, 00:41   #5
nomerasd
Пользователь
 
Регистрация: 07.03.2016
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
HtmlAgilityPack например.
в архиве есть и с разбором DOM. просто мне показалось, что регулярками быстрее парсится на объёмах.
nomerasd вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать из string бинарных данных Unicode txt Krasi Общие вопросы .NET 11 06.11.2015 12:31
алгоритм BWT. List<string>.qSort / Array(char).BubbleSort Lime C# (си шарп) 11 26.11.2012 17:29
сохранение\ загрузка List View в\из бинарного файла bulldog5293 Общие вопросы Delphi 6 12.07.2010 13:59
С++ list, string... napanin Общие вопросы C/C++ 2 02.12.2009 18:55
длина List<string> Acmilan6 Общие вопросы .NET 3 17.05.2009 21:51