50#include <gtest/gtest.h>
76 return static_cast<long long>(
_getpid());
78 return static_cast<long long>(
getpid());
91 std::istringstream
ss(
"a,b,c\n");
102 std::istringstream
ss(
"hello\n");
111 std::istringstream
ss(
",b,,d\n");
123 std::istringstream
ss(
"a,\"hello world\",c\n");
134 std::istringstream
ss(
"a,\"hello, world\",c\n");
145 std::istringstream
ss(
"a,\"say \"\"hi\"\"\",c\n");
156 std::istringstream
ss(
"a,\"line1\nline2\",c\n");
167 std::istringstream
ss(
"a,b,c\r\n");
178 std::istringstream
ss(
"a,b,c");
189 std::istringstream
ss(
"a;b;c\n");
200 std::istringstream
ss(
"a\tb\tc\n");
211 std::istringstream
ss(
"a,b,c\n1,2,3\nx,y,z\n");
229 std::istringstream
ss(
"");
239 std::istringstream
ss(
" a , b , c \n");
256 std::string line =
"a,b,c";
267 std::string line =
"a,\"hello, world\",c";
276 std::string line =
"a,\"say \"\"hello\"\"\",c";
291 std::istringstream
ss(
"a,b,c\n1,2,3\nx,y,z\n");
302 std::istringstream
ss(
"a,b,c\n");
311 std::istringstream
ss(
"a,b,c\n1,2,3");
320 std::istringstream
ss(
"");
329 std::istringstream
ss(
"a,b,c\n1,2\nx,y,z,w\n");
340 std::istringstream
ss(
"a;b;c\n1;2;3\n");
405 std::ostringstream
out;
415 row.append(
"hello, world");
418 std::ostringstream
out;
429 std::ostringstream
out;
439 std::ostringstream
out;
450 std::ostringstream
out;
463 std::ostringstream
out;
475 std::ostringstream
out;
501 std::ostringstream
out;
511 std::ostringstream
out;
532 const auto *
test_info = ::testing::UnitTest::GetInstance()->current_test_info();
533 std::string base = std::string(
"aleph_csv_test_") +
test_info->name() +
"_" +
534 std::to_string(process_id());
536 for (
auto &
ch : base)
540 test_filename = (std::filesystem::temp_directory_path() / (base +
".csv")).string();
609 row.append(
"field with \"quotes\"");
610 row.append(
"field with\nnewline");
631 std::string line =
"a,b,c,d,e";
645 std::string line =
"single";
665 std::istringstream
ss(
"a,b,c\n1,2,3\nx,y,z\n");
673 std::istringstream
ss(
"a,b,c\n1,2\nx,y,z,w\n");
681 std::istringstream
ss(
"a,b,c\n");
695 std::istringstream
ss(
"name,age\nAlice,30\nBob,25\n");
708 std::istringstream
ss(
"name,age\nAlice,30\nBob,25\n");
721 std::istringstream
ss(
"a,b\n1,2\n");
793 std::istringstream
input(
"name,value\ntest,100\n");
797 std::ostringstream
output;
806 for (
size_t i = 0; i <
original.size(); ++i)
809 for (
size_t j = 0; j <
original(i).size(); ++j)
821 row1.append(
"with, comma");
822 row1.append(
"with \"quotes\"");
823 row1.append(
"with\nnewline");
829 row2.append(
"\n\r\n");
834 std::ostringstream
output;
842 for (
size_t i = 0; i <
original.size(); ++i)
845 <<
"Row " << i <<
" size mismatch";
846 for (
size_t j = 0; j <
original(i).size(); ++j)
848 <<
"Mismatch at row " << i <<
", col " << j;
860 std::istringstream
ss(
"\n\n\n");
869 std::string line =
",,,";
874 for (
size_t i = 0; i <
row.size(); ++i)
880 std::string line =
"a,\"\",b";
891 std::string line =
"\"\"\"\"";
911 for (
int i = 0; i < 100; ++i)
913 if (i > 0) line +=
",";
914 line += std::to_string(i);
926 std::string line =
"日本語,䏿–‡,한êµì–´";
942 std::istringstream
input(
943 "id,name,price,quantity\n"
944 "1,Widget,9.99,100\n"
945 "2,\"Gadget, Pro\",19.99,50\n"
946 "3,\"Thing \"\"Deluxe\"\"\",29.99,25\n"
968 EXPECT_EQ(data(3)(1),
"Thing \"Deluxe\"");
1112 const auto *
test_info = ::testing::UnitTest::GetInstance()->current_test_info();
1113 std::string base = std::string(
"aleph_csv_reader_test_") +
test_info->name() +
"_" +
1114 std::to_string(process_id());
1116 for (
auto &
ch : base)
1120 test_filename = (std::filesystem::temp_directory_path() / (base +
".csv")).string();
1124 file <<
"name,age,city\n";
1125 file <<
"Alice,30,NYC\n";
1126 file <<
"Bob,25,LA\n";
1127 file <<
"Charlie,35,Chicago\n";
1208 std::istringstream
ss(
"a,b\n1,2\n");
1227 std::istringstream
ss(
"name,status\nAlice,active\nBob,inactive\nCharlie,active\n");
1237 return row.size() > 1
and row(1) ==
"active";
1287 std::istringstream
ss(
"a,b,c\n1,,3\n4,5,\n7,8,9\n");
1307 return row.size() >= 3
and row(2) ==
"";
1316 return row.size() > 0
and row(0) ==
"4";
1336 std::istringstream
ss(
"cat\ndog\ncat\nbird\ndog\n");
1352 std::istringstream
ss(
"a,b,c\n1,2,3\n4,5,6\n");
1372 std::istringstream
ss(
"charlie,3\nalice,1\nbob,2\n");
1384 std::istringstream
ss(
"charlie,30\nalice,10\nbob,20\n");
1396 std::istringstream
ss(
"a,b\n1,2\n3,4\n1,2\n5,6\n1,2\n");
1407 std::string result = s;
1408 for (
char & c : result)
1409 c = std::toupper(
static_cast<unsigned char>(c));
1420 if (
row.size() < 3)
return std::string(
"N/A");
1422 int sum = std::stoi(
row(0)) + std::stoi(
row(1)) + std::stoi(
row(2));
1423 return std::to_string(
sum);
1425 return std::string(
"N/A");
1466 std::istringstream
ss(
"a,b,c\n");
1476 std::istringstream
ss(
" a , b , c \n");
1488 std::istringstream
ss(
"a,,c\n");
1506 std::istringstream
ss1(
"a,b\n1,2\n");
1507 std::istringstream
ss2(
"c,d\n3,4\n");
1522 std::istringstream
ss1(
"a,b\n1,2\n");
1523 std::istringstream
ss2(
"3,4\n5,6\n");
1536 std::istringstream
ss1(
"id,name\n1,Alice\n2,Bob\n3,Charlie\n");
1537 std::istringstream
ss2(
"id,dept\n1,Sales\n3,Engineering\n4,HR\n");
1555 std::istringstream
ss(
"dept,name\nSales,Alice\nEng,Bob\nSales,Charlie\nEng,Dave\n");
1574 ::testing::InitGoogleTest(&
argc,
argv);
size_t size_t int32_t value
size_t size_t int32_t * out
Simple dynamic array with automatic resizing and functional operations.
constexpr size_t size() const noexcept
Return the number of elements stored in the stack.
T & append(const T &data)
Append a copy of data
Lazy CSV reader for large files.
A CSV row with header-based field access.
std::string test_filename
Array< Array< std::string > > data
std::string test_filename
Array< Array< std::string > > data
size_t blossom_maximum_cardinality_matching(const GT &g, DynDlist< typename GT::Arc * > &matching, SA sa=SA())
Alias of compute_maximum_cardinality_general_matching().
Main namespace for Aleph-w library functions.
long csv_to_number< long >(const std::string &field)
size_t csv_find_row(const Array< Array< std::string > > &rows, Pred predicate)
Find first row matching a predicate.
Array< Array< std::string > > csv_trim_fields(const Array< Array< std::string > > &rows)
Trim whitespace from all fields.
std::string csv_escape(const std::string &field, char delimiter=',')
Escape a string for CSV output.
Array< Array< std::string > > csv_read_file(const std::string &filename, char delimiter=',')
Read all rows from a CSV file.
Array< Array< std::string > > csv_transform(const Array< Array< std::string > > &rows, Func func)
Apply a transformation to each field.
Itor unique(Itor __first, Itor __last, BinaryPredicate __binary_pred=BinaryPredicate())
Remove consecutive duplicates in place.
Array< Array< std::string > > csv_filter_by_value(const Array< Array< std::string > > &rows, size_t col_index, const std::string &value)
Filter CSV rows by column value.
size_t size(Node *root) noexcept
bool csv_skip_bom(std::istream &in)
Skip UTF-8 BOM if present.
Array< Array< std::string > > csv_transpose(const Array< Array< std::string > > &rows)
Transpose CSV data (swap rows and columns).
Array< Array< std::string > > csv_rename_column(const Array< Array< std::string > > &rows, const std::string &old_name, const std::string &new_name)
Rename a column (in the header row).
Array< Array< std::string > > csv_take_rows(const Array< Array< std::string > > &rows, size_t n)
Take only the first N rows of CSV data.
and
Check uniqueness with explicit hash + equality functors.
Array< std::string > csv_get_column(const Array< Array< std::string > > &rows, size_t col_index)
Get a column from CSV data.
Array< Array< std::string > > csv_join_horizontal(const Array< Array< std::string > > &left, const Array< Array< std::string > > &right)
Join two CSV datasets horizontally (add columns).
Array< Array< std::string > > csv_unique(const Array< Array< std::string > > &rows)
Remove duplicate rows.
Array< Array< Array< std::string > > > csv_group_by(const Array< Array< std::string > > &rows, size_t col_index)
Group rows by a column value.
float csv_to_number< float >(const std::string &field)
void csv_write_row(std::ostream &out, const Array< std::string > &row, char delimiter=',', const std::string &line_ending="\n")
Write a CSV row to an output stream.
size_t csv_num_columns(const Array< std::string > &row)
Get the number of columns in a CSV row.
size_t csv_count_empty(const Array< Array< std::string > > &rows)
Count empty fields in CSV data.
Array< std::string > csv_read_row(std::istream &in, char delimiter=',')
Read a single CSV row from an input stream.
size_t csv_find_by_value(const Array< Array< std::string > > &rows, size_t col_index, const std::string &value)
Find row where column equals value.
bool csv_is_rectangular(const Array< Array< std::string > > &rows)
Check if all rows have the same number of columns.
Array< std::string > csv_distinct(const Array< Array< std::string > > &rows, size_t col_index)
Get distinct values in a column.
Array< Array< std::string > > csv_filter(const Array< Array< std::string > > &rows, Pred predicate)
Filter CSV rows by a predicate.
Array< Array< std::string > > csv_read_all(std::istream &in, char delimiter=',')
Read all rows from a CSV input stream.
int csv_to_number< int >(const std::string &field)
double csv_to_number< double >(const std::string &field)
Array< Array< std::string > > csv_inner_join(const Array< Array< std::string > > &left, size_t left_key_col, const Array< Array< std::string > > &right, size_t right_key_col)
Inner join two CSV datasets by a key column.
void csv_write_file(const std::string &filename, const Array< Array< std::string > > &rows, char delimiter=',', const std::string &line_ending="\n")
Write CSV data to a file.
Array< Array< std::string > > csv_skip_rows(const Array< Array< std::string > > &rows, size_t n)
Skip the first N rows of CSV data.
Array< Array< std::string > > csv_select_columns(const Array< Array< std::string > > &rows, const Array< size_t > &col_indices)
Select specific columns from CSV data.
Array< Array< std::string > > csv_fill_empty(const Array< Array< std::string > > &rows, const std::string &default_value)
Replace empty fields with a default value.
size_t csv_count_if(const Array< Array< std::string > > &rows, Pred predicate)
Count rows matching a predicate.
Array< Array< std::string > > csv_join_vertical(const Array< Array< std::string > > &top, const Array< Array< std::string > > &bottom)
Join two CSV datasets vertically (add rows).
Array< Array< std::string > > csv_add_column(const Array< Array< std::string > > &rows, Func func)
Add a new column with computed values.
Array< Array< std::string > > csv_sort_by_column(const Array< Array< std::string > > &rows, size_t col_index, bool ascending=true)
Sort CSV data by a column.
void csv_write_all(std::ostream &out, const Array< Array< std::string > > &rows, char delimiter=',', const std::string &line_ending="\n")
Write multiple CSV rows to an output stream.
Itor::difference_type count(const Itor &beg, const Itor &end, const T &value)
Count elements equal to a value.
size_t csv_count_rows(const Array< Array< std::string > > &rows)
Count total number of rows.
T sum(const Container &container, const T &init=T{})
Compute sum of all elements.
Comprehensive CSV (Comma-Separated Values) parsing and manipulation utilities.
TEST_F(CsvReadRowStreamTest, SimpleRow)