Форум программистов, компьютерный форум CyberForum.ru

Текст с Екселя в Матрицу - C++

Войти
Регистрация
Восстановить пароль
 
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
26.11.2009, 18:56     Текст с Екселя в Матрицу #1
Доброго времени суток!

Не могли бы вы подсказать следующее...
1. нужно открыть файл для чтения (Excel файл сохраненный в формате "csv с разделителями").
C++
1
2
FILE *file
fopen("file.csv","r");
2. Текст в файле такого вида:
первое;второе;третье
четвертое;пятое;шестое
Нужно это дело (слова до разделителя) забить в двумерный массив. Как быть с концами и началами строк я не знаю, может временные ; в начале и в конце добавить?
тойсь примерный вид должен быть похож на что-то такое(присвоение):
C++
1
2
3
array[1,1]="первое"    array[1,2]="второе"     array[1,3]="третье"
 array[2,1]="четвертое" .....
// нумерация кажется с ноля должна быть :) стыдно, пойду книги листать
3. От разделителя до разделителя слова в массивах, дальше по поиску уже сам перестановку напишу, лет 7 назад на Паскале писал, знания еще не восстановились даже на таком простом



помогите хоть кусочками кода, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2009, 18:56     Текст с Екселя в Матрицу
Посмотрите здесь:

Как умножить матрицу на матрицу C++
Как умножить матрицу на матрицу? C++
C++ Преобразование текст -> двоичный код -> текст
C++ Отсортировать матрицу и снова сделать из нее начальную матрицу
C++ Текст записывается в квадратную матрицу, а затем прочитывается по спирали, начиная с центра
Получить матрицу из чисел, заполняющих матрицу по линиям, параллельным главной диагонали C++
Тема: Строки Найти в тексте для каждого слово букву, которая само чаще встречается. Текст вводится с клавиатуры. Оригинальный текст и результат должны C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
26.11.2009, 19:05     Текст с Екселя в Матрицу #2
Копайте в сторону функции
C
1
char * strtok ( char * str, const char * delimiters );
http://www.cplusplus.com/reference/c...string/strtok/
Даемоник
 Аватар для Даемоник
41 / 41 / 3
Регистрация: 22.05.2009
Сообщений: 97
26.11.2009, 19:09     Текст с Екселя в Матрицу #3
Можно попробовать что-то типа:
Кусочек..
C++
1
2
3
4
5
6
7
8
9
10
11
12
const int size=15;
int i=0;
int j=0;
FILE fp;
char array[size][size];
while((array[i][j]=getc(fp))!=EOF)
{
   if(array[i][j]==";")
      j++;
   if(array[i][j]=="\n")
      i++;
}
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
26.11.2009, 19:12  [ТС]     Текст с Екселя в Матрицу #4
хм, идея понятна, а вот оно будет ли считывать между ; и двигать дальше?
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
26.11.2009, 19:34     Текст с Екселя в Матрицу #5
Цитата Сообщение от miff Посмотреть сообщение
хм, идея понятна, а вот оно будет ли считывать между ; и двигать дальше?
вам для дела или по учёбе? просто на С++ проще гораздо организовать подобную парсировку.
или именно С интересует?
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
26.11.2009, 20:16  [ТС]     Текст с Екселя в Матрицу #6
вообще для работы, отчет нужно "укоротить", вообще интересует именно на с++
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
26.11.2009, 20:37     Текст с Екселя в Матрицу #7
что такое vector знаете?
или именно вывод в массив нужен в виде arr[][]; ?

Добавлено через 10 минут
вот на скорую
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
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
 
using namespace std;
 
vector<string> Parseline(string & str)
{
    vector<string> line;
    string buf;
    int index;
    while ((index=str.find_first_of(";"))!=string::npos)
    {
        buf=str.substr(0,index);
        line.push_back(buf);
        str=str.substr(index+1);
    } // end while
 
    if (!str.empty()) line.push_back(str);
    return line;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    char *File="file.csv";
    string str;
    vector<vector<string> > text;
    
 
    ifstream f(File);
    if (!(f.is_open()))  // проверка наличия файла с тестом
    { cout<<"ERROR: not file "<<File; system("pause"); exit(1); }
    
    while(!f.eof()) // чтении из файла
    {   
        getline(f, str);
        text.push_back(Parseline(str));
    }   
 
    f.close();
    int numb=0;
    for (vector<vector<string> >::iterator itLine=text.begin(); itLine!=text.end(); itLine++)
    {   cout<<"\nstring "<<++numb<<": ";
        for (vector<string>::iterator it=(*itLine).begin(); it!=(*itLine).end(); it++)
            cout<<" "<<(*it);
    }
 
    cout<<endl; system("PAUSE");
    return 0;
}
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
26.11.2009, 22:56  [ТС]     Текст с Екселя в Матрицу #8
там придется колонками манипулировать, так что думаю вектор не самое лучшее решение. Но всеравно спасибо и за этот код, может что и возьму для себя полезное. А через массив есть задумки как сделать можно?
Том Ардер
Модератор
 Аватар для Том Ардер
