Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42

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

17.02.2016, 10:35. Показов 5152. Ответов 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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
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
8484 / 6151 / 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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
17.02.2016, 18:12
Цитата Сообщение от Avazart Посмотреть сообщение
по крайней мере не должен уметь
Билдер с тобой не согласен:



Можешь предъявить претензии разработчикам, или писать с использованием тех компиляторов, которые делают "как надо". Я, если кто забыл, программы без тестирования не выкладываю. Если выложено - значит, Билдер умеет, и код отработал.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
18.02.2016, 10:25
Цитата Сообщение от Moriska32 Посмотреть сообщение
я для начала решил просто собрать массив
Ну вот поэтому и ошибка. Какой смысл читать файл построчно, экономя память, и тут же бездарно разбазарить эту память для хранения результатов парсинга? Пиши результаты сразу в файл, ничего не будет вылетать.
0
5 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 42
18.02.2016, 12:43  [ТС]
Так даже при занесении это в файл разве оно не останется в памяти? да и те значения которые я выношу из файла мне еще подсчитать надо. Я могу скинуть полный код работающий на питоне. Но я хочу его переписать в си в целях ускорения обработки.

Добавлено через 1 час 4 минуты
При занесении значений в файл мне позже снова придется делать еще парсинг чтобы сравнить значения с таблицей после чего все эти данные вынести в ексель. И если учесть что файлов может быть более 30 такого обьема то мне кажется что этот вариант не подходит.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru