diff options
| author | 2015-05-12 16:19:40 -0400 | |
|---|---|---|
| committer | 2015-05-12 16:19:40 -0400 | |
| commit | 9618f0ebbf4b88045247c01ce8c8f58203508ebf (patch) | |
| tree | 20c9894691353ee8bab4eec668e9b0b6c6426e0f /SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp | |
| parent | a308f430f694423064ebc86fd0506c8c6fdb3d93 (diff) | |
Imported Upstream version 3.0.6upstream/3.0.6
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp')
| -rw-r--r-- | SQLiteStudio3/coreSQLiteStudio/csvserializer.cpp | 54 |
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; |
