Purr-fectly parse your CSV files with delightful simplicity!
Parse CSV files in MoonBit with a small, focused API.
///|
test "readme/quick_start" {
let data =
#|Name,Age,Favorite Toy
#|Mittens,3,Ball of yarn
#|Whiskers,5,Laser pointer
#|
let csv = CSV::parse_string(data)
let (rows, columns) = csv.shape()
assert_eq(rows, 2)
assert_eq(columns, 3)
assert_eq(csv.header()[0], "Name")
assert_eq(csv.header()[2], "Favorite Toy")
assert_eq(csv.data()[0][0], "Mittens")
assert_eq(csv.data()[1][2], "Laser pointer")
}///|
test "readme/custom_options" {
let data =
#|Name;Description;Adopted
#|Simba;"Playful orange tabby
#|Loves treats";Yes
#|
let csv = CSV::parse_string(data, options={
delimiter: ';',
allow_newlines_in_quotes: true,
quote_char: '"',
skip_empty_lines: true,
trim_spaces: true,
})
assert_eq(csv.header()[0], "Name")
assert_eq(csv.header()[1], "Description")
assert_eq(csv.data()[0][0], "Simba")
let description =
#|Playful orange tabby
#|Loves treats
assert_eq(csv.data()[0][1], description)
assert_eq(csv.data()[0][2], "Yes")
}///|
test "readme/create_from_array" {
let data : Array[Array[String]] = [
["Name", "Age"],
["Luna", "2"],
["Oliver", "1"],
]
let csv = CSV::from_array(data)
assert_eq(csv.header().length(), 2)
assert_eq(csv.data().length(), 2)
assert_eq(csv.header()[0], "Name")
assert_eq(csv.data()[0][0], "Luna")
let expected =
#|Name,Age
#|Luna,2
#|Oliver,1
#|
assert_eq(csv.to_string(), expected)
}///|
test "readme/array_input" {
let shelter_data : Array[Array[String]] = [
["Name", "Age", "Color", "Adopted"],
["Luna", "2", "Black", "Yes"],
["Oliver", "1", "Tabby", "No"],
["Bella", "4", "Calico", "Yes"],
]
let csv = CSV::from_array(shelter_data)
let (rows, columns) = csv.shape()
assert_eq(rows, 3)
assert_eq(columns, 4)
assert_eq(csv.data()[2][0], "Bella")
assert_eq(csv.data()[2][3], "Yes")
}///|
test "readme/generated_headers" {
let data : Array[Array[String]] = [
["Alice", "30", "Wonderland"],
["Bob", "25", "Builderland"],
]
let csv = CSV::from_array(data, has_header=false, generate_headers=true)
assert_eq(csv.header()[0], "column1")
assert_eq(csv.header()[1], "column2")
assert_eq(csv.header()[2], "column3")
assert_eq(csv.data()[1][0], "Bob")
}///|
test "readme/formatted_table_output" {
let data =
#|Breed,Origin,Size,Temperament
#|Siamese,Thailand,Medium,"Vocal, Active"
#|Maine Coon,USA,Large,"Gentle, Playful"
#|Ragdoll,USA,Large,"Calm, Affectionate"
#|
let csv = CSV::parse_string(data)
let logger = @buffer.new()
csv.output(logger)
let table = logger.contents().to_unchecked_string()
assert_true(table.contains("Breed"))
assert_true(table.contains("Maine Coon"))
assert_true(table.contains("Gentle, Playful"))
}///|
test "readme/multiline_fields" {
let data =
#|Name,Bio
#|Lucy,"Lucy is curious.
#|She loves exploring."
#|Max,"Max is quiet.
#|He sleeps often."
#|
let csv = CSV::parse_string(data)
assert_eq(csv.header()[1], "Bio")
let lucy_bio =
#|Lucy is curious.
#|She loves exploring.
let max_bio =
#|Max is quiet.
#|He sleeps often.
assert_eq(csv.data()[0][1], lucy_bio)
assert_eq(csv.data()[1][1], max_bio)
}type CSVpub(all) struct CSVOptions {
delimiter : Char
allow_newlines_in_quotes : Bool
quote_char : Char
skip_empty_lines : Bool
trim_spaces : Bool
}Purr-fectly parse your CSV files with delightful simplicity!