445: allow null values in csv r=Kerollmops a=MarinPostma

This pr allows null values in csv:
- if the field is of type string, then an empty field is considered null (`,,`), anything other is turned into a string (i.e `, ,` is a single whitespace string)
- if the field is of type number, when the trimmed field is empty, we consider the value null (i.e `,,`, `, ,` are both null numbers) otherwise we try to parse the number.


Co-authored-by: ad hoc <postma.marin@protonmail.com>
This commit is contained in:
bors[bot] 2022-02-03 15:11:32 +00:00 committed by GitHub
commit 267d14c28d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -118,16 +118,26 @@ impl<W: io::Write + io::Seek> DocumentBatchBuilder<W> {
for (value, (fid, ty)) in record.into_iter().zip(headers.iter()) { for (value, (fid, ty)) in record.into_iter().zip(headers.iter()) {
let value = match ty { let value = match ty {
AllowedType::Number => { AllowedType::Number => {
value.parse::<f64>().map(Value::from).map_err(|error| { if value.trim().is_empty() {
Error::ParseFloat { Value::Null
error, } else {
// +1 for the header offset. value.trim().parse::<f64>().map(Value::from).map_err(|error| {
line: i + 1, Error::ParseFloat {
value: value.to_string(), error,
} // +1 for the header offset.
})? line: i + 1,
value: value.to_string(),
}
})?
}
}
AllowedType::String => {
if value.is_empty() {
Value::Null
} else {
Value::String(value.to_string())
}
} }
AllowedType::String => Value::String(value.to_string()),
}; };
this.value_buffer.clear(); this.value_buffer.clear();