diff --git a/src/gui/editorwidgets/qgsvaluemapconfigdlg.cpp b/src/gui/editorwidgets/qgsvaluemapconfigdlg.cpp index 8d6c1ae5b4b5..16ae2ce09221 100644 --- a/src/gui/editorwidgets/qgsvaluemapconfigdlg.cpp +++ b/src/gui/editorwidgets/qgsvaluemapconfigdlg.cpp @@ -387,7 +387,9 @@ void QgsValueMapConfigDlg::loadMapFromCSV( const QString &filePath ) } QTextStream s( &f ); - s.setAutoDetectUnicode( true ); +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + s.setCodec( "UTF-8" ); +#endif const thread_local QRegularExpression re( "(?:^\"|[;,]\")(\"\"|[\\w\\W]*?)(?=\"[;,]|\"$)|(?:^(?!\")|[;,](?!\"))([^;,]*?)(?=$|[;,])|(\\r\\n|\\n)" ); QList> map; @@ -402,11 +404,11 @@ void QgsValueMapConfigDlg::loadMapFromCSV( const QString &filePath ) ceils << match.capturedTexts().last().trimmed().replace( QLatin1String( "\"\"" ), QLatin1String( "\"" ) ); } - if ( ceils.size() != 2 ) + if ( ceils.size() == 0 ) continue; QString key = ceils[0]; - QString val = ceils[1]; + QString val = ceils.size() == 2 ? ceils[1] : QString( "" ); if ( key == QgsApplication::nullRepresentation() ) key = QgsValueMapFieldFormatter::NULL_VALUE; map.append( qMakePair( key, val ) ); diff --git a/tests/src/gui/testqgsvaluemapconfigdlg.cpp b/tests/src/gui/testqgsvaluemapconfigdlg.cpp index 38c4a7dd8357..f87a4c30f029 100644 --- a/tests/src/gui/testqgsvaluemapconfigdlg.cpp +++ b/tests/src/gui/testqgsvaluemapconfigdlg.cpp @@ -36,6 +36,8 @@ class TestQgsValueMapConfigDlg : public QObject void cleanup(); // will be called after every testfunction. void testLoadFromCSV(); + void testLoadFromCSVSingleColumn(); + void testLoadFromCSVUTF8(); }; void TestQgsValueMapConfigDlg::initTestCase() @@ -86,5 +88,59 @@ void TestQgsValueMapConfigDlg::testLoadFromCSV() delete valueMapConfig; } +void TestQgsValueMapConfigDlg::testLoadFromCSVSingleColumn() +{ + const QString dataDir( TEST_DATA_DIR ); + QgsVectorLayer vl( QStringLiteral( "LineString?crs=epsg:3111&field=pk:int&field=name:string" ), QStringLiteral( "vl1" ), QStringLiteral( "memory" ) ); + + QList valueList; + QVariantMap value; + value.insert( QStringLiteral( "Basic unquoted record" ), QString( "" ) ); + valueList << value; + value.clear(); + value.insert( QStringLiteral( "Forest type" ), QString( "" ) ); + valueList << value; + value.clear(); + value.insert( QStringLiteral( "So-called \"data\"" ), QString( "" ) ); + valueList << value; + value.clear(); + value.insert( QStringLiteral( "444" ), QString( "" ) ); + valueList << value; + value.clear(); + value.insert( QStringLiteral( "five" ), QString( "" ) ); + valueList << value; + + QgsValueMapConfigDlg *valueMapConfig = static_cast( QgsGui::editorWidgetRegistry()->createConfigWidget( QStringLiteral( "ValueMap" ), &vl, 1, nullptr ) ); + valueMapConfig->loadMapFromCSV( dataDir + QStringLiteral( "/valuemapsample1col1.csv" ) ); + QCOMPARE( valueMapConfig->config().value( QStringLiteral( "map" ) ).toList(), valueList ); + + valueMapConfig->loadMapFromCSV( dataDir + QStringLiteral( "/valuemapsample1col2.csv" ) ); + QCOMPARE( valueMapConfig->config().value( QStringLiteral( "map" ) ).toList(), valueList ); + delete valueMapConfig; +} + +void TestQgsValueMapConfigDlg::testLoadFromCSVUTF8() +{ + const QString dataDir( TEST_DATA_DIR ); + QgsVectorLayer vl( QStringLiteral( "LineString?crs=epsg:3111&field=pk:int&field=name:string" ), QStringLiteral( "vl1" ), QStringLiteral( "memory" ) ); + + QList valueList; + QVariantMap value; + value.insert( QStringLiteral( "char è" ), QString( "1" ) ); + valueList << value; + value.clear(); + value.insert( QStringLiteral( "char Ü" ), QString( "2" ) ); + valueList << value; + value.clear(); + value.insert( QStringLiteral( "char Σ" ), QString( "3" ) ); + valueList << value; + value.clear(); + + QgsValueMapConfigDlg *valueMapConfig = static_cast( QgsGui::editorWidgetRegistry()->createConfigWidget( QStringLiteral( "ValueMap" ), &vl, 1, nullptr ) ); + valueMapConfig->loadMapFromCSV( dataDir + QStringLiteral( "/valuemapsampleutf8.csv" ) ); + QCOMPARE( valueMapConfig->config().value( QStringLiteral( "map" ) ).toList(), valueList ); + delete valueMapConfig; +} + QGSTEST_MAIN( TestQgsValueMapConfigDlg ) #include "testqgsvaluemapconfigdlg.moc" diff --git a/tests/testdata/valuemapsample1col1.csv b/tests/testdata/valuemapsample1col1.csv new file mode 100644 index 000000000000..6cbbded4bd72 --- /dev/null +++ b/tests/testdata/valuemapsample1col1.csv @@ -0,0 +1,5 @@ +1, +2, +three, +4, +5, diff --git a/tests/testdata/valuemapsample1col2.csv b/tests/testdata/valuemapsample1col2.csv new file mode 100644 index 000000000000..c4fcee863777 --- /dev/null +++ b/tests/testdata/valuemapsample1col2.csv @@ -0,0 +1,5 @@ +1 +2 +three +4 +5 diff --git a/tests/testdata/valuemapsampleutf8.csv b/tests/testdata/valuemapsampleutf8.csv new file mode 100644 index 000000000000..60e6c620976a --- /dev/null +++ b/tests/testdata/valuemapsampleutf8.csv @@ -0,0 +1,3 @@ +1,char è +2,char Ü +3,char Σ