Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++ Builder] импорт txt в таблицу


Автор: SAnatoliy 17.3.2009, 17:34
 Помогите пожалуйста. С++ Builder 5.
 
  Нужно разобрать текстовый файл и перенести все содержимое в таблицу для дальнейшей обработки.

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

   Есть текстовый файл данной структуры: 
   !а123456 0987654 б123456 1234567 01-01-09 00:00:00 10 20 
   !а123456 0987654 б123456 1234567 01-01-09 00:00:00 10 20 
   и т.д. 


Как я понимаю мне надо написать цикл:
  Считываем колличество строк в файле и запускаем цикл -> берем одну строку и присваем значения столбцов переменным -> пишем в БД -> и так до последней строки текстового файла.

 
Может есть решение лучше. Но я незнаю. Помогите пожалуйста примером.

Автор: Rififi 17.3.2009, 18:53
SAnatoliy, 

Как я понимаю мне надо написать цикл:
  Считываем колличество строк в файле и запускаем цикл -> берем одну строку и присваем значения столбцов переменным -> пишем в БД -> и так до последней строки текстового файла.


это подойдёт, если тебе для чего-то  нужно знать общее количество строк в файле.
иначе крути цикл пока не конец файла и по-очереди доставай строки

Автор: SAnatoliy 17.3.2009, 19:23
Цитата(Rififi @ 17.3.2009,  18:53)

иначе крути цикл пока не конец файла и по-очереди доставай строки


 Согласен с Вами. 

 А может кто нибудь показать на примере как писать сие надо  smile 

Автор: Rififi 17.3.2009, 20:50
SAnatoliy, 
Код
std::ifstream ifs("data.txt");
if (!ifs.good()) error();
while (!ifs.eof())
{
    std::string s;
    std::getline(ifs, s);
    // Разбираем полученную строку, достаём параметры, запихиваем в БД...
}

Автор: SAnatoliy 17.3.2009, 21:28
Цитата(Rififi @ 17.3.2009,  20:50)
SAnatoliy, 
Код
std::ifstream ifs("data.txt");
if (!ifs.good()) error();
while (!ifs.eof())
{
    std::string s;
    std::getline(ifs, s);
    // Разбираем полученную строку, достаём параметры, запихиваем в БД...
}

