Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Тамика
Котовчанин
919 / 463 / 195
Регистрация: 16.02.2010
Сообщений: 3,267
Записей в блоге: 32
1

Корректное считывание csv

02.02.2015, 15:24. Просмотров 2389. Ответов 26
Метки нет (Все метки)

Добрый день, форумчане!
Недавно обращалась с просьбой помочь прочитать xlsx-файл. Но немного покурив, нашла, что можно это всё дело организовать через csv. Те, кто мне подсказал в той теме, не думайте - я очень благодарна, но стараюсь искать новые пути.
Нашла на одном форуме такой кодец(да, признаюсь, код не мой). И судя по брызжанию слюны из рта автора поста, код "мамой клянусь, работает"!
Но у меня он не заработал...
Может кто подскажет нубику, как корректно считывать этот тип?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream> 
#include <fstream>
#include <deque>
 
int main() 
{
    std::ifstream fin; 
    fin.open("test.csv");
    char ap[100];
    std::deque<int> d_Number;
 
    while(!fin.eof())
    {
        fin.getline(ap, _countof(ap));
 
        d_Number.push_back(atol(ap));
    }
 
    for (int i = 0; i < d_Number.size(); ++i)
        std::cout << d_Number.at(i) << " ";
    system("pause>>null");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2015, 15:24
Ответы с готовыми решениями:

Заменить считывание с клавиатуры на считывание из файла
Помогите пожалуйста, ни разу не работал со считыванием из файла поэтому не...

Требуется корректное объяснение
Добрый вечер форумчане) Хочу что бы мне на общедоступном и понятном языке...

Корректное разделение строки
Здравствуйте, требуется корректно разделить строку для дальнейшей с ней работы,...

Корректное удаление вектора векторов
Привет. Есть вектор векторов std::vector&lt;std::vector&lt;wchar_t&gt;&gt; data; Как...

Корректное высвобождение памяти в list
У меня все нормально работает, ну и по логике тоже вроде нормально, но...

26
Phoenix_Max
101 / 43 / 18
Регистрация: 08.01.2015
Сообщений: 97
02.02.2015, 15:30 2
csv разные бывают.
0
Тамика
Котовчанин
919 / 463 / 195
Регистрация: 16.02.2010
Сообщений: 3,267
Записей в блоге: 32
02.02.2015, 15:32  [ТС] 3
Phoenix_Max, сохраняла как CSV(MS-DOS).
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
02.02.2015, 15:32 4
Тамика, Содержимое csv файла в студию. П.С: код адок.
0
Тамика
Котовчанин
919 / 463 / 195
Регистрация: 16.02.2010
Сообщений: 3,267
Записей в блоге: 32
02.02.2015, 15:35  [ТС] 5
Цитата Сообщение от ForEveR Посмотреть сообщение
П.С: код адок.
Передам творцу.

Цитата Сообщение от ForEveR Посмотреть сообщение
Содержимое csv файла в студию.
1;11
2;21
3;31
0
0x10
2571 / 1751 / 288
Регистрация: 24.11.2012
Сообщений: 4,379
02.02.2015, 15:36 6
"Код должен работать, но не работает" - заменить на "Что ожидается" и "Что наблюдается по факту".

Я по этой смеси сей и плюсов вижу, что автор от каждой строчки пытается откусить число. К парсингу csv код отношения не имеет.
0
Тамика
Котовчанин
919 / 463 / 195
Регистрация: 16.02.2010
Сообщений: 3,267
Записей в блоге: 32
02.02.2015, 15:39  [ТС] 7
0x10,
А можете посоветовать ресурсик, где была бы раскрыта сия тема?
0
_Ivana
3233 / 1861 / 234
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
02.02.2015, 15:41 8
Если стоит задача построчного чтения текстового файла определенного формата с дальнейшим разбором строки по разделителям (они могут быть назначены разные), то имхо это один из тех 90% случаев когда проще написать свой код чем разбираться в чужом и получать возможные ошибки.
0
Тамика
Котовчанин
919 / 463 / 195
Регистрация: 16.02.2010
Сообщений: 3,267
Записей в блоге: 32
02.02.2015, 15:45  [ТС] 9
_Ivana, у меня задача из здорового экселевского файла сделать много xml файлов. Но чёрт дери, я же, прости Тесла, программист!
Захотела заавтоматизировать это дело. Начала вот с простого считывания файла.
Считать нужно с каждой колонки строку. Отдельно.
0
0x10
2571 / 1751 / 288
Регистрация: 24.11.2012
Сообщений: 4,379
02.02.2015, 15:47 10
Цитата Сообщение от Тамика Посмотреть сообщение
А можете посоветовать ресурсик, где была бы раскрыта сия тема?
Если на входе совсем наивный формат вроде примера из поста 5, то никаких ресурсов для такой задачи не нужно. Читаем файл построчно, разбиваем строки по разделителю, парсим каждый получившийся токен.

Если стоит задача реализовать свой csv-парсер, то лучше вкурить RFC 4180.

Если задача чисто прикладная, где нужно распарсить csv файл и что-нибудь посчитать, то в гугле достаточно библиотек:
Вот некоторые:
http://sourceforge.net/projects/libcsv/
https://code.google.com/p/fast-cpp-csv-parser/
http://code.google.com/p/csv-parser-cplusplus/
http://www.codeproject.com/Articles/...ic-CSV-Streams

