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:
FelipeCN
2026-01-30 09:07:06 -03:00
commit 5148ad89ff
6 changed files with 2231 additions and 0 deletions
+92
View File
@@ -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(())
}