blob: 8cb96e6bb92651489350523af0a277d1b586c6ce (
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
|
#pragma once
#include <util/generic/yexception.h>
#include <util/generic/strbuf.h>
#include <util/generic/vector.h>
#include <util/stream/input.h>
/*
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(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::iterator Begin;
const TString::const_iterator End;
TString CustomString;
TVector<TStringBuf> CustomStringBufs;
};
}
|