16 std::unordered_map<std::string, DataType> csv_dtypes;
17 const auto col_names = reader.get_col_names();
18 std::vector<std::unordered_map<DataType, size_t>> type_counts(col_names.size());
19 constexpr size_t TYPE_CHUNK_SIZE = 5000;
23 std::vector<CSVError> column_errors(col_names.size());
24 auto count_column = [&column_errors](DataFrame<>::column_type column,
25 std::unordered_map<DataType, size_t>& counts) {
26 CSVError& column_error = column_errors[column.index()];
27 for (
size_t row_index = 0; row_index < column.size(); ++row_index) {
28 const auto value = column.try_get_sv(row_index, column_error);
29 if (column_error)
return;
30 counts[internals::data_type(value)]++;
33 DataFrameExecutor executor;
34 if (!internals::try_for_each_csv_chunk(reader,
35 [&executor, &type_counts, &column_errors, &count_column](DataFrame<>& batch,
CSVError& failure) {
36 if (!batch.try_column_parallel_apply(executor, type_counts, count_column, failure))
return false;
37 for (
const auto& column_error : column_errors) {
39 failure = column_error;
44 }, error, TYPE_CHUNK_SIZE))
return {};
46 for (
size_t i = 0; i < col_names.size(); i++) {
47 auto& col = type_counts[i];
48 auto& col_name = col_names[i];
std::unordered_map< std::string, DataType > try_csv_data_types(CSVReader &reader, CSVError &error)
Infer SQL-friendly column data types from an existing CSVReader.