[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