use std::io::{BufWriter, Write};
fn main() {
let mut args = std::env::args().skip(1);
let Some(path) = args.next() else {
eprintln!("用法: write_smiles <语料.smi> [--canonical]");
std::process::exit(2);
};
let canonical = args.any(|a| a == "--canonical");
let text = std::fs::read_to_string(&path).unwrap_or_else(|e| {
eprintln!("读不到 {path}: {e}");
std::process::exit(2);
});
let stdout = std::io::stdout();
let mut out = BufWriter::new(stdout.lock());
let (mut ok, mut failed) = (0usize, 0usize);
for line in text.lines() {
let smi = line.split_whitespace().next().unwrap_or("");
if smi.is_empty() || smi.starts_with('#') {
continue;
}
match omgkit_io::smiles::parse(smi) {
Ok(mol) => {
let w = if canonical {
omgkit_io::canon::canonical_smiles(&mol)
} else {
omgkit_io::smiles::write(&mol)
};
let _ = writeln!(out, "{smi}\t{}", w.smiles);
ok += 1;
}
Err(_) => failed += 1,
}
}
let _ = out.flush();
eprintln!("写出 {ok} 条,跳过(解析失败){failed} 条");
}