0 / 0 / 2
Регистрация: 17.02.2016
Сообщений: 163
1

Сохранение данных из List<string> в txt

20.03.2016, 10:56. Показов 3274. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
многопоточный парсер html.
данные парсятся регулярными выражениями и заносятся в List <string>.
примерный вид List:
1
12
123
1234
...
то есть, каждая новая строка отличается новым добавленным последним элементом.
данные из List, периодически сохраняются в txt.
реализовано так:
C#
1
2
3
4
5
6
7
8
9
   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();
                }
проблема в том, что в txt записываются все строки из List. отсюда получается множество дублей.
т.к. данные в txt так и есть как List:
Код
1
12
123
1234
...
пробовал записывать последнюю строку из List - var x = vfail[vfail.Count - 1];
не помогает. почему-то все равно записывается с дублями. возможно из-за многопоточности, но почему тогда lock не срабатывает.
в общем, как решить данную проблему?

P.S.
периодическая чистка List производится - vfail.Clear();
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2016, 10:56
Ответы с готовыми решениями:

Сохранение данных с ListView в .txt и загрузка с .txt
Сохранение данных с ListView в .txt и загрузка с .txt Помогите.

Разбить List<string> на несколько обьектов c List<string>
Задумался как я то кусочками все делить оказалось не так уж просто :scratch: List&lt;string&gt;...

Работа с List<> и базой данных в txt
Всем привет! Я считал строки с файла вот такой строчкой кода: List&lt;string&gt; database =...

Конвертировать один элемент из List<List<Class>> в list и string
Как можно перевести один выбранный элемент из List&lt;List&lt;Data&gt;&gt; myList в list и string? Например,...

15
82 / 82 / 51
Регистрация: 25.02.2016
Сообщений: 243
20.03.2016, 11:19 2
Цитата Сообщение от Kuk Посмотреть сообщение
var sw = new StreamWriter("ALL.txt", true);
Вы сами даете команду дописывать в конец файла. Поменяйте значение с true на false и файл будет перезаписыватся. Тогда вы сможете просто записывать последнюю строку как и хотели.
1
0 / 0 / 2
Регистрация: 17.02.2016
Сообщений: 163
20.03.2016, 11:28  [ТС] 3
Цитата Сообщение от orlov87 Посмотреть сообщение
Поменяйте значение с true на false и файл будет перезаписыватся
к сожалению, данное исправление не помогло.
да и не подходит в моём случае, т.к. идёт постоянное добавление новых элементов при парсинге в 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
Цитата Сообщение от orlov87 Посмотреть сообщение
Тогда я не пойму в чем у вас проблема. Просто каждый раз записывайте последний элемент. Вы записываете те данные, которые у вас есть. Если бы у вас не срабатывал lock, то при доступе к одному файлу из разных потоков у вас была бы соответствующая ошибка.
вот и я не могу понять, в чём проблема. так то оно так, но на практике не получается.
вот пример отчёта файла 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
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var vfail = new List<string>();
            for (var i = 0; i < 10; i++)
            {
                vfail.Add(i.ToString());
                vfail.Add("asd");
                lock (vfail)
                    if (vfail.Count > 0)
                    {
                        using (var sw = new StreamWriter("ALL.txt", true))
                            foreach (var akk in vfail)
                                sw.Write(akk);
                        vfail.Clear();
                    }
            }
Я так понимаю у вас происходит, что-то такое. Это ваш код, он четко отрабатывает.
0
0 / 0 / 2
Регистрация: 17.02.2016
Сообщений: 163
20.03.2016, 12:27  [ТС] 8
Цитата Сообщение от Mifort Посмотреть сообщение
А вы несколькими потоками пишете?
нет. по таймеру в отдельном методе происходит lock (vfail).

