Remove extra symbols (spaces, text delimeters...) @input: - elements - list of row elements - textDelimiter - string that is used as text delimiter
| 411 | // - elements - list of row elements |
| 412 | // - textDelimiter - string that is used as text delimiter |
| 413 | void ReaderPrivate::removeExtraSymbols( |
| 414 | QList<QString>& elements, const QString& textDelimiter) |
| 415 | { |
| 416 | if (elements.isEmpty()) { return; } |
| 417 | |
| 418 | const auto doubleTextDelim = textDelimiter + textDelimiter; |
| 419 | for (auto i = 0; i < elements.size(); ++i) { |
| 420 | const auto str = QStringView{elements.at(i)}; |
| 421 | if (str.isEmpty()) { continue; } |
| 422 | |
| 423 | qsizetype startPos = 0, endPos = str.size() - 1; |
| 424 | |
| 425 | // Find first non-space char |
| 426 | for (; startPos < str.size() && |
| 427 | str.at(startPos).category() == QChar::Separator_Space; |
| 428 | ++startPos); |
| 429 | |
| 430 | // Find last non-space char |
| 431 | for (; |
| 432 | endPos >= 0 && str.at(endPos).category() == QChar::Separator_Space; |
| 433 | --endPos); |
| 434 | |
| 435 | if (!textDelimiter.isEmpty()) { |
| 436 | // Skip text delimiter symbol if element starts with it |
| 437 | const auto strStart = str.mid(startPos, textDelimiter.size()); |
| 438 | if (strStart == textDelimiter) { |
| 439 | startPos += textDelimiter.size(); |
| 440 | } |
| 441 | |
| 442 | // Skip text delimiter symbol if element ends with it |
| 443 | const auto strEnd = str.mid( |
| 444 | endPos - textDelimiter.size() + 1, textDelimiter.size()); |
| 445 | if (strEnd == textDelimiter) { |
| 446 | endPos -= textDelimiter.size(); |
| 447 | } |
| 448 | } |
| 449 | |
| 450 | if ((0 < startPos || endPos < str.size() - 1) && |
| 451 | startPos <= endPos) { |
| 452 | elements[i] = elements[i].mid(startPos, endPos - startPos + 1); |
| 453 | } |
| 454 | |
| 455 | // Also replace double text delimiter with one text delimiter symbol |
| 456 | elements[i].replace(doubleTextDelim, textDelimiter); |
| 457 | } |
| 458 | } |
| 459 | |
| 460 | // ReadToListProcessor - processor that saves rows of elements to list. |
| 461 | class ReadToListProcessor : public Reader::AbstractProcessor { |