1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use super::*;
pub fn replace_column(data: String, column: &str, replacement: &str)
-> Result<String, Error> {
let mut lines = data.lines();
let headers = lines.next().unwrap();
let columns: Vec<&str> = headers.split(',').collect();
let column_number = columns.iter().position(|&e| e == column);
let column_number = match column_number {
Some(column) => column,
None => Err("column name doesn’t exist in the input file")?
};
let mut result = String::with_capacity(data.capacity());
result.push_str(&columns.join(","));
result.push('\n');
for line in lines {
let mut records: Vec<&str> = line.split(',').collect();
records[column_number] = replacement;
result.push_str(&records.join(","));
result.push('\n');
}
Ok(result)
}
#[cfg(test)]
mod test {
use std::path::PathBuf;
use super::read::load_csv;
use super::{replace_column};
#[test]
fn test_valid_replace_column(){
let filename = PathBuf::from("./input/challenge.csv");
let csv_data = load_csv(filename).unwrap();
let modified_data = replace_column(csv_data, "City", "Beijing");
assert!(modified_data.is_ok());
}
#[test]
fn test_invalid_replace_column(){
let filename = PathBuf::from("./input/challenge.csv");
let csv_data = load_csv(filename).unwrap();
let modified_data = replace_column(csv_data, "City2", "Beijing");
assert!(modified_data.is_err());
}
}