сам код:
List<string> vfail = new List<string>(); - глобально в проекте.
основной метод:
C#
1
2
3
4
5
6
7
// good парсим регуляркой
foreach (Match m in good)
                    {
                        result = result + m.Value + "\r\n";
                        lock (vfail)
                        vfail.Add(result);
                    }
по таймеру срабатывает метод:
C#
1
2
3
4
5
6
7
8
9
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();
                }
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
Цитата Сообщение от orlov87 Посмотреть сообщение
А вы проходили в дебаге? Может у вас идет накопление в переменной result?
если вы про точку останова, то смотрел. там как положено, один домен + "\r\n"

может ни так что смотрю.
предположим что есть
Цитата Сообщение от orlov87 Посмотреть сообщение
Может у вас идет накопление в переменной result?
что нужно сделать, что бы это исправить.
попробую, может поможет.
0
82 / 82 / 51
Регистрация: 25.02.2016
Сообщений: 243
20.03.2016, 12:54 11
Можно так:
C#
1
2
3
4
5
6
7
8
// good парсим регуляркой
result = string.Empty;
foreach (Match m in good)
                    {
                        result = result + m.Value + "\r\n";
                        lock (vfail)
                        vfail.Add(result);
                    }
Очень странный код. Я как не стараюсь не могу понять его смысл. Зачем вам данные в таком формате?
0
0 / 0 / 2
Регистрация: 17.02.2016
Сообщений: 163
20.03.2016, 13:09  [ТС] 12
Цитата Сообщение от orlov87 Посмотреть сообщение
result = string.Empty;
не помогло

Цитата Сообщение от orlov87 Посмотреть сообщение
Зачем вам данные в таком формате?
в каком?
регуляркой парсится html. результат добавляется в List. из List периодически сохраняется в txt.
что ни так?
0
82 / 82 / 51
Регистрация: 25.02.2016
Сообщений: 243
20.03.2016, 13:15 13
Я не пойму зачем вы сохраняете в лист накопленные строки, почему не писать по одного результату в строку. А если вам нужно накопление, то почему не обойтись просто строкой. Ну вам конешно виднее, я же не знаю какой у вас проект и какие там условия.
Боюсь, что у меня закончились варианты. Без исходника, который можно закомпилить и посмотреть, что там происходит я больше ни чем не могу помочь. (((
1
0 / 0 / 2
Регистрация: 17.02.2016
Сообщений: 163
20.03.2016, 13:19  [ТС] 14
Цитата Сообщение от orlov87 Посмотреть сообщение
Без исходника, который можно закомпилить и посмотреть, что там происходит
проект как есть -> url
0
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 как решение

Решение

Цитата Сообщение от orlov87 Посмотреть сообщение
Вы из 10 потоков заполняете, один и то же массив данными и в произвольные моменты времени записываете его на диск.
да.

Цитата Сообщение от orlov87 Посмотреть сообщение
Вы можете описать конечную цель вашей программы?
периодически записать собранные данные в txt без дублей из List <string>.
это конечно можно реализовать сразу в методе main, без List: спарсить данные, сформировать result, открыть txt, записать result, закрыть txt. Но тогда резко увеличивается время работы программы, т.к. много страниц для парсинга.

Добавлено через 5 часов 19 минут
никто, ничего, больше не подскажет?!

Добавлено через 2 часа 20 минут
всем спасибо.
вопрос решается добавлением строки string result = ""; в цикл foreach.
0
21.03.2016, 00:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2016, 00:45
Помогаю со студенческими работами здесь

Как передать list<string> в поток и как такой же list<string> вывести из потока?
Как передать list&lt;string&gt; в поток и как такой же list&lt;string&gt; вывести из потока в richtextbox?...

Сохранение данных в txt
Мне нужно на страницу добавить 2 текстовых поля и кнопку, а в HTML я полный 0. В первое поле...

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

Сохранение данных пользовательского типа в list из stl
Здравствуйте. Пишу программу реализации списка. #include &lt;iostream&gt; #include &lt;iterator&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru