diff --git a/examples/csv-streams-to-record-arrays/csv_streams_to_record_array.bal b/examples/csv-streams-to-record-arrays/csv_streams_to_record_array.bal new file mode 100644 index 0000000000..9d45daabec --- /dev/null +++ b/examples/csv-streams-to-record-arrays/csv_streams_to_record_array.bal @@ -0,0 +1,38 @@ +import ballerina/data.csv; +import ballerina/io; + +type Book record { + string name; + string author; + decimal price; + string publishedDate; +}; + +type BookMinimal record {| + string name; + string author; +|}; + +const csvFilePath = "./files/csv_file.csv"; + +public function main() returns error? { + // Write a CSV file. + check io:fileWriteCsv(csvFilePath, [["name", "author", "price", "publishedDate"], + ["Effective Java", "Joshua Bloch", "45.99", "2018-01-01"], + ["Clean Code", "Robert C. Martin", "37.5", "2008-08-01"]]); + + // Read the CSV file as a byte stream. + stream bookStream = check io:fileReadBlocksAsStream(csvFilePath); + + // Parse as CSV byte stream to an array of records. + Book[] bookArray = check csv:parseStream(bookStream); + io:println(bookArray); + + bookStream = check io:fileReadBlocksAsStream(csvFilePath); + + // Parse the CSV byte stream as an array of records with data projection. + // Here only the fields specified in the target record type (`name` and `author` fields) + // are included in the constructed value. + BookMinimal[] briefBookArray = check csv:parseStream(bookStream); + io:println(briefBookArray); +} diff --git a/examples/csv-streams-to-record-arrays/csv_streams_to_record_array.md b/examples/csv-streams-to-record-arrays/csv_streams_to_record_array.md new file mode 100644 index 0000000000..fdef23383f --- /dev/null +++ b/examples/csv-streams-to-record-arrays/csv_streams_to_record_array.md @@ -0,0 +1,7 @@ +# Parse CSV byte stream to Ballerina record array + +The Ballerina `data.csv` library allows parsing the CSV byte streams as arrays of Ballerina records, making it easier to process CSV data directly from `streams`. This functionality supports data projection, enabling developers to extract and map only the required fields to the target `record` type. + +::: code csv_streams_to_record_array.bal ::: + +::: out csv_streams_to_record_array.out ::: diff --git a/examples/csv-streams-to-record-arrays/csv_streams_to_record_array.metatags b/examples/csv-streams-to-record-arrays/csv_streams_to_record_array.metatags new file mode 100644 index 0000000000..88daca8c8e --- /dev/null +++ b/examples/csv-streams-to-record-arrays/csv_streams_to_record_array.metatags @@ -0,0 +1,2 @@ +description: This BBE demonstrates the parsing of CSV byte streams into Ballerina record arrays, both with and without data projection. +keywords: ballerina, ballerina by example, bbe, csv, csv byte streams, csv streams, record, record array, parseStream, csv data module, data.csv, data projection, csv to stream diff --git a/examples/csv-streams-to-record-arrays/csv_streams_to_record_array.out b/examples/csv-streams-to-record-arrays/csv_streams_to_record_array.out new file mode 100644 index 0000000000..379d7c5416 --- /dev/null +++ b/examples/csv-streams-to-record-arrays/csv_streams_to_record_array.out @@ -0,0 +1,3 @@ +$ bal run csv_streams_to_record_array.bal +[{"name":"Effective Java","author":"Joshua Bloch","price":45.99,"publishedDate":"2018-01-01"},{"name":"Clean Code","author":"Robert C. Martin","price":37.5,"publishedDate":"2008-08-01"}] +[{"name":"Effective Java","author":"Joshua Bloch"},{"name":"Clean Code","author":"Robert C. Martin"}] diff --git a/examples/index.json b/examples/index.json index 2809c0394c..dc171b82a9 100644 --- a/examples/index.json +++ b/examples/index.json @@ -4739,6 +4739,13 @@ "verifyBuild": true, "verifyOutput": true, "isLearnByExample": true + }, + { + "name": "Parse CSV byte streams to records", + "url": "csv-streams-to-record-array", + "verifyBuild": true, + "verifyOutput": true, + "isLearnByExample": true } ] },