Вы должны гордиться, когда используете что-то настолько прекрасное, как boost::spirit
. Здесь моя попытка парсера (почти), соответствующая спецификациям CSV по этой ссылке спецификациям CSV (Мне не нужны разрывы строк в полях, а также пробелы в запятых).
После того, как вы преодолеете шокирующий опыт ожидания 10 секунд для компиляции этого кода :), вы можете сидеть сложа руки и
// csvparser.cpp
#include
#include
#include
#include
namespace qi = boost::spirit::qi;
namespace bascii = boost::spirit::ascii;
template
struct csv_parser : qi::grammar(),
bascii::space_type>
{
qi::rule COMMA;
qi::rule DDQUOTE;
qi::rule non_escaped;
qi::rule escaped;
qi::rule field;
qi::rule(), bascii::space_type > start;
csv_parser() : csv_parser::base_type(start)
{
using namespace qi;
using qi::lit;
using qi::lexeme;
using bascii::char_;
start = field % ',';
field = escaped | non_escaped;
escaped = lexeme['"' >> *( char_ -(char_('"') | ',') | COMMA | DDQUOTE) >> '"'];
non_escaped = lexeme[ *( char_ -(char_('"') | ',') ) ];
DDQUOTE = lit("\"\"") [_val = '"'];
COMMA = lit(",") [_val = ','];
}
};
int main()
{
std::cout << "Enter CSV lines [empty] to quit\n";
using bascii::space;
typedef std::string::const_iterator iterator_type;
typedef csv_parser csv_parser;
csv_parser grammar;
std::string str;
int fid;
while (getline(std::cin, str))
{
fid = 0;
if (str.empty())
break;
std::vector csv;
std::string::const_iterator it_beg = str.begin();
std::string::const_iterator it_end = str.end();
bool r = phrase_parse(it_beg, it_end, grammar, space, csv);
if (r && it_beg == it_end)
{
std::cout << "Parsing succeeded\n";
for (auto& field: csv)
{
std::cout << "field " << ++fid << ": " << field << std::endl;
}
}
else
{
std::cout << "Parsing failed\n";
}
}
return 0;
}
Компиляция:
make csvparser
Тест (пример украден из Wikipedia ):
./csvparser
Enter CSV lines [empty] to quit
1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00
Parsing succeeded
field 1: 1999
field 2: Chevy
field 3: Venture "Extended Edition, Very Large"
field 4:
field 5: 5000.00
1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00"
Parsing failed
Цветовая карта будет автоматически установлена на значения ваших данных. Ваши данные находятся в диапазоне [0 2], поэтому они установлены на это. Чтобы сделать то, что вы хотите, вам нужно насытить вашу цветовую карту, это будет означать, что она будет отображаться с белого на черный в [0 1], но это будет просто черный в [1 2]. В общем, это плохая наука, вы вводите читателя в заблуждение относительно реальной стоимости поверхности / изображения.
Однако, если у вас есть подлинная причина сделать это, то команда будет caxis([0 1])