@@ -44,6 +44,66 @@ static const QString TEXT_PROVIDER_KEY = "delimitedtext";
44
44
static const QString TEXT_PROVIDER_DESCRIPTION = " Delimited text data provider" ;
45
45
46
46
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
+ }
47
107
48
108
QgsDelimitedTextProvider::QgsDelimitedTextProvider ( QString uri )
49
109
: QgsVectorDataProvider( uri ),
@@ -137,14 +197,7 @@ QgsDelimitedTextProvider::QgsDelimitedTextProvider( QString uri )
137
197
{
138
198
// Get the fields from the header row and store them in the
139
199
// 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 );
148
201
149
202
// We don't know anything about a text based field other
150
203
// than its name. All fields are assumed to be text
@@ -185,11 +238,7 @@ QgsDelimitedTextProvider::QgsDelimitedTextProvider( QString uri )
185
238
mNumberFeatures ++;
186
239
187
240
// 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 );
193
242
194
243
// Skip malformed lines silently. Report line number with nextFeature()
195
244
if ( attributeFields.size () != parts.size () )
@@ -293,11 +342,7 @@ bool QgsDelimitedTextProvider::nextFeature( QgsFeature& feature )
293
342
QString line = mStream ->readLine (); // Default local 8 bit encoding
294
343
295
344
// 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 );
301
346
302
347
bool xOk = false ;
303
348
bool yOk = false ;
0 commit comments