From 20bdb887d18be15d370154563e797d00183d2c2b Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Sat, 4 Jul 2026 23:10:38 +0100 Subject: [PATCH 1/5] Map text to csv --- r/R/dataset-write.R | 5 ++++- r/tests/testthat/test-dataset-write.R | 25 ++++++++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/r/R/dataset-write.R b/r/R/dataset-write.R index 2e8ead94c7d8..08f275c9b0a0 100644 --- a/r/R/dataset-write.R +++ b/r/R/dataset-write.R @@ -151,6 +151,9 @@ write_dataset <- function( if (format %in% c("feather", "ipc")) { format <- "arrow" } + if (format == "text") { + format <- "csv" + } if (inherits(dataset, "arrow_dplyr_query")) { # partitioning vars need to be in the `select` schema dataset <- ensure_group_vars(dataset) @@ -194,7 +197,7 @@ write_dataset <- function( path_and_fs <- get_path_and_filesystem(path) dots <- list(...) - if (format %in% c("txt", "text") && !any(c("delimiter", "delim") %in% names(dots))) { + if (format == "txt" && !any(c("delimiter", "delim") %in% names(dots))) { stop("A delimiter must be given for a txt format.") } if (format == "tsv" && any(c("delimiter", "delim") %in% names(dots))) { diff --git a/r/tests/testthat/test-dataset-write.R b/r/tests/testthat/test-dataset-write.R index edb759e971a6..aa309d7f3181 100644 --- a/r/tests/testthat/test-dataset-write.R +++ b/r/tests/testthat/test-dataset-write.R @@ -919,11 +919,6 @@ test_that("Writing a flat file dataset without a delimiter throws an error.", { write_dataset(df, dst_dir, format = "txt"), "A delimiter must be given for a txt format." ) - - expect_error( - write_dataset(df, dst_dir, format = "text"), - "A delimiter must be given for a txt format." - ) }) test_that("Dataset can write flat files using readr::write_csv() options.", { @@ -1054,3 +1049,23 @@ test_that("Row order is preserved when writing large parquet dataset", { # But ordered is exactly equal. expect_equal(ordered_ds$x, df$x) }) + +test_that("write_dataset maps format 'text' to 'csv' (GH-38217)", { + df <- tibble( + int = 1:10, + dbl = as.numeric(1:10), + chr = letters[1:10], + ) + + dst_dir <- make_temp_dir() + write_dataset(df, dst_dir, format = "text") + expect_true(dir.exists(dst_dir)) + + # Files should have .csv extension, not .text + written_files <- list.files(dst_dir) + expect_match(written_files, "\\.csv$") + + # Data should round-trip correctly + result <- open_dataset(dst_dir, format = "csv") |> collect() + expect_equal(result, df) +}) From 08218e30dbbccec17aba40378f74b65ef0d21ae7 Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Tue, 18 Aug 2026 14:48:08 +0100 Subject: [PATCH 2/5] Add test --- r/tests/testthat/test-dataset-write.R | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/r/tests/testthat/test-dataset-write.R b/r/tests/testthat/test-dataset-write.R index aa309d7f3181..5a95750520af 100644 --- a/r/tests/testthat/test-dataset-write.R +++ b/r/tests/testthat/test-dataset-write.R @@ -1051,21 +1051,11 @@ test_that("Row order is preserved when writing large parquet dataset", { }) test_that("write_dataset maps format 'text' to 'csv' (GH-38217)", { - df <- tibble( - int = 1:10, - dbl = as.numeric(1:10), - chr = letters[1:10], - ) + df <- example_data[c("int", "dbl", "chr")] dst_dir <- make_temp_dir() write_dataset(df, dst_dir, format = "text") - expect_true(dir.exists(dst_dir)) - - # Files should have .csv extension, not .text - written_files <- list.files(dst_dir) - expect_match(written_files, "\\.csv$") - # Data should round-trip correctly - result <- open_dataset(dst_dir, format = "csv") |> collect() - expect_equal(result, df) + expect_identical(dir(dst_dir), "part-0.csv") + expect_equal(open_dataset(dst_dir, format = "csv") |> collect(), df) }) From ccc04926036f76b0f19e9c3c3b4599d6e051d75e Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Tue, 25 Aug 2026 11:42:06 +0100 Subject: [PATCH 3/5] Delete extraneous test --- r/tests/testthat/test-dataset-write.R | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/r/tests/testthat/test-dataset-write.R b/r/tests/testthat/test-dataset-write.R index 5a95750520af..8ead514dccc6 100644 --- a/r/tests/testthat/test-dataset-write.R +++ b/r/tests/testthat/test-dataset-write.R @@ -1049,13 +1049,3 @@ test_that("Row order is preserved when writing large parquet dataset", { # But ordered is exactly equal. expect_equal(ordered_ds$x, df$x) }) - -test_that("write_dataset maps format 'text' to 'csv' (GH-38217)", { - df <- example_data[c("int", "dbl", "chr")] - - dst_dir <- make_temp_dir() - write_dataset(df, dst_dir, format = "text") - - expect_identical(dir(dst_dir), "part-0.csv") - expect_equal(open_dataset(dst_dir, format = "csv") |> collect(), df) -}) From 10338ee727449d42c494710e280d39dbea770a1a Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Fri, 4 Sep 2026 11:26:10 +0100 Subject: [PATCH 4/5] Add test --- r/tests/testthat/test-dataset-write.R | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/r/tests/testthat/test-dataset-write.R b/r/tests/testthat/test-dataset-write.R index 8ead514dccc6..5f762e55b4a7 100644 --- a/r/tests/testthat/test-dataset-write.R +++ b/r/tests/testthat/test-dataset-write.R @@ -1049,3 +1049,13 @@ test_that("Row order is preserved when writing large parquet dataset", { # But ordered is exactly equal. expect_equal(ordered_ds$x, df$x) }) + +test_that("write_dataset maps format 'text' to 'csv' (GH-38217)", { + df <- tibble(int = 1:10, dbl = as.numeric(1:10), chr = letters[1:10]) + + dst_dir <- make_temp_dir() + write_dataset(df, dst_dir, format = "text") + + expect_identical(dir(dst_dir), "part-0.csv") + expect_equal(open_dataset(dst_dir, format = "csv") |> collect(), df) +}) From 71a29324ef891f164b8ac3ef163eaa4000ed15c5 Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Sun, 4 Oct 2026 23:18:54 +0100 Subject: [PATCH 5/5] Deprecated "txt" --- r/R/dataset-format.R | 12 ++++++--- r/R/dataset-write.R | 12 +++++---- r/tests/testthat/test-dataset-csv.R | 8 ++++++ r/tests/testthat/test-dataset-write.R | 36 ++++++++++++++++----------- 4 files changed, 45 insertions(+), 23 deletions(-) diff --git a/r/R/dataset-format.R b/r/R/dataset-format.R index 934443009302..6b76887dbe7a 100644 --- a/r/R/dataset-format.R +++ b/r/R/dataset-format.R @@ -78,7 +78,13 @@ FileFormat <- R6Class( FileFormat$create <- function(format, schema = NULL, partitioning = NULL, ...) { opt_names <- names(list(...)) - if (format %in% c("csv", "text", "txt") || any(opt_names %in% c("delim", "delimiter"))) { + if (format == "txt") { + .Deprecated( + msg = '`format = "txt"` is deprecated; use `format = "csv"` instead.' + ) + format <- "csv" + } + if (format %in% c("csv", "text") || any(opt_names %in% c("delim", "delimiter"))) { CsvFileFormat$create(schema = schema, partitioning = partitioning, ...) } else if (format == "tsv") { # This delimiter argument is ignored. @@ -691,7 +697,7 @@ FileWriteOptions <- R6Class( "codec", "null_fallback" ) - } else if (format %in% c("csv", "tsv", "txt", "text")) { + } else if (format %in% c("csv", "tsv", "text")) { supported_args <- c( names(formals(csv_write_options)), names(formals(readr_to_csv_write_options)) @@ -747,7 +753,7 @@ FileWriteOptions <- R6Class( get_ipc_metadata_version(args$metadata_version) ) } - } else if (self$type %in% c("csv", "tsv", "txt", "text")) { + } else if (self$type %in% c("csv", "tsv", "text")) { arrow_opts <- names(formals(csv_write_options)) readr_opts <- names(formals(readr_to_csv_write_options)) readr_only_opts <- setdiff(readr_opts, arrow_opts) diff --git a/r/R/dataset-write.R b/r/R/dataset-write.R index 08f275c9b0a0..0041e3b5c081 100644 --- a/r/R/dataset-write.R +++ b/r/R/dataset-write.R @@ -148,10 +148,15 @@ write_dataset <- function( msg = '`format = "feather"` is deprecated; use `format = "ipc"` instead.' ) } + if (format == "txt") { + .Deprecated( + msg = '`format = "txt"` is deprecated; use `format = "csv"` instead.' + ) + } if (format %in% c("feather", "ipc")) { format <- "arrow" } - if (format == "text") { + if (format %in% c("text", "txt")) { format <- "csv" } if (inherits(dataset, "arrow_dplyr_query")) { @@ -197,9 +202,6 @@ write_dataset <- function( path_and_fs <- get_path_and_filesystem(path) dots <- list(...) - if (format == "txt" && !any(c("delimiter", "delim") %in% names(dots))) { - stop("A delimiter must be given for a txt format.") - } if (format == "tsv" && any(c("delimiter", "delim") %in% names(dots))) { stop("Can't set a delimiter for the tsv format.") } @@ -319,7 +321,7 @@ write_delim_dataset <- function( write_dataset( dataset = dataset, path = path, - format = "txt", + format = "text", partitioning = partitioning, basename_template = basename_template, hive_style = hive_style, diff --git a/r/tests/testthat/test-dataset-csv.R b/r/tests/testthat/test-dataset-csv.R index 83fe4f647540..a1ef714a464e 100644 --- a/r/tests/testthat/test-dataset-csv.R +++ b/r/tests/testthat/test-dataset-csv.R @@ -736,3 +736,11 @@ test_that("more informative error when column inferred as null due to sparse dat "column type being inferred as" ) }) + +test_that("FileFormat$create(format = 'txt') is deprecated and maps to csv", { + expect_warning( + fmt <- FileFormat$create("txt"), + "deprecated" + ) + expect_r6_class(fmt, "CsvFileFormat") +}) diff --git a/r/tests/testthat/test-dataset-write.R b/r/tests/testthat/test-dataset-write.R index 5f762e55b4a7..bf34b82fbab4 100644 --- a/r/tests/testthat/test-dataset-write.R +++ b/r/tests/testthat/test-dataset-write.R @@ -906,21 +906,6 @@ test_that("max_rows_per_group is adjusted if at odds with max_rows_per_file in w ) }) -test_that("Writing a flat file dataset without a delimiter throws an error.", { - df <- tibble( - int = 1:10, - dbl = as.numeric(1:10), - lgl = rep(c(TRUE, FALSE, NA, TRUE, FALSE), 2), - chr = letters[1:10], - ) - - dst_dir <- make_temp_dir() - expect_error( - write_dataset(df, dst_dir, format = "txt"), - "A delimiter must be given for a txt format." - ) -}) - test_that("Dataset can write flat files using readr::write_csv() options.", { df <- tibble( int = 1:10, @@ -1059,3 +1044,24 @@ test_that("write_dataset maps format 'text' to 'csv' (GH-38217)", { expect_identical(dir(dst_dir), "part-0.csv") expect_equal(open_dataset(dst_dir, format = "csv") |> collect(), df) }) + +test_that("write_dataset format = 'txt' is deprecated and maps to 'csv'", { + df <- tibble(int = 1:10, dbl = as.numeric(1:10), chr = letters[1:10]) + + dst_dir <- make_temp_dir() + expect_warning( + write_dataset(df, dst_dir, format = "txt"), + "deprecated" + ) + + expect_identical(dir(dst_dir), "part-0.csv") + expect_equal(open_dataset(dst_dir, format = "csv") |> collect(), df) + + # A delimiter passed alongside "txt" still reaches the writer + dst_dir2 <- make_temp_dir() + expect_warning( + write_dataset(df, dst_dir2, format = "txt", delimiter = ";"), + "deprecated" + ) + expect_equal(open_dataset(dst_dir2, format = "csv", delimiter = ";") |> collect(), df) +})