feat: add Pessoa struct and file processing for RPPSS records
- Implemented Pessoa struct with fields for CPF, name, and value. - Added functionality to read and parse a specific file format, skipping the first four lines. - Converted parsed records into JSON format and saved to output.json. - Included example search functionality for a specific CPF.
This commit is contained in:
+92
@@ -0,0 +1,92 @@
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::fs;
|
||||
use std::io::{self, BufRead};
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||
struct Pessoa {
|
||||
cpf: String,
|
||||
nome: String,
|
||||
valor: f64,
|
||||
}
|
||||
|
||||
impl Pessoa {
|
||||
fn from_line(line: &str) -> Option<Self> {
|
||||
let parts: Vec<&str> = line.split('|').collect();
|
||||
|
||||
// Verifica se a linha começa com RPPSS e tem pelo menos 4 campos
|
||||
if parts.len() >= 4 && parts[0] == "RPPSS" {
|
||||
let cpf = parts[1].to_string();
|
||||
let nome = parts[2].to_string();
|
||||
|
||||
// Converte o valor: os 2 últimos dígitos são decimais
|
||||
let valor_str = parts[3];
|
||||
let valor = if !valor_str.is_empty() {
|
||||
valor_str.parse::<f64>().unwrap_or(0.0) / 100.0
|
||||
} else {
|
||||
0.0
|
||||
};
|
||||
|
||||
return Some(Pessoa { cpf, nome, valor });
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn processar_arquivo(caminho: &str) -> io::Result<Vec<Pessoa>> {
|
||||
let conteudo = fs::read_to_string(caminho)?;
|
||||
let linhas: Vec<&str> = conteudo.lines().collect();
|
||||
|
||||
let mut pessoas = Vec::new();
|
||||
|
||||
// Pula as 4 primeiras linhas e processa o resto
|
||||
for linha in linhas.iter().skip(4) {
|
||||
if let Some(pessoa) = Pessoa::from_line(linha) {
|
||||
pessoas.push(pessoa);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(pessoas)
|
||||
}
|
||||
|
||||
fn main() -> io::Result<()> {
|
||||
let arquivo = "LfsIssDmed068325.txt";
|
||||
|
||||
println!("=== Processando arquivo {} ===\n", arquivo);
|
||||
|
||||
// Processa o arquivo
|
||||
let pessoas = processar_arquivo(arquivo)?;
|
||||
|
||||
println!("Total de registros encontrados: {}\n", pessoas.len());
|
||||
|
||||
// Exibe alguns objetos como exemplo
|
||||
println!("=== Primeiros 5 registros como objetos Rust ===");
|
||||
for (i, pessoa) in pessoas.iter().take(5).enumerate() {
|
||||
println!("{}. {:?}", i + 1, pessoa);
|
||||
}
|
||||
|
||||
println!("\n=== Convertendo para JSON ===");
|
||||
|
||||
// Converte para JSON (formatado)
|
||||
let json = serde_json::to_string_pretty(&pessoas)?;
|
||||
|
||||
// Exibe primeiros caracteres do JSON
|
||||
println!("JSON gerado ({} bytes):", json.len());
|
||||
println!("{}", &json.chars().take(1000).collect::<String>());
|
||||
println!("...");
|
||||
|
||||
// Salva o JSON em arquivo
|
||||
fs::write("output.json", &json)?;
|
||||
println!("\n✓ JSON salvo em output.json");
|
||||
|
||||
// Exemplo: buscar uma pessoa específica
|
||||
println!("\n=== Exemplo de busca ===");
|
||||
if let Some(pessoa) = pessoas.iter().find(|p| p.cpf == "00276808860") {
|
||||
println!("Pessoa encontrada:");
|
||||
println!(" CPF: {}", pessoa.cpf);
|
||||
println!(" Nome: {}", pessoa.nome);
|
||||
println!(" Valor: R$ {:.2}", pessoa.valor);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user