Skip to content

Commit adff896

Browse files
author
jef
committed
fix #2208
git-svn-id: http://svn.osgeo.org/qgis/trunk@12580 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 3a7851c commit adff896

File tree

2 files changed

+65
-18
lines changed

2 files changed

+65
-18
lines changed

src/providers/delimitedtext/qgsdelimitedtextprovider.cpp

+63-18
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,66 @@ static const QString TEXT_PROVIDER_KEY = "delimitedtext";
4444
static const QString TEXT_PROVIDER_DESCRIPTION = "Delimited text data provider";
4545

4646

47+
QStringList QgsDelimitedTextProvider::splitLine( QString line )
48+
{
49+
QgsDebugMsg( "Attempting to split the input line: " + line + " using delimiter " + mDelimiter );
50+
51+
QStringList parts;
52+
if ( mDelimiterType == "regexp" )
53+
parts = line.split( mDelimiterRegexp );
54+
else
55+
parts = line.split( mDelimiter );
56+
57+
QgsDebugMsg( "Split line into " + QString::number( parts.size() ) + " parts" );
58+
59+
if ( mDelimiterType == "plain" )
60+
{
61+
QChar delim;
62+
int i = 0, first = parts.size();
63+
while ( i < parts.size() )
64+
{
65+
if ( delim == 0 && ( parts[i][0] == '"' || parts[i][0] == '\'' ) )
66+
{
67+
delim = parts[i][0];
68+
first = i;
69+
continue;
70+
}
71+
72+
if ( delim != 0 && parts[i][ parts[i].length() - 1 ] == delim )
73+
{
74+
parts[first] = parts[first].mid( 1 );
75+
parts[i] = parts[i].left( parts[i].length() - 1 );
76+
77+
if ( first < i )
78+
{
79+
QStringList values;
80+
while ( first <= i )
81+
{
82+
values << parts[first];
83+
parts.takeAt( first );
84+
i--;
85+
}
86+
87+
parts.insert( first, values.join( mDelimiter ) );
88+
}
89+
90+
first = -1;
91+
delim = 0;
92+
}
93+
94+
i++;
95+
96+
if ( i == parts.size() && first >= 0 )
97+
{
98+
i = first + 1;
99+
first = -1;
100+
delim = 0;
101+
}
102+
}
103+
}
104+
105+
return parts;
106+
}
47107

48108
QgsDelimitedTextProvider::QgsDelimitedTextProvider( QString uri )
49109
: QgsVectorDataProvider( uri ),
@@ -137,14 +197,7 @@ QgsDelimitedTextProvider::QgsDelimitedTextProvider( QString uri )
137197
{
138198
// Get the fields from the header row and store them in the
139199
// fields vector
140-
QgsDebugMsg( "Attempting to split the input line: " + line + " using delimiter " + mDelimiter );
141-
142-
QStringList fieldList;
143-
if ( mDelimiterType == "regexp" )
144-
fieldList = line.split( mDelimiterRegexp );
145-
else
146-
fieldList = line.split( mDelimiter );
147-
QgsDebugMsg( "Split line into " + QString::number( fieldList.size() ) + " parts" );
200+
QStringList fieldList = splitLine( line );
148201

149202
// We don't know anything about a text based field other
150203
// than its name. All fields are assumed to be text
@@ -185,11 +238,7 @@ QgsDelimitedTextProvider::QgsDelimitedTextProvider( QString uri )
185238
mNumberFeatures++;
186239

187240
// split the line on the delimiter
188-
QStringList parts;
189-
if ( mDelimiterType == "regexp" )
190-
parts = line.split( mDelimiterRegexp );
191-
else
192-
parts = line.split( mDelimiter );
241+
QStringList parts = splitLine( line );
193242

194243
// Skip malformed lines silently. Report line number with nextFeature()
195244
if ( attributeFields.size() != parts.size() )
@@ -293,11 +342,7 @@ bool QgsDelimitedTextProvider::nextFeature( QgsFeature& feature )
293342
QString line = mStream->readLine(); // Default local 8 bit encoding
294343

295344
// lex the tokens from the current data line
296-
QStringList tokens;
297-
if ( mDelimiterType == "regexp" )
298-
tokens = line.split( mDelimiterRegexp );
299-
else
300-
tokens = line.split( mDelimiter );
345+
QStringList tokens = splitLine( line );
301346

302347
bool xOk = false;
303348
bool yOk = false;

src/providers/delimitedtext/qgsdelimitedtextprovider.h

+2
Original file line numberDiff line numberDiff line change
@@ -219,4 +219,6 @@ class QgsDelimitedTextProvider : public QgsVectorDataProvider
219219
};
220220
wkbPoint mWKBpt;
221221

222+
QStringList splitLine( QString line );
223+
222224
};

0 commit comments

Comments
 (0)