fix(csv): unwrap temporal force-text values

This commit is contained in:
zipg authored and GitHub committed 2026-09-12 09:27:30 +08:00
1 parent e43fd9c502
commit 058a67be0b
3 files changed
+135 -1

No files matched your search

+6
View File
@@ -4016,10 +4016,12 @@ fn has_numeric_leading_zero(value: &str) -> bool {
}
fn is_likely_date(value: &str) -> bool {
let value = crate::temporal_format::strip_csv_force_text_wrapper(value);
["%Y-%m-%d", "%Y/%m/%d"].iter().any(|format| NaiveDate::parse_from_str(value, format).is_ok())
}
fn is_likely_timestamp(value: &str) -> bool {
let value = crate::temporal_format::strip_csv_force_text_wrapper(value);
if DateTime::parse_from_rfc3339(value).is_ok() {
return true;
}
@@ -9481,6 +9483,10 @@ mod tests {
assert_eq!(xlsx_cell_value(&duration_cell), serde_json::json!("60:00:00"));
assert_eq!(infer_value_type(&date_value), Some(ImportInferredType::Timestamp));
assert_eq!(infer_value_type(&time_value), Some(ImportInferredType::Decimal));
assert_eq!(
infer_value_type(&serde_json::json!("=\"2026-06-24 02:00:07\"")),
Some(ImportInferredType::Timestamp)
);
}
#[test]
+14
View File
@@ -148,6 +148,7 @@ fn parse_epoch_temporal(value: &str) -> Option<NaiveDateTime> {
}
fn parse_temporal(value: &str, preferred_pattern: Option<&str>) -> Option<ParsedTemporal> {
let value = strip_csv_force_text_wrapper(value);
preferred_pattern
.filter(|pattern| !pattern.trim().is_empty())
.and_then(|pattern| parse_with_pattern(value, pattern))
@@ -224,6 +225,10 @@ fn active_temporal_pattern(pattern: Option<&str>) -> Option<&str> {
pattern.filter(|pattern| !pattern.trim().is_empty())
}
pub(crate) fn strip_csv_force_text_wrapper(value: &str) -> &str {
value.strip_prefix("=\"").and_then(|value| value.strip_suffix('"')).unwrap_or(value)
}
pub fn format_temporal_export_row_cow<'a>(
row: &'a [Value],
column_types: &[Option<String>],
@@ -633,6 +638,15 @@ mod tests {
);
}
#[test]
fn import_normalization_unwraps_csv_force_text_temporal_values() {
assert_eq!(
normalize_temporal_import_value(&json!("=\"2026-06-24 02:00:07\""), Some("DATETIME"), None),
json!("2026-06-24 02:00:07")
);
assert_eq!(normalize_temporal_import_value(&json!("=\"2026-06-24\""), Some("DATE"), None), json!("2026-06-24"));
}
#[test]
fn preserves_raw_export_values_when_pattern_requires_missing_fields() {
assert_eq!(