Skip to content

Commit 744cb73

Browse files
committed
Add option --out-delimiter to optionally change the output's delimiter
1 parent 70e97dc commit 744cb73

File tree

2 files changed

+48
-5
lines changed

2 files changed

+48
-5
lines changed

Diff for: src/main.rs

+24-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ struct Config {
1111
pub exec: String,
1212
pub no_headers: bool,
1313
pub delimiter: String,
14+
pub out_delimiter: Option<String>,
1415
pub quote: String,
1516
pub arg_regex: String,
1617
pub new_column_name: String,
@@ -61,6 +62,13 @@ fn main() -> Result<()> {
6162
.help("CSV delimiter (\\t for tabs)")
6263
.takes_value(true),
6364
)
65+
.arg(
66+
Arg::with_name("out-delimiter")
67+
.long("out-delimiter")
68+
.value_name("CHAR")
69+
.help("Output CSV delimiter, if different from delimiter (\\t for tabs)")
70+
.takes_value(true),
71+
)
6472
.arg(
6573
Arg::with_name("quote")
6674
.long("quote")
@@ -108,6 +116,7 @@ Syntax: https://docs.rs/regex/1.3.4/regex/index.html#syntax
108116
.value_of("delimiter")
109117
.map(String::from)
110118
.unwrap_or_else(String::new),
119+
out_delimiter: matches.value_of("out-delimiter").map(String::from),
111120
quote: matches
112121
.value_of("quote")
113122
.map(String::from)
@@ -154,12 +163,22 @@ fn run(config: Config) -> Result<()> {
154163
}
155164
};
156165

157-
let delimiter: u8 = if &config.delimiter == r"\t" {
158-
b'\t'
159-
} else {
160-
read_one_ascii_char(&config.delimiter)?
166+
let read_delimiter = |value: &str| -> Result<u8> {
167+
if value == r"\t" {
168+
Ok(b'\t')
169+
} else {
170+
read_one_ascii_char(value)
171+
}
161172
};
162173

174+
let delimiter: u8 = read_delimiter(&config.delimiter)?;
175+
176+
let out_delimiter: u8 = config
177+
.out_delimiter
178+
.map(|d| read_delimiter(&d))
179+
.transpose()?
180+
.unwrap_or(delimiter);
181+
163182
let quote: u8 = read_one_ascii_char(&config.quote)?;
164183

165184
let variable_regex = Regex::new(&config.arg_regex)?;
@@ -173,7 +192,7 @@ fn run(config: Config) -> Result<()> {
173192
.from_reader(reader);
174193

175194
let mut csv_writer = csv::WriterBuilder::new()
176-
.delimiter(delimiter)
195+
.delimiter(out_delimiter)
177196
.quote(quote)
178197
.from_writer(writer);
179198

Diff for: tests/cli_tests.rs

+24
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,30 @@ Id\tDir\tResult
103103
.stdout(expected_output);
104104
}
105105

106+
#[test]
107+
fn test_out_delimiter() {
108+
let input = "
109+
Id\tDir
110+
24\texample.com/a
111+
68\texample.com/b
112+
"
113+
.trim_start();
114+
115+
let expected_output = r#"
116+
Id;Dir;Result
117+
24;example.com/a;example.com/a/24
118+
68;example.com/b;example.com/b/68
119+
"#
120+
.trim_start();
121+
122+
Command::cargo_bin("csv-exec")
123+
.unwrap()
124+
.args(&["echo $2/$1", "-d", "\\t", "--out-delimiter", ";"])
125+
.write_stdin(input)
126+
.assert()
127+
.stdout(expected_output);
128+
}
129+
106130
#[test]
107131
fn test_no_headers() {
108132
let input = r#"

0 commit comments

Comments
 (0)