[QGIS Commit] r12580 - trunk/qgis/src/providers/delimitedtext
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Tue Dec 22 11:13:58 EST 2009
Author: jef
Date: 2009-12-22 11:13:58 -0500 (Tue, 22 Dec 2009)
New Revision: 12580
Modified:
trunk/qgis/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp
trunk/qgis/src/providers/delimitedtext/qgsdelimitedtextprovider.h
Log:
fix #2208
Modified: trunk/qgis/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp
===================================================================
--- trunk/qgis/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp 2009-12-22 14:52:54 UTC (rev 12579)
+++ trunk/qgis/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp 2009-12-22 16:13:58 UTC (rev 12580)
@@ -44,7 +44,67 @@
static const QString TEXT_PROVIDER_DESCRIPTION = "Delimited text data provider";
+QStringList QgsDelimitedTextProvider::splitLine( QString line )
+{
+ QgsDebugMsg( "Attempting to split the input line: " + line + " using delimiter " + mDelimiter );
+ QStringList parts;
+ if ( mDelimiterType == "regexp" )
+ parts = line.split( mDelimiterRegexp );
+ else
+ parts = line.split( mDelimiter );
+
+ QgsDebugMsg( "Split line into " + QString::number( parts.size() ) + " parts" );
+
+ if ( mDelimiterType == "plain" )
+ {
+ QChar delim;
+ int i = 0, first = parts.size();
+ while ( i < parts.size() )
+ {
+ if ( delim == 0 && ( parts[i][0] == '"' || parts[i][0] == '\'' ) )
+ {
+ delim = parts[i][0];
+ first = i;
+ continue;
+ }
+
+ if ( delim != 0 && parts[i][ parts[i].length() - 1 ] == delim )
+ {
+ parts[first] = parts[first].mid( 1 );
+ parts[i] = parts[i].left( parts[i].length() - 1 );
+
+ if ( first < i )
+ {
+ QStringList values;
+ while ( first <= i )
+ {
+ values << parts[first];
+ parts.takeAt( first );
+ i--;
+ }
+
+ parts.insert( first, values.join( mDelimiter ) );
+ }
+
+ first = -1;
+ delim = 0;
+ }
+
+ i++;
+
+ if ( i == parts.size() && first >= 0 )
+ {
+ i = first + 1;
+ first = -1;
+ delim = 0;
+ }
+ }
+ }
+
+ return parts;
+}
+
QgsDelimitedTextProvider::QgsDelimitedTextProvider( QString uri )
: QgsVectorDataProvider( uri ),
mXFieldIndex( -1 ), mYFieldIndex( -1 ),
@@ -137,15 +197,8 @@
{
// Get the fields from the header row and store them in the
// fields vector
- QgsDebugMsg( "Attempting to split the input line: " + line + " using delimiter " + mDelimiter );
+ QStringList fieldList = splitLine( line );
- QStringList fieldList;
- if ( mDelimiterType == "regexp" )
- fieldList = line.split( mDelimiterRegexp );
- else
- fieldList = line.split( mDelimiter );
- QgsDebugMsg( "Split line into " + QString::number( fieldList.size() ) + " parts" );
-
// We don't know anything about a text based field other
// than its name. All fields are assumed to be text
int fieldPos = 0;
@@ -185,11 +238,7 @@
mNumberFeatures++;
// split the line on the delimiter
- QStringList parts;
- if ( mDelimiterType == "regexp" )
- parts = line.split( mDelimiterRegexp );
- else
- parts = line.split( mDelimiter );
+ QStringList parts = splitLine( line );
// Skip malformed lines silently. Report line number with nextFeature()
if ( attributeFields.size() != parts.size() )
@@ -293,11 +342,7 @@
QString line = mStream->readLine(); // Default local 8 bit encoding
// lex the tokens from the current data line
- QStringList tokens;
- if ( mDelimiterType == "regexp" )
- tokens = line.split( mDelimiterRegexp );
- else
- tokens = line.split( mDelimiter );
+ QStringList tokens = splitLine( line );
bool xOk = false;
bool yOk = false;
Modified: trunk/qgis/src/providers/delimitedtext/qgsdelimitedtextprovider.h
===================================================================
--- trunk/qgis/src/providers/delimitedtext/qgsdelimitedtextprovider.h 2009-12-22 14:52:54 UTC (rev 12579)
+++ trunk/qgis/src/providers/delimitedtext/qgsdelimitedtextprovider.h 2009-12-22 16:13:58 UTC (rev 12580)
@@ -219,4 +219,6 @@
};
wkbPoint mWKBpt;
+ QStringList splitLine( QString line );
+
};
More information about the QGIS-commit
mailing list