From 4e0e84c9f4f93944debc95ce7fd5cb464f095bbb Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Tue, 24 Sep 2024 15:30:57 +0530 Subject: [PATCH 1/4] Add bbe for handling csv byte streams --- .../csv_streams_to_record_array.bal | 38 +++++++++++++++++++ .../csv_streams_to_record_array.md | 7 ++++ .../csv_streams_to_record_array.metatags | 2 + .../csv_streams_to_record_array.out | 3 ++ examples/index.json | 14 +++++++ 5 files changed, 64 insertions(+) create mode 100644 examples/csv-streams-to-record-arrays/csv_streams_to_record_array.bal create mode 100644 examples/csv-streams-to-record-arrays/csv_streams_to_record_array.md create mode 100644 examples/csv-streams-to-record-arrays/csv_streams_to_record_array.metatags create mode 100644 examples/csv-streams-to-record-arrays/csv_streams_to_record_array.out 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..325ce0177d --- /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 io: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 csvStream = check io:fileReadBlocksAsStream(csvFilePath); + + // Parse CSV `byte stream` to an array of records. + Book[]|csv:Error bookStream = csv:parseStream(csvStream); + io:println(bookStream); + + stream csvStream2 = check io:fileReadBlocksAsStream(csvFilePath); + + // Parse CSV `byte stream` to 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[]|csv:Error briefBookStream = csv:parseStream(csvStream2); + io:println(briefBookStream); +} 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..2dd7b9fb6b --- /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 CSV byte streams into 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..1ff76aa976 --- /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 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 6a45c8a9f1..d9cbb62862 100644 --- a/examples/index.json +++ b/examples/index.json @@ -4700,6 +4700,20 @@ } ] }, + { + "title": "CSV data", + "column": 3, + "category": "Common libraries", + "samples": [ + { + "name": "Parse CSV byte streams to array of records", + "url": "csv-streams-to-record-array", + "verifyBuild": true, + "verifyOutput": true, + "isLearnByExample": true + } + ] + }, { "title": "Constraint", "column": 3, From 4335933bee5f95480b6b96d39136bea5c13f2199 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Tue, 24 Sep 2024 16:38:03 +0530 Subject: [PATCH 2/4] Update csv stream bbe --- .../csv_streams_to_record_array.bal | 6 +++--- .../csv_streams_to_record_array.md | 2 +- examples/index.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) 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 index 325ce0177d..0bc02043de 100644 --- 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 @@ -21,16 +21,16 @@ public function main() returns io:Error? { ["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`. + // Read the CSV file as a byte stream. stream csvStream = check io:fileReadBlocksAsStream(csvFilePath); - // Parse CSV `byte stream` to an array of records. + // Parse as CSV byte stream to an array of records. Book[]|csv:Error bookStream = csv:parseStream(csvStream); io:println(bookStream); stream csvStream2 = check io:fileReadBlocksAsStream(csvFilePath); - // Parse CSV `byte stream` to an array of records with data projection. + // 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[]|csv:Error briefBookStream = csv:parseStream(csvStream2); 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 index 2dd7b9fb6b..fdef23383f 100644 --- 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 @@ -1,6 +1,6 @@ # Parse CSV byte stream to Ballerina record array -The Ballerina `data.csv` library allows parsing CSV byte streams into 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. +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 ::: diff --git a/examples/index.json b/examples/index.json index d9cbb62862..933af9db75 100644 --- a/examples/index.json +++ b/examples/index.json @@ -4706,7 +4706,7 @@ "category": "Common libraries", "samples": [ { - "name": "Parse CSV byte streams to array of records", + "name": "Parse CSV byte streams to records", "url": "csv-streams-to-record-array", "verifyBuild": true, "verifyOutput": true, From dd59155743e2f0937db012fb644f5483a28b8e8d Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Fri, 27 Sep 2024 09:36:29 +0530 Subject: [PATCH 3/4] Update csv streams bbe --- .../csv_streams_to_record_array.bal | 14 +++++++------- .../csv_streams_to_record_array.metatags | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) 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 index 0bc02043de..9d45daabec 100644 --- 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 @@ -15,24 +15,24 @@ type BookMinimal record {| const csvFilePath = "./files/csv_file.csv"; -public function main() returns io:Error? { +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 csvStream = check io:fileReadBlocksAsStream(csvFilePath); + stream bookStream = check io:fileReadBlocksAsStream(csvFilePath); // Parse as CSV byte stream to an array of records. - Book[]|csv:Error bookStream = csv:parseStream(csvStream); - io:println(bookStream); + Book[] bookArray = check csv:parseStream(bookStream); + io:println(bookArray); - stream csvStream2 = check io:fileReadBlocksAsStream(csvFilePath); + 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[]|csv:Error briefBookStream = csv:parseStream(csvStream2); - io:println(briefBookStream); + BookMinimal[] briefBookArray = check csv:parseStream(bookStream); + io:println(briefBookArray); } 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 index 1ff76aa976..88daca8c8e 100644 --- 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 @@ -1,2 +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 +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 From 17d96ce2322d8a347cba3b4dc050c91bc80f35b8 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Fri, 27 Sep 2024 09:47:52 +0530 Subject: [PATCH 4/4] Add csv string to records bbe --- examples/index.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/index.json b/examples/index.json index f64e044de2..1fcc8082ca 100644 --- a/examples/index.json +++ b/examples/index.json @@ -4738,6 +4738,13 @@ "column": 3, "category": "Common libraries", "samples": [ + { + "name": "Convert CSV string to records", + "url": "csv-string-to-record-array", + "verifyBuild": true, + "verifyOutput": true, + "isLearnByExample": true + }, { "name": "Parse CSV byte streams to records", "url": "csv-streams-to-record-array",