260 / 216 / 94
Регистрация: 07.04.2011
Сообщений: 1,334
1

Чтение из файла с разделителями

16.12.2014, 16:22. Показов 15781. Ответов 11
Метки нет (Все метки)

Всем доброго времени суток.
Вопрос по чтению из CSV файла с разделителями
Структура файла следующая:
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
Каждой строке файла соответствует определенный столбец книги Excel
То есть первая строка в файле - это первый столбец экселя,вторая в файле - второй столбец экселя.
Чтение идет из Экселя по столбцам,а запись в файл столбца производится в строку.
Сохраняю в CSV файл.
Чтение из файла с разделителем
C++
1
2
3
4
5
while (!File.eof())
{
    File.getline(buff,255,';');
    cout << buff << " ";
}
Необходимо считать данные из файла в двумерный массив.Инициализирую и выделяю память

C++
1
2
3
4
5
char **FileArrData = new char *[2];
 for (i = 0; i < FileStrCount; i++)
 {
     FileArrData[i] = new char [20];
 }
Вопрос:Как определить конец строки в файле,при чтении с разделителями,чтобы каждой строке файла соответствовала своя строка в массиве?
Строка 1 в массиве:
1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20
После 20 определить конец строки,увеличить индекс строки и читать далее.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2014, 16:22
Ответы с готовыми решениями:

Чтение из файла с разделителями в массив
Здравствуйте , возникла проблема с чтением из файла. После прочтения в массиве оказываются не те...

Чтение данных из произвольного файла с разделителями
Помогите пожалуйста. Нужно написать программу консольного типа, реализующую: 1. Чтение файла 2....

Ввод из файла с разделителями
Проблема следующая: как ввести из файла произвольное количество целых чисел, между которыми не...

Заполнение двумерного статического массива данными из файла с разделителями
В файле text.txt есть строка 0:Ilya:20:Manager, как можно эту строку записать в двумерный...

11
7275 / 6220 / 2833
Регистрация: 14.04.2014
Сообщений: 26,871
16.12.2014, 16:26 2
Ну если у тебя по 20 чисел в строке, то просто считай сколько раз getline() вызван.
1
39 / 39 / 20
Регистрация: 23.04.2012
Сообщений: 462
Записей в блоге: 2
16.12.2014, 16:30 3
Лучший ответ Сообщение было отмечено OverDozero как решение

Решение

Функция StrTok

C++
1
2
3
....char razdelitel[]=" ,./;:"; //разделители слов
..... char *P=0; //Указатель для функции strtok
..... P=strtok(S,razdelitel); //Разбиваем исходную строку на слова
1
260 / 216 / 94
Регистрация: 07.04.2011
Сообщений: 1,334
16.12.2014, 16:31  [ТС] 4
Необязательно 20.Может быть и 100,и 5,и 10000.Неизвестно какой будет файл с данными.
0
7275 / 6220 / 2833
Регистрация: 14.04.2014
Сообщений: 26,871
16.12.2014, 16:35 5
Тогда сначала считываешь строку, затем делишь на элементы. Сначала
C++
1
File.getline(buff, 255);
Затем, как предложили выше, используешь strtok() как вариант. Или берёшь istringstream, туда строку помещаешь и читаешь через getline() c разделителем ';' до конца.
1
260 / 216 / 94
Регистрация: 07.04.2011
Сообщений: 1,334
16.12.2014, 16:40  [ТС] 6
Цитата Сообщение от nmcf Посмотреть сообщение
Ну если у тебя по 20 чисел в строке, то просто считай сколько раз getline() вызван.
Вариант подходит,тем более есть переменная,содержащая количество строк в Экселе.Но считать 10 000 раз эту переменную..
Попробую strtok
Спасибо!
0
1456 / 793 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
16.12.2014, 17:54 7
Как вариант:
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
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <utility>
#include <functional>
#include <string>
#include <algorithm>
#include <cctype>
#include <sstream>
 