Прошу прощение конечно(. 

Но можно подробней как: Разбираем полученную строку, достаём параметры,

Автор: dumb 17.3.2009, 21:39
http://forum.vingrad.ru/index.php?showtopic=152634&view=findpost&p=1144166

ps. если этого будет недостаточно для самостоятельного решения, то тема уедет в "Центр помощи".

Автор: Rififi 17.3.2009, 21:40
SAnatoliy, 
например, с помощью std::stringstream или sscanf. Юзай поиск по форуму и/или гоогле

Автор: mrbrooks 18.3.2009, 08:50
Тут решений воз и целая тележка. Я бы работал со списками.

Автор: dumb 18.3.2009, 09:08
Модератор: Тема перенесена!

Автор: SAnatoliy 18.3.2009, 10:04
Может кто нибудь набросать работающий пример. Пожалуйста.

Автор: zim22 18.3.2009, 11:11
Цитата(SAnatoliy @  17.3.2009,  17:34 Найти цитируемый пост)
 пишем в БД ->

разве в БД нет импорта с текстовых файлов?
если есть - просто преобразуй твой текстовый файл к необходимому формату. например csv

Автор: SAnatoliy 18.3.2009, 11:23
Цитата(zim22 @ 18.3.2009,  11:11)
Цитата(SAnatoliy @  17.3.2009,  17:34 Найти цитируемый пост)
 пишем в БД ->

разве в БД нет импорта с текстовых файлов?
если есть - просто преобразуй твой текстовый файл к необходимому формату. например csv

есть, но мне надо у себя и просто в таблицу, а в БД это уже пожже..

Код

std::ifstream ifs("data.txt");
if (!ifs.good()) error();
while (!ifs.eof())
{
    std::string s;
    std::getline(ifs, s);

      кто набросает код.
      пример. как разобрать строку?      
      пример.  как переменным а1 и а2 присвоить значение столбцов?  

}


Автор: zim22 18.3.2009, 11:41
Код

#include <iostream>
#include <fstream>

using namespace std;

std::ifstream ifs("data.txt");
if (!ifs.good()) error();
while (!ifs.eof())
{
    std::string s;
    std::getline(ifs, s);

      std::string a1, a2;
      istringstream is(s);
      while(is >> a1 >> a2)
      {std::cout << a1 << "\t" << a2 << std::endl; }

}

Автор: SAnatoliy 18.3.2009, 13:39
а можно комментарии к коду?

Код

#include <iostream>
#include <fstream>

using namespace std;

std::ifstream ifs("data.txt");
if (!ifs.good()) error();
while (!ifs.eof())
{
    std::string s;
    std::getline(ifs, s);

      std::string a1, a2;
      istringstream is(s);
      while(is >> a1 >> a2)
      {std::cout << a1 << "\t" << a2 << std::endl; }

}


Автор: zim22 18.3.2009, 13:56
Код
include <iostream> // нужен для cout
#include <fstream> // нужен для ifstream 

using namespace std; // используем пространство имён std (чтобы не писать std:: )

std::ifstream ifs("data.txt"); // свзяли поток ifs c файлом data.txt
if (!ifs.good()) error(); // проверили, успешно ли открылся файл
while (!ifs.eof()) // пока до конца файла не дошли, выполняем тело цикла
{
    std::string s; // создали объект типа string
    std::getline(ifs, s); // "проглотили" одну строку из data.txt в s

      std::string a1, a2;
      istringstream is(s); // создали объект типа istringstream. связали его со строкой s. 
      while(is >> a1 >> a2)  // считываем два слова
      {std::cout << a1 << "\t" << a2 << std::endl; } // выводим два слова

}


Автор: Anikmar 18.3.2009, 14:28
 smile 
zim22, а в стихах комментарии слабо?  smile 

Автор: SAnatoliy 18.3.2009, 15:01
Цитата(zim22 @ 18.3.2009,  13:56)
Код
include <iostream> // нужен для cout
#include <fstream> // нужен для ifstream 

using namespace std; // используем пространство имён std (чтобы не писать std:: )

std::ifstream ifs("data.txt"); // свзяли поток ifs c файлом data.txt
if (!ifs.good()) error(); // проверили, успешно ли открылся файл
while (!ifs.eof()) // пока до конца файла не дошли, выполняем тело цикла
{
    std::string s; // создали объект типа string
    std::getline(ifs, s); // "проглотили" одну строку из data.txt в s

      std::string a1, a2;
      istringstream is(s); // создали объект типа istringstream. связали его со строкой s. 
      while(is >> a1 >> a2)  // считываем два слова
      {std::cout << a1 << "\t" << a2 << std::endl; } // выводим два слова

}


нда, вопросы всеж остались.

не пойму где указывается в коде разделитель, по какому признаку мы разделяем столбцы (мне нужен пробел, но формат может поменятся на ";" как мне это указать?) ?


Последняя строка "Выводим два слова" имеется ввиду присвоили данным переменным значение первых двух столбцов?


P.S.
zim22
Спасибо за развернутые комментарии, неожидал что так +

Автор: zim22 18.3.2009, 15:41
Anikmar,  smile 
Код
#include <iostream>            // Подинклудим мы истрим, чтобы улыбнулся мим
#include <fstream>             // Не забудем про собрата. В самый раз! Не маловато!

using namespace std;           // Важным росчерком руки подключИм мы чудо КИ.
std::ifstream ifs("data.txt"); // Файл откроем для смотренья! 

if (!ifs.good()) error();      // Нет ошибок? Загляденье!
while (!ifs.eof())             // Важный цикл мы запускаем, и с надеждой наблюдаем за концом мы бития.
{
    std::string s;             // Вдруг, как чёрт из табакерки, строчка выпрыгнула нагло.
    std::getline(ifs, s);      // - Я важней всех и всего на свете!, - громко молвила она.
                               // - Докажи-ка, скушай строчку, не убудет ведь с тебя.

    std::string a1, a2;        // - Я не дура, в одиночку, совершать столь низкие дела.
                               // - Лучше позову я строчки: строчку Раз и строчку Два
                               // - Пусть они гнут шеи, я же буду наблюдать изподтишка.

    istringstream is(s);       // Сотрясаясь и шатаясь, важный ИС пришёл с далёких стран
    while(is >> a1 >> a2)      // Знает он язык заморский, что поможет нам достичь,
                               // Тех высот недосягаемых, без которых не прожить.

    {std::cout << a1 << "\t"   // Раз махнул, два махнул... Чудеса!
    << a2 << std::endl; }      // строчка Раз и строчка Два разделились в два конца %)

}


Автор: Anikmar 18.3.2009, 16:36
zim22, О!!! Это пять!!!!!! Супер  smile 
Заслуженный +1!

Автор: zim22 18.3.2009, 17:29
Anikmar,  smile 

Автор: SAnatoliy 20.3.2009, 11:29
вопрос решен с другом топике:
http://forum.vingrad.ru/forum/topic-251788/kw-%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80-%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0-%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D1%87%D0%BD%D0%BE.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)