2017-02-12 2 views
1

У меня текстовый файл с некоторыми столбцамиКак читать данные из определенного столбца в текстовом файле

name,age,address,gender 

Я знаю, что я могу получить доступ к линии с getline();, но когда я получаю строку с данные, возвращаемые getline();, я хочу прочитать определенный столбец. Как мне это сделать ?

Я видел решение этой проблемы, но это было в Java, которую я пока не знаю, так что я решил разместить это на C++ ответить

+0

Добро пожаловать в stackoverflow.com. Пожалуйста, найдите время [страницы справки] (http://stackoverflow.com/help), особенно разделы с именем [«Какие темы можно задать здесь?»] (Http://stackoverflow.com/help/ по-теме) и [«Какие типы вопросов я должен избегать?»] (http://stackoverflow.com/help/dont-ask). Также, пожалуйста, [возьмите тур] (http://stackoverflow.com/tour) и [читайте о том, как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask). Наконец, узнайте, как создать [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). –

+2

Текстовые файлы не имеют столбцов. Текстовые файлы имеют строки. Вам придется «декодировать» «столбцы» самостоятельно. –

ответ

1

Будь то вы спрашиваете на Java или C++, подход будет аналогичным.

После того, как вы прочли всю строку. Разделите линию на разделитель.

В Java, это просто

line.split(","); 

В C++, вы могли бы использовать, чтобы получить str.find(",") положение запятой. Затем подстройте выделенные жетоны.

Задайте переменную count для подсчета количества токенов, которые вы разделили до сих пор, чтобы добраться до нужной колонки.

1

Подход тот же: прочитать файл построчно и tokenize, беря второй элемент массива, если я хочу увидеть второй столбец. Его можно улучшить, потому что он делает много копий, но идея здесь.

#include <sstream> 
#include <string> 
#include <boost/algorithm/string.hpp> 

std::string line; 
vector<string> strs; 
std::ifstream infile("thefile.txt"); 
while (std::getline(infile, line)) 
{ 
    strs.clear(); 
    boost::split(strs,line,boost::is_any_of("\t")); 
    cout<<"age ="<<strs[1]<<endl; 
} 
+0

Это очень неэффективно. –

+0

Да, это может быть улучшено, но это показывает, как все работает как первый разрез. – Gabriel

+1

Вы должны хотя бы предупредить о чрезмерных распределениях и копиях. –

0

Вы также можете разобрать строку C (если вы используете строки STL, скопируйте строку C в массив символов!), Используя strtok. Он будет работать очень хорошо, хотя необходимость в отдельной копии связана с тем, что strtok действительно модифицирует строку, а также некоторую статическую память (или, возможно, локальное хранилище на потоке, я бы не полагался на нее)

Смежные вопросы