50#include <gtest/gtest.h>
66 std::istringstream
ss(
"a,b,c\n");
77 std::istringstream
ss(
"hello\n");
86 std::istringstream
ss(
",b,,d\n");
98 std::istringstream
ss(
"a,\"hello world\",c\n");
109 std::istringstream
ss(
"a,\"hello, world\",c\n");
120 std::istringstream
ss(
"a,\"say \"\"hi\"\"\",c\n");
131 std::istringstream
ss(
"a,\"line1\nline2\",c\n");
142 std::istringstream
ss(
"a,b,c\r\n");
153 std::istringstream
ss(
"a,b,c");
164 std::istringstream
ss(
"a;b;c\n");
175 std::istringstream
ss(
"a\tb\tc\n");
186 std::istringstream
ss(
"a,b,c\n1,2,3\nx,y,z\n");
204 std::istringstream
ss(
"");
214 std::istringstream
ss(
" a , b , c \n");
231 std::string line =
"a,b,c";
242 std::string line =
"a,\"hello, world\",c";
251 std::string line =
"a,\"say \"\"hello\"\"\",c";
266 std::istringstream
ss(
"a,b,c\n1,2,3\nx,y,z\n");
277 std::istringstream
ss(
"a,b,c\n");
286 std::istringstream
ss(
"a,b,c\n1,2,3");
295 std::istringstream
ss(
"");
304 std::istringstream
ss(
"a,b,c\n1,2\nx,y,z,w\n");
315 std::istringstream
ss(
"a;b;c\n1;2;3\n");
380 std::ostringstream
out;
393 std::ostringstream
out;
404 std::ostringstream
out;
414 std::ostringstream
out;
425 std::ostringstream
out;
438 std::ostringstream
out;
450 std::ostringstream
out;
476 std::ostringstream
out;
486 std::ostringstream
out;
592 std::string line =
"a,b,c,d,e";
606 std::string line =
"single";
626 std::istringstream
ss(
"a,b,c\n1,2,3\nx,y,z\n");
634 std::istringstream
ss(
"a,b,c\n1,2\nx,y,z,w\n");
642 std::istringstream
ss(
"a,b,c\n");
656 std::istringstream
ss(
"name,age\nAlice,30\nBob,25\n");
669 std::istringstream
ss(
"name,age\nAlice,30\nBob,25\n");
682 std::istringstream
ss(
"a,b\n1,2\n");
754 std::istringstream
input(
"name,value\ntest,100\n");
758 std::ostringstream
output;
795 std::ostringstream
output;
806 <<
"Row " << i <<
" size mismatch";
809 <<
"Mismatch at row " << i <<
", col " << j;
821 std::istringstream
ss(
"\n\n\n");
830 std::string line =
",,,";
835 for (
size_t i = 0; i <
row.
size(); ++i)
841 std::string line =
"a,\"\",b";
852 std::string line =
"\"\"\"\"";
872 for (
int i = 0; i < 100; ++i)
874 if (i > 0) line +=
",";
875 line += std::to_string(i);
887 std::string line =
"日本語,䏿–‡,한êµì–´";
903 std::istringstream
input(
904 "id,name,price,quantity\n"
905 "1,Widget,9.99,100\n"
906 "2,\"Gadget, Pro\",19.99,50\n"
907 "3,\"Thing \"\"Deluxe\"\"\",29.99,25\n"
929 EXPECT_EQ(data(3)(1),
"Thing \"Deluxe\"");
1065 test_filename =
"/tmp/aleph_csv_reader_test_" + std::to_string(
rand()) +
".csv";
1069 file <<
"name,age,city\n";
1070 file <<
"Alice,30,NYC\n";
1071 file <<
"Bob,25,LA\n";
1072 file <<
"Charlie,35,Chicago\n";
1153 std::istringstream
ss(
"a,b\n1,2\n");
1172 std::istringstream
ss(
"name,status\nAlice,active\nBob,inactive\nCharlie,active\n");
1232 std::istringstream
ss(
"a,b,c\n1,,3\n4,5,\n7,8,9\n");
1281 std::istringstream
ss(
"cat\ndog\ncat\nbird\ndog\n");
1297 std::istringstream
ss(
"a,b,c\n1,2,3\n4,5,6\n");
1317 std::istringstream
ss(
"charlie,3\nalice,1\nbob,2\n");
1329 std::istringstream
ss(
"charlie,30\nalice,10\nbob,20\n");
1341 std::istringstream
ss(
"a,b\n1,2\n3,4\n1,2\n5,6\n1,2\n");
1352 std::string result = s;
1353 for (
char & c : result)
1354 c = std::toupper(
static_cast<unsigned char>(c));
1365 if (
row.
size() < 3)
return std::string(
"N/A");
1367 int sum = std::stoi(
row(0)) + std::stoi(
row(1)) + std::stoi(
row(2));
1368 return std::to_string(
sum);
1370 return std::string(
"N/A");
1411 std::istringstream
ss(
"a,b,c\n");
1421 std::istringstream
ss(
" a , b , c \n");
1433 std::istringstream
ss(
"a,,c\n");
1451 std::istringstream
ss1(
"a,b\n1,2\n");
1452 std::istringstream
ss2(
"c,d\n3,4\n");
1467 std::istringstream
ss1(
"a,b\n1,2\n");
1468 std::istringstream
ss2(
"3,4\n5,6\n");
1481 std::istringstream
ss1(
"id,name\n1,Alice\n2,Bob\n3,Charlie\n");
1482 std::istringstream
ss2(
"id,dept\n1,Sales\n3,Engineering\n4,HR\n");
1500 std::istringstream
ss(
"dept,name\nSales,Alice\nEng,Bob\nSales,Charlie\nEng,Dave\n");
1519 ::testing::InitGoogleTest(&
argc,
argv);
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.
T & append(const T &item)
Append a new item by copy.
void empty() noexcept
empty the list
size_t size() const noexcept
Count the number of elements of the list.
std::string test_filename
Array< Array< std::string > > data
std::string test_filename
Array< Array< std::string > > data
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.
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.
DynList< T > maps(const C &c, Op op)
Classic map operation.
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)