5#include "testing/testing.h"
14 const char delimiter =
',')
22 const char quote =
'"',
31 const char delimiter =
',',
32 const char quote =
'"',
37 Span<char>(buffer), start, delimiter, quote, quote_escape_chars, fields);
38 if (!end_of_record.has_value()) {
43 result.append(std::string(field.begin(), field.end()));
71 for (
const int64_t record_i : records.index_range()) {
72 const CsvRecord record = records.record(record_i);
77 result.fields.append(std::move(fields));
81 if (!chunks.has_value()) {
86 for (
const Chunk &chunk : *chunks) {
87 result.records.extend(std::move(chunk.fields));
175 EXPECT_TRUE(
result.success);
204 EXPECT_FALSE(
result.success);
212 EXPECT_TRUE(
result.success);
226 EXPECT_TRUE(
result.success);
236 EXPECT_TRUE(
result.success);
241 EXPECT_TRUE(
result.records.is_empty());
249 EXPECT_TRUE(
result.success);
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void append(const T &value)
StringRef field_str(const int64_t index) const
IndexRange index_range() const
CCL_NAMESPACE_BEGIN struct Options options
int64_t find_end_of_simple_field(Span< char > buffer, int64_t start, char delimiter)
std::optional< int64_t > parse_record_fields(const Span< char > buffer, const int64_t start, const char delimiter, const char quote, const Span< char > quote_escape_chars, Vector< Span< char > > &r_fields)
std::optional< int64_t > find_end_of_quoted_field(Span< char > buffer, int64_t start, char quote, Span< char > escape_chars)
static std::optional< Vector< std::string > > parse_record_fields(const StringRef buffer, const int64_t start=0, const char delimiter=',', const char quote='"', const Span<char> quote_escape_chars = Span<char>{'"', '\\'})
static std::optional< int64_t > find_end_of_quoted_field(const StringRef buffer, const int64_t start, const char quote='"', const Span<char> escape_chars = Span<char>(StringRef("\"\\")))
static StrParseResult parse_csv_fields(const StringRef str, const CsvParseOptions &options)
TEST(csv_parse, FindEndOfSimpleField)
static std::optional< int64_t > find_end_of_simple_field(const StringRef buffer, const int64_t start, const char delimiter=',')
std::optional< Vector< Any<> > > parse_csv_in_chunks(const Span< char > buffer, const CsvParseOptions &options, FunctionRef< void(const CsvRecord &record)> process_header, FunctionRef< Any<>(const CsvRecords &records)> process_records)
StringRef unescape_field(const StringRef str, const CsvParseOptions &options, LinearAllocator<> &allocator)
Vector< std::string > column_names
Vector< Vector< std::string > > records