1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef META_SRC_LOADERS_CSV_PARSER_H
17 #define META_SRC_LOADERS_CSV_PARSER_H
18
19 #include <base/containers/string.h>
20 #include <base/containers/string_view.h>
21 #include <base/containers/vector.h>
22
23 #include <meta/base/namespace.h>
24
META_BEGIN_NAMESPACE()25 META_BEGIN_NAMESPACE()
26
27 /**
28 * @brief The CsvParser class implements a simple CSV parser, which
29 * parses a given CSV format string.
30 * The parser supports non-quoted and quoted items, separated
31 * by a configurable delimiter. Also multiline quotes are
32 * supported.
33 */
34 class CsvParser {
35 public:
36 CsvParser() = delete;
37 explicit CsvParser(BASE_NS::string_view csv, const char delimiter = ',');
38
39 using CsvRow = BASE_NS::vector<BASE_NS::string>;
40
41 /**
42 * @brief GetRow returns the next row from the CSV file.
43 * Regularly the user should call GetRow in a loop until
44 * the function returns false (either parse error or
45 * end of the CSV file).
46 * @param row Row items will be placed here.
47 * @return True if parsing was successful, false otherwide.
48 */
49 bool GetRow(CsvRow& row);
50 /**
51 * @brief Resets to the beginning of the CSV string.
52 */
53 void Reset();
54
55 private:
56 enum State {
57 NO_QUOTE,
58 IN_QUOTE,
59 QUOTED,
60 };
61 CsvRow ParseRow();
62 BASE_NS::string_view Trimmed(BASE_NS::string_view sv, State state);
63
64 char delimiter_ {};
65 BASE_NS::string csv_;
66 size_t pos_ {};
67 };
68
69 META_END_NAMESPACE()
70
71 #endif
72