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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
#1

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

26.11.2009, 18:56. Просмотров 898. Ответов 14
Метки нет (Все метки)

Доброго времени суток!

Не могли бы вы подсказать следующее...
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++
значит условие таково: с клавиатуры вводится ряд чисел, его нужно занести в матрицу 6х6, потом отсортировать матрицу и снова сделать из нее...

Функция, принимающая матрицу, возвращающая матрицу - C++
... double msin(int **mtrx) { double mm; for (int i = 0; i < 2; i++) for(int j=0; j<3;j++) mm=sin(mtrx); return...

Как умножить матрицу на матрицу - C++
Как умножить матрицу на матрицу в Visual Studio?

Как умножить матрицу на матрицу? - C++
Как умножить матрицу на матрицу? Напишите пожалуйста!

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
#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/
Даемоник
42 / 42 / 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
эволюционирую потихоньку
465 / 463 / 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
эволюционирую потихоньку
465 / 463 / 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
там придется колонками манипулировать, так что думаю вектор не самое лучшее решение. Но всеравно спасибо и за этот код, может что и возьму для себя полезное. А через массив есть задумки как сделать можно?
Том Ардер
Модератор
Эксперт по математике/физике
3736 / 2349 / 293
Регистрация: 15.06.2009
Сообщений: 4,202
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
Эксперт CЭксперт С++
9470 / 5483 / 927
Регистрация: 25.07.2009
Сообщений: 10,508
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     Текст с Екселя в Матрицу
Еще ссылки по теме:

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

Преобразовать исходный текст в текст с выровненными краями - C++
Дан текстовый файл in.txt, содержащий произвольный текст. Получить файл out.txt, содержащий исходный текст с выровненными краями....

Преобразование текст -> двоичный код -> текст - C++
// praci5.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; ...

Тема: Строки Найти в тексте для каждого слово букву, которая само чаще встречается. Текст вводится с клавиатуры. Оригинальный текст и результат должны - C++
Найти в тексте для каждого слово букву, которая само чаще встречается. Текст вводится с клавиатуры. Оригинальный текст и результат должны...


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

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

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