3645 / 2264 / 276
Регистрация: 15.06.2009
Сообщений: 3,978
27.11.2009, 03:01     Текст с Екселя в Матрицу #9
Вот пример разборки файла по словам

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
#include <windows.h>
 
#include <iostream>
#include <fstream>
#include <strstream>
using namespace std;
 
char* Rus(const char* text);
 
char bufRus[256];
char* Rus(const char* text)
{
   CharToOem(text, bufRus);
   return bufRus;
}
 
int main()
{
    const int   WORDS = 10;             // слов в строке, не более
    const int   SIZE = 20;              // максимальная длина одного слова
    char        words[WORDS][SIZE];     // все слова из одной строки
    ifstream    ifExcel( "file.csv" );
 
    if( !ifExcel.fail() )
    {
        const int   nBufSize = 256;     // максимальная длина строки в файле
        char        Buffer[nBufSize];   // содержимое строки
 
        while( !ifExcel.eof() )
        {
            ifExcel.getline( Buffer, nBufSize );
 
            istrstream  text( Buffer );
            int         w = 0;
 
            while( !text.eof() )
            {
                text.get( words[w], SIZE, ';' );    // читать текущее слово (до разделителя)
                text.get();                         // пропустить разделитель
 
                cout << Rus( words[w] ) << " ";
 
                // здесь формировать массив слов, что-то вроде
                // array[current_row][w] = words[w];
        
                w++;
            }
            cout << endl;
        }
    }
    
    system("pause");
    
    return 0;
}
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
27.11.2009, 03:15  [ТС]     Текст с Екселя в Матрицу #10
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 <stdlib.h>
using namespace std;
int main()
{
     char str[]="pos1;pos2;pos3";
     char buff[7];
     string array[5];
     int size;
     int i;
     int j;
     int f;
     j=1;
     f=0;
     size=strlen(str);
     for (i=0; i<size+1; i++) 
      { 
        if (str[i]!=';') 
           {
           buff[f]=str[i];
           f++;
           } //закрываем if
        if ((str[i]==';')||(str[i]=='\0'))
           {
           buff[f]='\0'; 
           array[j]=buff; 
           f=0;
           j++;
           }
                
        }//закрываем for
      for (i=1;i<j;i++) {cout<<array[i]<<" ";}
cin>>i;
     return 0;   
}
поэкспериментировал немножко, и на свет появился этот совсем не оптимизированый код, который с головы до пят загружен тормознутыми if'ами, сильно-жрущей ресурсы переборкой всего по одному символу... и кучей, не совсем верно созданных, переменных. Но зато логическое мышление где-то в недрах головы начало опять вылезать

уже завтра это дело перепишу под двумерный массив, и нужно будет прикрепить файлик для читания. Главное чтобы правильно всё по массивам стало



_______
Том Андер, спасибо за Ваш код. Он мне очень еще поможет
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
30.11.2009, 17:22  [ТС]     Текст с Екселя в Матрицу #11
подскажите как правильно читать по строчке файлик? или хороший доходчивый источник по этому пункту, пожалуйста, дайте ссылочку. Вообще интересно только "прочитать строку 1, прочитать строку 2....". Мой стиль написания программ понятен из поста выше, так что если кто своими словами поможет описать, то на "языке Богов" с первого раза могу не понять

спасибо заранее

Добавлено через 50 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <fstream>
#include <iostream>
 
using namespace std;
 
int main()
{
  int      n = 0;
  ifstream is( "test.txt" );
  string   sbuf;
 
  while (!is.eof()) {
    getline( is, sbuf, '\n' );
    n++;
    cout << n << ": '" << sbuf << "'" << endl;
  }
  cin>>n;
  return 0;
}
вот накопал интересный пример наглядного чтения по строкам, может кому будет полезен в будущем. Когда нашел там была ошибка когда в вечный цикл забрасывало, то поправил
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9384 / 5434 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
30.11.2009, 18:01     Текст с Екселя в Матрицу #12
miff, Хорошая привычка - проверять, открылся ли файл. Ну и за состоянием потока следить...
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
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
 
