feat: adiciona pré-visualização de arquivos CSV e XLSX na interface
This commit is contained in:
@@ -88,3 +88,39 @@ pub fn ler_csv(
|
||||
avisos,
|
||||
})
|
||||
}
|
||||
|
||||
/// Retorna as primeiras `n` linhas brutas do CSV (sem pular cabeçalho).
|
||||
/// Usado exclusivamente para pré-visualização na UI.
|
||||
pub fn preview_csv(
|
||||
caminho: &Path,
|
||||
delimitador: u8,
|
||||
encoding: &str,
|
||||
n: usize,
|
||||
) -> Result<Vec<Vec<String>>, ErroArquivo> {
|
||||
let bytes = std::fs::read(caminho)
|
||||
.map_err(|e| ErroArquivo::ErroLeitura(e.to_string()))?;
|
||||
|
||||
let conteudo = match encoding.to_lowercase().as_str() {
|
||||
"windows-1252" | "latin-1" | "iso-8859-1" => {
|
||||
let (decoded, _, _) = WINDOWS_1252.decode(&bytes);
|
||||
decoded.into_owned()
|
||||
}
|
||||
_ => String::from_utf8(bytes)
|
||||
.map_err(|e| ErroArquivo::ErroLeitura(format!("Encoding inválido: {}", e)))?,
|
||||
};
|
||||
|
||||
let mut reader = csv::ReaderBuilder::new()
|
||||
.delimiter(delimitador)
|
||||
.has_headers(false)
|
||||
.flexible(true)
|
||||
.from_reader(conteudo.as_bytes());
|
||||
|
||||
let linhas = reader
|
||||
.records()
|
||||
.take(n)
|
||||
.filter_map(|r| r.ok())
|
||||
.map(|r| r.iter().map(|s| s.to_string()).collect())
|
||||
.collect();
|
||||
|
||||
Ok(linhas)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user