Skip to content

Commit

Permalink
#62 Added cli tool to export data in a csv format (#85)
Browse files Browse the repository at this point in the history
* #62 Added cli tool to export data in a csv format

* CR fixes
  • Loading branch information
klangner authored Apr 19, 2024
1 parent b1678ea commit 98b4a1e
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
6 changes: 5 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ rust-version = "1.70"

[dependencies]
anyhow = { version = "1.0", optional = true }
arrow = { version = "51", features = ["prettyprint"] }
arrow = { version = "51", features = ["prettyprint", "chrono-tz"] }
bytes = "1.4"
chrono = { version = "0.4.37", default-features = false, features = ["std"] }
chrono-tz = "0.8.6"
Expand Down Expand Up @@ -72,6 +72,10 @@ path = "./examples/datafusion_integration.rs"
name = "orc-metadata"
required-features = ["cli"]

[[bin]]
name = "orc-export"
required-features = ["cli"]

[[bin]]
name = "orc-stats"
required-features = ["cli"]
42 changes: 42 additions & 0 deletions src/bin/orc-export.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
use std::{fs::File, io, path::PathBuf};

use anyhow::Result;
use arrow::csv;
use clap::Parser;
use orc_rust::ArrowReaderBuilder;

#[derive(Parser)]
#[command(name = "orc-export")]
#[command(version, about = "Export data from orc file to csv", long_about = None)]
struct Cli {
/// Path to the orc file
file: PathBuf,
/// Output file. If not provided output will be printed on console
#[arg(short, long)]
output: Option<PathBuf>,
// TODO: head=N
// TODO: convert_dates
// TODO: format=[csv|json]
// TODO: columns="col1,col2"
}

fn main() -> Result<()> {
let cli = Cli::parse();
let f = File::open(&cli.file)?;
let output_writer: Box<dyn io::Write> = if let Some(output) = cli.output {
Box::new(File::create(output)?)
} else {
Box::new(io::stdout())
};

let reader = ArrowReaderBuilder::try_new(f)?.build();
let mut writer = csv::WriterBuilder::new()
.with_header(true)
.build(output_writer);

for batch in reader.flatten() {
writer.write(&batch)?;
}

Ok(())
}

0 comments on commit 98b4a1e

Please sign in to comment.