blob: 53fdafab1c14a8b1087286e686b62159c00fff85 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#pragma once
#include <util/generic/yexception.h>
#include <util/generic/strbuf.h>
#include <util/generic/vector.h>
#include <util/stream/input.h>
#include <vector>
/*
Split string by rfc4180
*/
namespace NCsvFormat {
class TLinesSplitter {
private:
IInputStream& Input;
const char Quote;
public:
TLinesSplitter(IInputStream& input, const char quote = '"')
: Input(input)
, Quote(quote) {
}
TString ConsumeLine();
};
class CsvSplitter {
public:
CsvSplitter(const TString& data, const char delimeter = ',', const char quote = '"')
// quote = '\0' ignores quoting in values and words like simple split
: Delimeter(delimeter)
, Quote(quote)
, Begin(data.begin())
, End(data.end())
{
}
bool Step() {
if (Begin == End) {
return false;
}
++Begin;
return true;
}
TStringBuf Consume();
explicit operator TVector<TString>() {
TVector<TString> ret;
do {
TStringBuf buf = Consume();
ret.push_back(TString{buf});
} while (Step());
return ret;
}
private:
const char Delimeter;
const char Quote;
TString::const_iterator Begin;
const TString::const_iterator End;
std::vector<std::unique_ptr<TString>> TempResults; // CsvSplitter lifetime
std::vector<TStringBuf> TempResultParts; // Single Consume() method call lifetime
};
}
|