/* чтение файла по строкам */
 
int main(){
    std::ifstream fin("1.txt");
    if ( !fin.is_open() ){
        std::cerr << "Can't open file!" << std::endl;
        return 1;
    }
    
    std::string buf;
    size_t i = 0;
    bool is_bad;
    
    while ( getline(fin, buf) )
        std::cout << std::setw(3) << (++i) << ":\t" << buf << std::endl;
    
    if ( (is_bad = fin.bad()) == true )
        std::cerr << "Error while reading file!" << std::endl;
    
    fin.close();
    return ( is_bad ) ? 1 : 0;
}
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
30.11.2009, 20:31  [ТС]     Текст с Екселя в Матрицу #13
угу, это понятно....но вот вопрос, у меня ругань идет что string в char не может перейти из моего кода выше видно что своими силами (насколько я умею) перебираю посимвольно, а в Вашем примере не могу взять строку и разбить её на символы для внедрения в свой код, вот как бы тут лучше поступить?

Добавлено через 11 минут
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
#include <iostream>
#include <stdlib.h>
#include <fstream>
 
using namespace std;
int main()
{
     ifstream is( "test.txt" ); //читаем строку
     string   sbuf;   //временная строка
 
     char str[20];    // ?? строка файла моя прерыдущая 
     char buff[20];   //временный буфер где посимвольно пишутся символы до определенного знака
                      //после чего загоняются в array[i]
     string array[50]; //массив где хранятся готовые куски
     int size;        //взятие количества символов в строке
     int i;           // переменная для определенного символа
     int j;
     int f;
     j=1;
     f=0;
     
     while (!is.eof()) {    
     getline( is, sbuf, '\n' );
    // size=strlen(sbuf);
    // for (i=0; i<size+1; i++)
      //{
           cout<<" buffer:"<<i<< " - "<<sbuf[i]<<endl;
           cout<<" easy buffer: "<<sbuf<<endl;
        if (sbuf[i]!=';') 
           {
           buff[f]=sbuf[i];
           f++;
           } //закрываем if
        if ((sbuf[i]==';')||(sbuf[i]=='\0'))
           {
           buff[f]='\0'; 
           array[j]=buff; 
           f=0;
           j++;
           }
       //    } //закрываем For
      //     cout<<sbuf<<" :::Buffer ";
        }//закрываем while
      //for (i=1;i<j;i++) {cout<<array[i]<<" "<<'\n';}
      //cout<<array[3];
      //cout<<array[5];
cin>>i;
     return 0;   
}
содержание файла:
11;22;33;44
55;66;77;8
Результат работы программы:
buffer:217088 - H
easy buffer: 11;22;33;44
buffer:217088 - H
easy buffer: 55;66;77;8
buffer - это я старался взять обращение переменной sbuf по типу sbuf[i]
easy buffer - результат sbuf...как видно что строке там живеться хорошо...но как обращаться к символу этой строки?

Добавлено через 49 минут
вроде получилось решить
C++
1
strcpy(str,sbuf.c_str());
Добавлено через 1 час 24 минуты
вопрос можно?

кодировку русскую не держит, считывает из файла аероглифы
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
01.12.2009, 15:08  [ТС]     Текст с Екселя в Матрицу #14
если в файле встречаются " когда по символам перебираю, то как правильно присвоить пустоту чтобы пропускало? str[i]=' '; и str=[i]=''; документ или не сохраняют, или все слова отбрасывает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2009, 13:20     Текст с Екселя в Матрицу
Еще ссылки по теме:

Вывести матрицу B и из этой матрицы В вычесть единичную матрицу А C++
C++ Определить, удовлетворяет ли текст следующему свойству: Текст совпадает с каким то отрезком ряда 0123456789 (например: 2, 678, 89)
C++ Функция, принимающая матрицу, возвращающая матрицу
C++ Преобразовать исходный текст в текст с выровненными краями
C++ Считать текст из файла и записать его посимвольно в квадратную матрицу

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

Или воспользуйтесь поиском по форуму:
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
02.12.2009, 13:20  [ТС]     Текст с Екселя в Матрицу #15
тему можно закрыть, написал. Всем огромная благодарность за помощь
Yandex
Объявления
02.12.2009, 13:20     Текст с Екселя в Матрицу
Ответ Создать тему
Опции темы

Текущее время: 21:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru