aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2015-05-12 16:19:40 -0400
committerLibravatarUnit 193 <unit193@ubuntu.com>2015-05-12 16:19:40 -0400
commit9618f0ebbf4b88045247c01ce8c8f58203508ebf (patch)
tree20c9894691353ee8bab4eec668e9b0b6c6426e0f /SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp
parenta308f430f694423064ebc86fd0506c8c6fdb3d93 (diff)
Imported Upstream version 3.0.6upstream/3.0.6
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp')
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp54
1 files changed, 48 insertions, 6 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp b/SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp
index 7d7d20b..c89074f 100644
--- a/SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp
@@ -36,6 +36,38 @@ QString CsvSerializer::serialize(const QStringList& data, const CsvFormat& forma
}
template <class T>
+bool isCsvColumnSeparator(const T& data, int pos, const CsvFormat& format)
+{
+ if (!format.strictColumnSeparator && format.columnSeparator.contains(data[pos]))
+ return true;
+
+ for (const QChar& c : format.columnSeparator)
+ {
+ if (c != data[pos++])
+ return false;
+ }
+
+ return true;
+}
+
+template <class T>
+bool isCsvRowSeparator(const T& data, int& pos, const CsvFormat& format)
+{
+ if (!format.strictRowSeparator && format.rowSeparator.contains(data[pos]))
+ return true;
+
+ int localPos = pos;
+ for (const QChar& c : format.rowSeparator)
+ {
+ if (localPos >= data.size() || c != data[localPos++])
+ return false;
+ }
+
+ pos = localPos - 1;
+ return true;
+}
+
+template <class T>
QList<QList<T>> typedDeserialize(const T& data, const CsvFormat& format)
{
QList<QList<T>> rows;
@@ -58,23 +90,33 @@ QList<QList<T>> typedDeserialize(const T& data, const CsvFormat& format)
}
else if (quotes && c == '"' )
{
- if (pos + 1 < data.length() && data[pos+1] == '"' )
+ if (pos + 1 < data.length())
{
- field += c;
- pos++;
+ if (data[pos+1] == '"' )
+ {
+ field += c;
+ pos++;
+ }
+ else
+ {
+ quotes = false;
+ }
}
else
{
- quotes = false;
+ if (field.length() == 0)
+ cells << field;
+
+ quotes = false;
}
}
- else if (!quotes && format.columnSeparator.contains(c))
+ else if (!quotes && isCsvColumnSeparator(data, pos, format))
{
cells << field;
field.clear();
sepAsLast = true;
}
- else if (!quotes && format.rowSeparator.contains(c))
+ else if (!quotes && isCsvRowSeparator(data, pos, format))
{
cells << field;
rows << cells;