int main()
{
   std::ifstream ifs("file.txt");
   if (ifs.is_open()) {
      std::vector<std::vector<int>> matr;
      std::string line;
      while (std::getline(ifs, line))
      {
         std::replace_if(line.begin(), line.end(), std::not1(std::ref(isdigit)), ' ');
         std::istringstream iss{line};
         std::vector<int> curr_row{std::istream_iterator<int>(iss),
                                   std::istream_iterator<int>()};
         matr.emplace_back(std::move(curr_row));
      }
 
      for (auto const& vec : matr) {
         for (int i : vec) std::cout << i << " ";
         std::cout << "\n";
      }
   }
 
   system("pause");
   return 0;
}
0
260 / 216 / 94
Регистрация: 07.04.2011
Сообщений: 1,334
16.12.2014, 19:09  [ТС] 8
Решил проблему так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int j=0;
char Delimetrs[] = {";\n"};
char *buffdelim;
while (!TempFile.eof())//начало чтения файла
{
    TempFile.getline(buff,255);
    buffdelim = std::strtok(buff,Delimetrs);
     while(buffdelim) {
         j++;
         cout << "J:" <<j <<":";
        cout << buffdelim << endl;
       buffdelim  = strtok(NULL, Delimetrs);    
    }
     j=0;//сброс счетчика
Теперь проблема в том,что в книге Эксель могут содержаться пустые значения(пустые ячейки).
Допустим в первом столбце книги содержится 3 пустых ячейки.Сохраненный файл будет выглядеть так:
1;;;;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20
Отсутствие значений между разделителями это тоже значение!Пустая ячейка!
В данном коде,при делении строки,не учитывается пустое значение между разделителями.И как следствие,неправильно считается количество j.
Строка состоит из цифр,с 1 до 20.Значит j должно равняться 20.У меня получается j = 17.
Как учесть данный момент,что пустая строка = это тоже значение?И при ее чтении увеличивать j
0
7275 / 6220 / 2833
Регистрация: 14.04.2014
Сообщений: 26,871
16.12.2014, 19:34 9
Тогда istringstream и getline() c ';' вместо strtok().
0
260 / 216 / 94
Регистрация: 07.04.2011
Сообщений: 1,334
17.12.2014, 13:56  [ТС] 10
Решил сделать так,если кому-то интересно:
Чтение данных из ячейки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
wchar_t *get_cell_str( Excel::_WorksheetPtr Sheet, int Row, int Col )
{
    Excel::RangePtr Cell;
    int len;
    Cell = Sheet->Cells->Item[Row][Col];
        if ( *Cell->Text.bstrVal )
    {
        len = wcslen(Cell->Text.bstrVal) + 1;
            wchar_t *res = (wchar_t *)malloc(sizeof(wchar_t) * len);
            wcscpy(res, Cell->Text.bstrVal);
        return res;
    } else
        if (! *Cell->Text.bstrVal )
    {
        len = wcslen(Cell->Text.bstrVal) + 1;
            wchar_t *res = (wchar_t *)malloc(sizeof(wchar_t) * len);
            wcscpy(res, L"&");
        return res;
    }
 
    return NULL;
}
Добавил
C++
1
2
3
4
5
6
7
if (! *Cell->Text.bstrVal )
            {
        len = wcslen(Cell->Text.bstrVal) + 1;
            wchar_t *res = (wchar_t *)malloc(sizeof(wchar_t) * len);
            wcscpy(res, L"&");
        return res;
    }
В итоге в файл,на пустую ячейку пишется "&".И проверяется в момент чтения.
Файл выглядит так:
&;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19 ;20
1;&;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;2 0
0
7275 / 6220 / 2833
Регистрация: 14.04.2014
Сообщений: 26,871
17.12.2014, 14:07 11
Почему не ноль? У тебя же числа.
0
260 / 216 / 94
Регистрация: 07.04.2011
Сообщений: 1,334
17.12.2014, 14:15  [ТС] 12
Могут быть и названия,и 0 быть может.А вот & отсутствовать будет всегда! Поэтому 0 писать в файл бессмысленно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2014, 14:15
Помогаю со студенческими работами здесь

Переделать в коде чтение из файла в чтение с клавиатуры
Переделайте что бы текст считывался с клавиатуры, а не с файла! Буду благодарен за помощь! //файл...

Чтение из файла. Повторное чтение файла
Добрый день. Необходимо реализовать в программе функцию повторного чтения данных из файла, в случае...

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла.
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt; #include &lt;cstdlib&gt;...

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении,...


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

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

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