5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42

Парсинг большого текстового файла

17.02.2016, 10:35. Показов 5572. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую! Вопрос вот в чем - Как открыть файл и прочесть содержимое разделив его на итемы. Пример кода на питоне.
Python
1
2
3
4
5
6
file = open('X:\\model\\'+date+'.cut\\MainCategories\\омом.txt')
        for line in file:
            hours = []
            item = line.split('|')
            cam = item[1].split(',')
            time = item[2].split(',')
И как после завершения цикла все удалить, чтоб начать парсинг следующего файла и продолжить цикл.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.02.2016, 10:35
Ответы с готовыми решениями:

Парсинг строк из текстового файла
Доброго времени суток, господа! Уже n-ое количество времени мучаюсь со следующей задачей: Имеется программа, в которой по нажатию...

qt - парсинг большого файла
теперь у меня такая проблема. Имеется txt файл в unicode, в нем 120 000 строк текста вида слово=транскрипция, как бы мне находить...

Парсинг текстового файла в map
Здравствуйте! Подскажите, пожалуйста, как парсить текстовый файл в map. Например, есть файл, в котором записано следующее: 1 a 2 b 3...

36
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
17.02.2016, 16:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Avazart Посмотреть сообщение
странно что работаете ибо wchar_t/char не совместимо
Где именно? В open? Так он умеет открывать файлы с именами, заданными как через const char *, так и через const wchar_t *. Да и у SplitString никакой проблемы с AnsiString-ами не было никогда.

Добавлено через 4 минуты
Цитата Сообщение от Moriska32 Посмотреть сообщение
я так полагаю места не хватило опять где то
Нет. Это вылет за пределы массива TStringDynArray. Как пример - если при парсинге строки "test|10,20,30|3,4,5" попытаться обратиться к time[3] или cam[3] - то будет подобная ошибка. Потому что индексы как массива time, так и массива cam тут от 0 до 2.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.02.2016, 17:58
Цитата Сообщение от volvo Посмотреть сообщение
так и через const wchar_t *.
Не умеет, по крайней мере не должен уметь http://ru.cppreference.com/w/c... tream/open
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
17.02.2016, 18:12
Цитата Сообщение от Avazart Посмотреть сообщение
по крайней мере не должен уметь
Билдер с тобой не согласен:



Можешь предъявить претензии разработчикам, или писать с использованием тех компиляторов, которые делают "как надо". Я, если кто забыл, программы без тестирования не выкладываю. Если выложено - значит, Билдер умеет, и код отработал.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.02.2016, 18:47
Цитата Сообщение от volvo Посмотреть сообщение
или писать с использованием тех компиляторов, которые делают "как надо"
Цитата Сообщение от volvo Посмотреть сообщение
если кто забыл, программы без тестирования не выкладываю.
А вот интересно, умеет ли это новый компилятор на clang
Цитата Сообщение от volvo Посмотреть сообщение
Билдер умеет, и код отработал.
И отработает ли код с ним.
0
17.02.2016, 18:58
 Комментарий модератора 

Avazart, нет, не интересно. В рамках данной темы интересен "парсинг большого текстового файла".
0
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 10:15  [ТС]
Ммм.. но я не выводил в текст, я для начала решил просто собрать массив. Но при расчете 1 файла выдает такую ошибку.

Добавлено через 15 минут
С маленькими файлами работает отлично, все что мне нужно выносит и как я хочу заносит куда нужно. Но вот большими файлами отказывается нормально работать.

Добавлено через 30 секунд
Просто у меня файли текстовые размерами 600 и более МБ
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
18.02.2016, 10:25
Цитата Сообщение от Moriska32 Посмотреть сообщение
я для начала решил просто собрать массив
Ну вот поэтому и ошибка. Какой смысл читать файл построчно, экономя память, и тут же бездарно разбазарить эту память для хранения результатов парсинга? Пиши результаты сразу в файл, ничего не будет вылетать.
0
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 12:43  [ТС]
Так даже при занесении это в файл разве оно не останется в памяти? да и те значения которые я выношу из файла мне еще подсчитать надо. Я могу скинуть полный код работающий на питоне. Но я хочу его переписать в си в целях ускорения обработки.

Добавлено через 1 час 4 минуты
При занесении значений в файл мне позже снова придется делать еще парсинг чтобы сравнить значения с таблицей после чего все эти данные вынести в ексель. И если учесть что файлов может быть более 30 такого обьема то мне кажется что этот вариант не подходит.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.02.2016, 12:50
Цитата Сообщение от Moriska32 Посмотреть сообщение
Но я хочу его переписать в си
Это не раздел си, это раздел плюсов.

Цитата Сообщение от Moriska32 Посмотреть сообщение
Я могу скинуть полный код работающий на питоне.
Может с этого стоило начинать?
0
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 12:58  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
baza.execute("...")
m = baza.fetchall()
baza.execute("....")
ms = baza.fetchall()
connect.close()
startdate = datetime.datetime(2015,11,1)
datelist = [datetime.datetime.strftime(startdate+datetime.timedelta(days=i),'%Y-%m-%d') for i in range(30)]
resultGT = {}
for date in datelist:
    print(date)
    M = set()
    MS = set()
    ALL = set()
    resultGT[date] = {'MS':0,'M':0,'ALL':0}
    try:
        file = open('X:\\model\\'+date+'.cut\\MainCategories\\омномv3.txt')
        for line in file:
            hours = []
            item = line.split('|')
            cam = item[1].split(',')
            time = item[2].split(',')
            CountMs = 0
            CountM = 0
            for camera in cam:
                if c in mcams: CountM += 1
                if c in inMscams: CountMs += 1
            if CountMs == 0 and CountM != 0: resultGT[date]['MK'] += 1
            if CountMs != 0 and CountM == 0: resultGT[date]['MS'] += 1
            if CountMs != 0 and CountM != 0: resultGT[date]['ALL'] += 1
        file.close()
    except FileNotFoundError: print('HET')
Некоторые строки выкинул, дабы сохранить конфиденциальность. там просто сетевые запросы есть)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.02.2016, 16:29
Ну а теперь код на плюсах покажите, который у вас ошибки выдает.

Добавлено через 9 минут
И пример файла.
0
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 16:35  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
for (int i = 0; i <= sub; i++) {
        AnsiString typ[0], s, pb;
        Application->ProcessMessages();
        ProgressBar1->Value += 1;
        DateStart +=1.0;
               Memo1 ->Lines ->Add(FormatDateTime ("yyyy-mm-dd", DateStart));
               data = FormatDateTime ("yyyy-mm-dd", DateStart);
               //Memo1 ->Lines ->Add(data);
 
 
            if ((CheckBox6->IsChecked== false)&&(CheckBox7->IsChecked == false)) {
 
 
 
                Memo1 -> Lines ->Add(L"Выберите ... или ...");
                    break;
                    }
                    else {
                      // Проверка на выбор типа 
                    if ((CheckBox6->IsChecked == true)&&(CheckBox7->IsChecked == true)) {
                    AnsiString typ[2] = {"GT","IT"};
                    //ifstream fileit, filegt;
                    std::auto_ptr<TStringList>fileit(new TStringList);
                    std::auto_ptr<TStringList>filegt(new TStringList);
                    fileit->Clear();
                    filegt->Clear();
                    String sgt="\\\\DMITRY-HP\\SharedFolder\\model"+data+".cut\\MainCategories"+typ[0]+"v3.txt";
                    String sit="\\\\DMITRY-HP\\SharedFolder\\model"+data+".cut\\MainCategories"+typ[1]+"v3.txt";
                     Memo1->Lines->Add(sgt);
                     Memo1->Lines->Add(sit);
 
                     //fileit->LoadFromFile(sit);
                     //filegt->LoadFromFile(sgt);
                     //String filename = "d:\\test\\01.txt";
 
    ifstream ifile; //Объявление списка ifile
    
    ifile.open(sgt.c_str()); //Открыть файл
    if (ifile.good()) //Проверка на присутствие файла
    {
        while (!ifile.eof()) //цикл до последней строчки
        {
            std::string line;  // Объявление строки line
            getline(ifile, line); //Построчное чтение
 
            TStringDynArray items = SplitString(line.c_str(), "|"); //разделение строки на итемы
            TStringDynArray cam = SplitString(items[1], ",");       //разделение итема на массивы
            TStringDynArray time = SplitString(items[2], ",");
 
                        
            Memo1->Lines->Add(items[1]);
            
        }
    }
    ifile.close(); //закрыть файл
Добавлено через 5 минут
что то слеши пропали и не добавляются, но не суть
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
18.02.2016, 16:45
Цитата Сообщение от Moriska32 Посмотреть сообщение
что то слеши пропали
в этом вэб-редакторе слэши передаются "двойными"
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.02.2016, 16:49
Moriska32,
Проблема в том что у вас нет проверок ни в коде на питоне не на С++.
Нужно проверять а есть ли такой элемент items[1] т.е с индексом 1 или нет, может там в файле нет двух элементов.
0
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 16:50  [ТС]
Не могу сказать почему, но их не может не быт, они есть, на питоне все прекрасно работает, без ошибок с памятью.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.02.2016, 17:06
Лучший ответ Сообщение было отмечено Moriska32 как решение

Решение

Цитата Сообщение от Moriska32 Посмотреть сообщение
Не могу сказать почему, но их не может не быт, они есть, на питоне все прекрасно работает, без ошибок с памятью.
Это не значит что не нужно обрабатывать ошибки.

C++
1
2
3
4
#include <vector>
#include <string>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string.hpp>

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::ifstream ifs("filename.txt");
 
std::string line;
while(getline(ifs, line))
{
  std::vector<std::string> items;
  boost::split(items,line,boost::is_any_of("|"));
 
  if(items.size()>=3) // Количество элементов больше  или равное 3 (индексы 0,1,2)
  {
    std::vector<std::string> cams;
    boost::split(cams,items[1],boost::is_any_of(","));
 
    std::vector<std::string> times;
    boost::split(times,items[2],boost::is_any_of(","));
 
    Memo1->Lines->Add(items[1].c_str());
  }
  else Memo1->Lines->Add("Меньше трех итемов");
}
1
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 17:10  [ТС]
Воо векторы я сейчас о них читал, но чот туговато шло, спасибо сейчас опробую.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.02.2016, 17:10

Функция fopen() для большого текстового файла читает только первую строку
Есть текстовой файл 4.5 мб, нужно его открыть для чтения из него строк. FILE *f = fopen(&quot;C:\\members.txt&quot;,...

Считывание и парсинг данных с текстового файла
Как правильно считать такую строку с етого файла? 3 circle 3.0 3.0 5.0 square 0.0 0.0 0.0 4.0 4.0 4.0 4.0 0.0 triangle 3.0 3.0 0.0...

Добавить в конец первого текстового файла содержимое второго текстового файла
Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла.

Парсинг большого количества hex значений из текстового файла
Нужно из текстового файла прочитать кучу hex целочисленных значений от int16 до uint64, а книжку читать не хочется, но если придётся, то...

Парсинг большого XML файла
Доброго времени! Имеется очень большой XML из которого нужно вытащить данные. Проблема в том что стандартный парсер TXMLDocument пытается...


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

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

Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru