Files
c3c/lib/std/encoding/csv.c3
2023-07-19 02:46:43 +02:00

65 lines
1.1 KiB
C

module std::encoding::csv;
import std::io;
struct CsvReader
{
Stream stream;
String separator;
}
fn void CsvReader.init_file(&self, File* file, String separator = ",")
{
self.stream = file.as_stream();
self.separator = separator;
}
fn void CsvReader.init(&self, Stream stream, String separator = ",")
{
self.stream = stream;
self.separator = separator;
}
fn String[]! CsvReader.read_row(self, Allocator* using = mem::heap())
{
@pool()
{
return self.stream.treadline().split(self.separator, .using = using);
};
}
fn String[]! CsvReader.tread_row(self)
{
return self.read_row(mem::temp()) @inline;
}
fn void! CsvReader.skip_row(self) @maydiscard
{
@pool()
{
self.stream.readline(mem::temp())!;
};
}
macro CsvReader.@each_row(self, int rows = int.max; @body(String[] row))
{
Stream stream = self.stream;
String sep = self.separator;
while (rows--)
{
@stack_mem(512; Allocator* mem)
{
String[] parts;
@pool()
{
String! s = stream.readline(mem::temp());
if (catch err = s)
{
if (err == IoError.EOF) return;
return err?;
}
parts = s.split(sep, .using = mem);
};
@body(parts);
};
}
}