6#include "data_frame.hpp"
8#include "string_view_stream.hpp"
14#include <unordered_map>
26 internals::SpeculativeParseDiagnostics speculative_diagnostics;
45 std::unique_ptr<std::istream> stream(
new std::stringstream(std::string(in)));
49#if CSV_EXCEPTIONS_ENABLED
52 auto reader =
try_parse(in, error, format);
53 internals::throw_error(error);
54 return std::move(*reader);
74#if CSV_EXCEPTIONS_ENABLED
78 internals::throw_error(error);
79 return std::move(*reader);
83#if CSV_EXCEPTIONS_ENABLED
88 return parse(in, format);
99 inline CSVReader operator ""_csv(
const char* in,
size_t n) {
108 inline CSVReader operator ""_csv_no_header(
const char* in,
size_t n) {
123 std::unordered_map<std::string, DataType>
try_csv_data_types(CSVReader& reader, CSVError& error);
126 template<
typename Source>
130 std::unordered_map<std::string, DataType>()) {
132 return reader ?
try_csv_data_types(*reader, error) : std::unordered_map<std::string, DataType>();
135#if CSV_EXCEPTIONS_ENABLED
136 std::unordered_map<std::string, DataType> csv_data_types(CSVReader& reader);
155 typename... ReaderArgs,
156 csv::enable_if_t<std::is_constructible<CSVReader, ReaderArgs...>::value,
int> = 0
158 inline std::unordered_map<std::string, DataType> csv_data_types(ReaderArgs&&... reader_args) {
159 CSVReader reader(std::forward<ReaderArgs>(reader_args)...);
160 return csv_data_types(reader);
164 namespace internals {
167 template<
typename Fn>
168 inline bool try_for_each_csv_chunk(
169 CSVReader& reader, Fn&& fn, CSVError& error,
size_t chunk_size) {
173 std::vector<CSVRow> rows;
174 while (reader.try_read_chunk(rows, chunk_size, error)) {
175 DataFrame<> batch(std::move(rows));
176 if (!fn(batch, error))
return false;
194 template<
typename State,
typename Fn>
197 DataFrameExecutor& executor,
198 std::vector<State>& states,
201 size_t chunk_size = 50000
203 return internals::try_for_each_csv_chunk(reader,
204 [&executor, &states, &fn](DataFrame<>& batch,
CSVError& failure) {
205 return batch.try_column_parallel_apply(executor, states, std::forward<Fn>(fn), failure);
206 }, error, chunk_size);
209#if CSV_EXCEPTIONS_ENABLED
210 template<
typename State,
typename Fn>
211 inline void chunk_parallel_apply(
213 DataFrameExecutor& executor,
214 std::vector<State>& states,
216 size_t chunk_size = 50000
220 internals::throw_dataframe_error(error);
229 template<
typename State,
typename Fn>
232 std::vector<State>& states,
235 size_t chunk_size = 50000
237 DataFrameExecutor executor;
241#if CSV_EXCEPTIONS_ENABLED
242 template<
typename State,
typename Fn>
243 inline void chunk_parallel_apply(
245 std::vector<State>& states,
247 size_t chunk_size = 50000
251 internals::throw_dataframe_error(error);
260 if (!reader)
return {};
263 const char delimiter = internals::resolved_delimiter(format);
265 std::vector<CSVRow> rows;
266 while (reader->try_read_chunk(rows, 50000, error)) {}
267 if (error)
return {};
271 reader->get_col_names(),
274 reader->get_col_names().size(),
275 reader->parse_worker_count(),
276 reader->speculative_diagnostics()
280#if CSV_EXCEPTIONS_ENABLED
281 inline CSVFileInfo get_file_info(
const std::string& filename) {
284 internals::throw_error(error);
294 auto head = internals::parser::get_csv_head(filename, error);
295 if (error)
return {};
297 return reader ? reader->get_col_names() : std::vector<std::string>();
309 const auto position = std::find(col_names.begin(), col_names.end(), col_name);
311 :
static_cast<long long>(std::distance(col_names.begin(), position));
314#if CSV_EXCEPTIONS_ENABLED
322 internals::throw_error(error);
332 const auto result =
try_get_col_pos(filename, col_name, error, format);
333 internals::throw_error(error);
Main class for parsing CSVs from files and in-memory sources.
static std::unique_ptr< CSVReader > try_open(csv::string_view filename, CSVError &error, const CSVFormat &format=CSVFormat::guess_csv())
Construct CSVReader from filename.
Lightweight istream over csv::string_view with zero copy.
A standalone header file containing shared code.
Shared exception message templates and throw helpers.
Defines functionality needed for basic CSV parsing.
CSV scalar type classification adapter.
The all encompassing namespace.
bool try_chunk_parallel_apply(CSVReader &reader, DataFrameExecutor &executor, std::vector< State > &states, Fn &&fn, CSVError &error, size_t chunk_size=50000)
Apply a per-column batch function over a CSVReader using a reusable executor.
CSVFileInfo try_get_file_info(const std::string &filename, CSVError &error)
Get basic information about a CSV file.
long long get_col_pos(csv::string_view filename, csv::string_view col_name, const CSVFormat &format=CSVFormat::guess_csv())
Find the position of a column in a CSV file or CSV_NOT_FOUND otherwise.
@ InvalidArgument
Invalid operation input, such as a null stream or zero batch size.
std::unordered_map< std::string, DataType > try_csv_data_types(CSVReader &reader, CSVError &error)
Infer SQL-friendly column data types from an existing CSVReader.
std::vector< std::string > try_get_col_names(csv::string_view filename, CSVError &error, const CSVFormat &format=CSVFormat::guess_csv())
Get the column names of a CSV file using just the first 500KB.
std::vector< std::string > get_col_names(csv::string_view filename, const CSVFormat &format=CSVFormat::guess_csv())
Get the column names of a CSV file using just the first 500KB.
CSVReader parse_no_header(csv::string_view in)
Parses a CSV string with no headers.
constexpr int CSV_NOT_FOUND
Integer indicating a requested column wasn't found.
long long try_get_col_pos(csv::string_view filename, csv::string_view col_name, CSVError &error, const CSVFormat &format=CSVFormat::guess_csv())
Find a column position, returning CSV_NOT_FOUND for an absent name or on failure.
std::unique_ptr< CSVReader > try_parse(csv::string_view in, CSVError &error, const CSVFormat &format=CSVFormat::guess_csv())
Parse CSV from a string view, copying the input into an owned buffer.
std::unique_ptr< CSVReader > try_parse_unsafe(csv::string_view in, CSVError &error, const CSVFormat &format=CSVFormat::guess_csv())
Parse CSV from an in-memory view with zero copy.
std::string_view string_view
The string_view class used by this library.
A diagnostic whose text remains valid for the lifetime of the error.
Returned by the file inspection utilities.
size_t n_cols
Number of columns in a CSV.
std::vector< std::string > col_names
CSV column names.
size_t parse_worker_count
Number of parser worker threads used.
char delim
Delimiting character.
std::string filename
Filename.
size_t n_rows
Number of rows in a file.