0 / 0 / 2
Регистрация: 17.02.2016
Сообщений: 163
|
||||||
1 | ||||||
Сохранение данных из List<string> в txt20.03.2016, 10:56. Показов 3274. Ответов 15
Метки нет (Все метки)
многопоточный парсер html.
данные парсятся регулярными выражениями и заносятся в List <string>. примерный вид List: 1 12 123 1234 ... то есть, каждая новая строка отличается новым добавленным последним элементом. данные из List, периодически сохраняются в txt. реализовано так:
т.к. данные в txt так и есть как List: Код
1 12 123 1234 ... не помогает. почему-то все равно записывается с дублями. возможно из-за многопоточности, но почему тогда lock не срабатывает. в общем, как решить данную проблему? P.S. периодическая чистка List производится - vfail.Clear();
0
|
20.03.2016, 10:56 | |
Ответы с готовыми решениями:
15
Сохранение данных с ListView в .txt и загрузка с .txt Разбить List<string> на несколько обьектов c List<string> Работа с List<> и базой данных в txt Конвертировать один элемент из List<List<Class>> в list и string |
82 / 82 / 51
Регистрация: 25.02.2016
Сообщений: 243
|
|
20.03.2016, 11:19 | 2 |
Вы сами даете команду дописывать в конец файла. Поменяйте значение с true на false и файл будет перезаписыватся. Тогда вы сможете просто записывать последнюю строку как и хотели.
1
|
0 / 0 / 2
Регистрация: 17.02.2016
Сообщений: 163
|
|
20.03.2016, 11:28 [ТС] | 3 |
к сожалению, данное исправление не помогло.
да и не подходит в моём случае, т.к. идёт постоянное добавление новых элементов при парсинге в List. после записи в txt происходит vfail.Clear(); (чистка List). а если файл будет перезаписываться, то сотрутся ранее сохранённые данные.
0
|
82 / 82 / 51
Регистрация: 25.02.2016
Сообщений: 243
|
|
20.03.2016, 11:52 | 4 |
Тогда я не пойму в чем у вас проблема. Просто каждый раз записывайте последний элемент. Вы записываете те данные, которые у вас есть. Если бы у вас не срабатывал lock, то при доступе к одному файлу из разных потоков у вас была бы соответствующая ошибка.
0
|
0 / 0 / 2
Регистрация: 17.02.2016
Сообщений: 163
|
|
20.03.2016, 12:06 [ТС] | 5 |
вот и я не могу понять, в чём проблема. так то оно так, но на практике не получается.
вот пример отчёта файла txt -> url парсим домены. строки в List имеет вид: Кликните здесь для просмотра всего текста
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 вот он мне все эти строки и сохраняет в файл.
0
|
9 / 9 / 7
Регистрация: 15.03.2015
Сообщений: 34
|
|
20.03.2016, 12:16 | 6 |
А вы несколькими потоками пишете? Ибо я просто не понимаю почему вы не смогли записать последний элемент, может в цикле писали?
0
|
82 / 82 / 51
Регистрация: 25.02.2016
Сообщений: 243
|
||||||
20.03.2016, 12:18 | 7 | |||||
0
|
0 / 0 / 2
Регистрация: 17.02.2016
Сообщений: 163
|
|||||||||||
20.03.2016, 12:27 [ТС] | 8 | ||||||||||
нет. по таймеру в отдельном методе происходит lock (vfail).
сам код: List<string> vfail = new List<string>(); - глобально в проекте. основной метод:
0
|
82 / 82 / 51
Регистрация: 25.02.2016
Сообщений: 243
|
|
20.03.2016, 12:32 | 9 |
А вы проходили в дебаге? Может у вас идет накопление в переменной result?
0
|
0 / 0 / 2
Регистрация: 17.02.2016
Сообщений: 163
|
|
20.03.2016, 12:43 [ТС] | 10 |
если вы про точку останова, то смотрел. там как положено, один домен + "\r\n"
может ни так что смотрю. предположим что есть что нужно сделать, что бы это исправить. попробую, может поможет.
0
|
82 / 82 / 51
Регистрация: 25.02.2016
Сообщений: 243
|
||||||
20.03.2016, 12:54 | 11 | |||||
Можно так:
0
|
0 / 0 / 2
Регистрация: 17.02.2016
Сообщений: 163
|
|
20.03.2016, 13:09 [ТС] | 12 |
не помогло
в каком? регуляркой парсится html. результат добавляется в List. из List периодически сохраняется в txt. что ни так?
0
|
82 / 82 / 51
Регистрация: 25.02.2016
Сообщений: 243
|
|
20.03.2016, 13:15 | 13 |
Я не пойму зачем вы сохраняете в лист накопленные строки, почему не писать по одного результату в строку. А если вам нужно накопление, то почему не обойтись просто строкой. Ну вам конешно виднее, я же не знаю какой у вас проект и какие там условия.
Боюсь, что у меня закончились варианты. Без исходника, который можно закомпилить и посмотреть, что там происходит я больше ни чем не могу помочь. (((
1
|
82 / 82 / 51
Регистрация: 25.02.2016
Сообщений: 243
|
|
20.03.2016, 13:52 | 15 |
Из того, что я смог понять, генерация вашего файла происходит абсолютно случайным образом. Вы из 10 потоков заполняете, один и то же массив данными и в произвольные моменты времени записываете его на диск. Код отрабатывает так как у вас написано. Вы можете описать конечную цель вашей программы? К сожалению я не смог ее понять. (((
0
|
0 / 0 / 2
Регистрация: 17.02.2016
Сообщений: 163
|
|
21.03.2016, 00:45 [ТС] | 16 |
Сообщение было отмечено Psilon как решение
Решение
да.
периодически записать собранные данные в txt без дублей из List <string>. это конечно можно реализовать сразу в методе main, без List: спарсить данные, сформировать result, открыть txt, записать result, закрыть txt. Но тогда резко увеличивается время работы программы, т.к. много страниц для парсинга. Добавлено через 5 часов 19 минут никто, ничего, больше не подскажет?! Добавлено через 2 часа 20 минут всем спасибо. вопрос решается добавлением строки string result = ""; в цикл foreach.
0
|
21.03.2016, 00:45 | |
21.03.2016, 00:45 | |
Помогаю со студенческими работами здесь
16
Как передать list<string> в поток и как такой же list<string> вывести из потока? Сохранение данных в txt Сохранение данных в txt Сохранение данных пользовательского типа в list из stl Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |