# A CSV document representation.
class CsvDocument
- super Streamable
+ super Writable
# The format to use.
#
# * `has_header`: Is the first row the header?
# * `skip_empty`: Do we skip the empty lines?
# For details, see `CsvReader.skip_empty`.
- fun load_from(stream: IStream, has_header: Bool, skip_empty: Bool) do
+ fun load_from(stream: Reader, has_header: Bool, skip_empty: Bool) do
var reader = new CsvReader.with_format(stream, format)
reader.skip_empty = skip_empty
if has_header then
# * `has_header`: Is the first row the header?
# * `skip_empty`: Do we skip the empty lines?
fun load(path: String, has_header: Bool, skip_empty: Bool) do
- var istream = new IFStream.open(path)
+ var istream = new FileReader.open(path)
load_from(istream, has_header, skip_empty)
istream.close
end
# delimiters by some parsers.
#
# ~~~nit
-# var out = new StringOStream
+# var out = new StringWriter
# var writer = new CsvWriter(out)
# writer.write_row(1, 2.0, "foo\nbar")
# writer.write_sequence([""])
class CsvWriter
# The output stream.
- var ostream: OStream
+ var ostream: Writer
# The format to use.
#
var always_escape = false is writable
# Create a new writer with the specified format.
- init with_format(ostream:OStream, format: CsvFormat) do
+ init with_format(ostream:Writer, format: CsvFormat) do
self.ostream = ostream
self.format = format
end
# By default, uses the format recommended by RFC 4180 (see `rfc4180`).
#
# ~~~nit
-# var example = new StringIStream("""
+# var example = new StringReader("""
# foo,bar\r
# "Hello, word!",1234.5 + 42\r
# "Something\r
super Iterator[Array[String]]
# The input stream.
- var istream: IStream
+ var istream: Reader
# The format to use.
#
private var started = false
# Create a new reader with the specified format.
- init with_format(istream:IStream, format: CsvFormat) do
+ init with_format(istream:Reader, format: CsvFormat) do
self.istream = istream
self.format = format
end
var got_delimiter = false
loop
- var i = istream.read_char
- var c: Char
+ var c = istream.read_char
- if i < 0 then
+ if c == null then
if got_row then
row.add value.to_s
return row
return null
end
end
- c = i.ascii
if c == format.delimiter then
if got_delimiter and unescaped == 0 then
end
# Read all bytes until the delimiter.
loop
- i = istream.read_char
- assert not_eof: i >= 0 else
+ c = istream.read_char
+ assert not_eof: c != null else
sys.stderr.write "Unexpected end of file before the end of a delimited value.\n"
end
- c = i.ascii
if c == format.delimiter then break
value.add c
end