2012-04-13 3 views
1

я регулярно иметь дело с файлами, которые выглядят следующим образом (для совместимости с R):Есть ли библиотека C++, которая читает именованные столбцы из файлов?

# comments 
# more comments 
col1 col2 col3 
1 a hi 
2 b there 
. . . 

Очень часто, я хочу читать col2 в вектор или другой контейнер. Нетрудно написать функцию, которая анализирует этот тип файла, но я был бы удивлен, если бы не было хорошо протестированной библиотеки, чтобы сделать это для меня. Существует ли такая библиотека? (Как я уже сказал, нетрудно сворачивать свои собственные, но поскольку я не эксперт на C++, для меня было бы проблемой использовать шаблоны, которые позволили бы мне использовать произвольный контейнер для хранения произвольных типов данных.)

EDIT: Я знаю имя столбца, которое я хочу, но не тот порядок, в котором будут находиться столбцы в этом конкретном файле. Столбцы разделены пробелом неизвестной суммы, который может быть вкладками или пробелами (вероятно, не оба). Первая запись в каждой строке может предшествовать пробелу или, возможно, не предшествует пробелу, иногда это изменяется в одном файле, например.

number letter 
8 g 
9 h 
10 i 
+0

Сохраните файл как CSV и используйте парсер CSV? – garbagecollector

+0

Насколько велики файлы? Хотя это не особенно сложно, редко можно найти решение, которое не является абсурдно медленным. –

+0

Чаще всего 100-1000 линий. Самые крупные из них - ~ 10 миллионов линий. Я не столько занимаюсь разработкой, сколько циклом разработки. – flies

ответ

2

Boost split может делать то, что вы хотите, обеспечивая постоянное разделение на пробелы.

+0

Столбцы будут разделены пробелами (переменная длина, пробелы и/или вкладки). Разделение не слишком сложно - http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c – flies

+0

Это также жизнеспособный вариант. Прокрутите каждую строку и «разделите» на пробел, затем поместите полученный список в массив 2d. Затем вы можете запустить массив 2d, выбрав нужный элемент из соответствующего столбца. –

2

Я не знаю ни одной библиотеки C++, которая сделает это. Однако простым решением было бы использовать linux cut. Вы должны удалить комментарии первым, который легко сделать с СЕПГ:

sed -e '/^#/d' <your_file> 

Тогда можно применить следующую команду, которая будет выбирать только текст из третьей колонки:

cut -d' ' -f3 <your_file> 

Вы могли бы объединить их вместе с трубой, чтобы сделать его одной командой:

sed -e '/^#/d' <your_file> | cut -d' ' -f3 <your_file> 

Вы можете запустить эту команду программно, то достаточно просто добавить каждую строку в СТЛ контейнер.

// pseudocode 
while(file.hasNextLine()) 
{ 
    container << file.readNextLine(); 
} 

О том, как на самом деле запустить cut из кода, см this answer.

+0

кажется, d сначала нужно проанализировать файл, чтобы удалить комментарии, а заголовок объявляет имена столбцов, а затем вырезает результат. – flies

+0

@flies Я обновил свой ответ на счет для комментариев –

+0

Есть ли способ, чтобы разделитель 'cut' был переменной длиной пробела, состоящей из вкладок и/или пробелов? будет ли он обрабатывать строки, начинающиеся с пробелов по-разному? 'perl -e 'while (<>) {next if/^ # /; чавкать; print ((split) [1], "\ n"); } '' даст мне второй столбец в файле, исключая комментарии, но я не вижу преимущества любого из них в чтении и расщеплении внутри C++. – flies

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