Ну и если это самостоятельная утилита, то для решения таких задач чаще используют скриптовые языки.
2
zss
Модератор
Эксперт С++
7239 / 6693 / 4235
Регистрация: 18.12.2011
Сообщений: 17,659
Завершенные тесты: 1
02.02.2015, 15:53 11
Что-то, мне кажется, тут из мухи слона делают.
Поскольку у Вас всего 2 столбца в csv файле,
то и читайте в 2 массива.
C++
1
2
3
4
5
6
7
8
9
10
int x[10000],y[10000];
int i=0;
ifstream file("file.csv");
while(i<10000)
{
    file>>x[i]>>y[i];
    if(file.eof())
             break;
    i++;
}
1
Тамика
Котовчанин
919 / 463 / 195
Регистрация: 16.02.2010
Сообщений: 3,267
Записей в блоге: 32
02.02.2015, 15:56  [ТС] 12
zss, спасибо, но опять фигня какая-то.
Выводит бесконечную последовательность "мусора"... Что может быть не так?
0
_Ivana
3233 / 1861 / 234
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
02.02.2015, 15:57 13
Тамика, у меня смутные подозрения, что если бы вы описали свою задачу не в разделе С++ а в разделе Вижуал Бэйсика, то вам бы порекомендовали написать макрос в самом Экселе безо всякой выгрузки в промежуточные форматы Там бы и бежали сразу по одной колонке по всем строкам.... Это к тому, что задачу можно решать самыми различными методами.
1
Тамика
Котовчанин
919 / 463 / 195
Регистрация: 16.02.2010
Сообщений: 3,267
Записей в блоге: 32
02.02.2015, 16:03  [ТС] 14
_Ivana, может... Но весь отдел ждёт, что я напишу эту програмину, которая многим облегчит жизнь. А писать её надо на плюсах.

Добавлено через 3 минуты
Хм... Что-то не так с файлом, видимо. Отладка показала, что "Error reading characters of string"...
После открытия дескриптора.
0
0x10
2571 / 1751 / 288
Регистрация: 24.11.2012
Сообщений: 4,379
02.02.2015, 16:06 15
Цитата Сообщение от Тамика Посмотреть сообщение
Хм... Что-то не так с файлом, видимо. Отладка показала, что "Error reading characters of string"...
Если при попытке чтения, то код в посте 11 пытается считать разделитель в ячейку типа int.

Задача решается использованием готовых библиотек, ибо при написании наивного парсинга на коленке возможно столкнуться с необходимостью обработки полей в кавычках. В общем, не нужно тут велосипедить.
1
zss
Модератор
Эксперт С++
7239 / 6693 / 4235
Регистрация: 18.12.2011
Сообщений: 17,659
Завершенные тесты: 1
02.02.2015, 16:12 16
Прошу пардону,
не обратил внимания, что istream разделитель не пропускает.
Вот так работает как надо
C++
1
2
3
4
5
6
7
8
while(i<10000)
    {
        char c;
        file>>x[i]>>c>>y[i];
        if(file.eof())
             break;
        i++;
    }
1
Тамика
Котовчанин
919 / 463 / 195
Регистрация: 16.02.2010
Сообщений: 3,267
Записей в блоге: 32
02.02.2015, 16:13  [ТС] 17
0x10, вот как раз только что дошло это. Поправила заменой типа данных массивов.

С либами ещё попробую. Когда докурю.
0
Ilot
Эксперт С++
1831 / 1189 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
02.02.2015, 16:28 18
Тамика, писал на коленке, но по крайней мере у вас будет от чего отталкиваться:
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
#include <iostream>
#include <fstream>
#include <deque>
#include <string>
#include <cstdlib>
int main() {
    std::ifstream fin;
    fin.open("test.csv");
    std::string ap;
    std::deque<int> d_Number;
    long int li1, li2;
    char * pEnd;
    std::getline(fin, ap);
    do{
        li1 = strtol (ap.c_str(),&pEnd,10);
        li2 = strtol (pEnd + 1,&pEnd,10);
        d_Number.push_back(li1);
        d_Number.push_back(li2);
        std::getline(fin, ap);
    }while(!fin.eof());
 
    for (int i = 0; i < d_Number.size(); ++i)
        std::cout << d_Number.at(i) << " ";
    system("pause>>null");
}
1
Тамика
Котовчанин
919 / 463 / 195
Регистрация: 16.02.2010
Сообщений: 3,267
Записей в блоге: 32
02.02.2015, 17:32  [ТС] 19
Ничего не работает... Я не понимаю.
Сначала вариант zss работал(с заменой int на char).
Я еще немного поэкспериментировала - всё упало.
Вернулась к варианту zss - уже и он не работает! Ну чем это объяснить?!
0
0x10
2571 / 1751 / 288
Регистрация: 24.11.2012
Сообщений: 4,379
02.02.2015, 18:26 20
Цитата Сообщение от Тамика Посмотреть сообщение
Ничего не работает...
Еще раз повторю, что "Не работает" — это не техническое описание проблемы.
Есть ожидаемое поведение, есть фактическое. И то и другое выражается во входных данных, выходных и состоянии программы на каждом шаге. Лезем в отладчик и смотрим на в какой момент фактическое не соответствует ожидаемому.
0
02.02.2015, 18:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2015, 18:26

Корректное написание логических операций
Скоро экзамен по информатике, созрел вопрос - как корректнее писать логическое...

Не слишком корректное сохранение в HEX
Здравстуйте! Есть проблема. for(pos = 32; pos &gt; -1; pos--) { inp = ' ';...

Корректное удаление двумерного динамического массива
Доброго времени суток. В программе имеется двумерный динамический массив....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru