using System; using System.Collections.Generic; using System.IO; using System.Text; using NDbfReader; namespace S7Explorer.Parsers { public class DbfParser { // Lee campos específicos de un archivo DBF public static List> ReadDbfFile(string filePath, IEnumerable fieldNames) { var result = new List>(); if (!File.Exists(filePath)) throw new FileNotFoundException($"No se encontró el archivo DBF: {filePath}"); try { // Abrir tabla DBF con codificación específica using var stream = File.OpenRead(filePath); using var table = Table.Open(stream); // Crear lector usando la API correcta var reader = table.OpenReader(); while (reader.Read()) { var record = new Dictionary(); foreach (var fieldName in fieldNames) { // Obtener valor y convertir a string si no es null var value = reader.GetValue(fieldName); record[fieldName] = value?.ToString() ?? string.Empty; // Manejamos específicamente bytes para campos como "MC5CODE" // que pueden contener datos binarios codificados como CP1252 if (value is byte[] byteValue) { record[fieldName] = Encoding.GetEncoding(1252).GetString(byteValue); } } result.Add(record); } } catch (Exception ex) { throw new Exception($"Error al leer el archivo DBF {filePath}: {ex.Message}", ex); } return result; } // Convierte un string que representa un número a un entero opcional public static int? StringToInt(string value) { if (string.IsNullOrWhiteSpace(value)) return null; if (int.TryParse(value, out int result)) return result; return null; } // Convierte códigos Windows-1252 a UTF-8 para manejar caracteres especiales en STEP7 public static string ConvertCP1252ToUtf8(string input) { if (string.IsNullOrEmpty(input)) return string.Empty; byte[] bytes = Encoding.GetEncoding(1252).GetBytes(input); return Encoding.UTF8.GetString(bytes); } } }