Un wizard conversor de archivos de CSV 🧙
Documentación
.
Reportar Bugs
.
Solicitar features
- Tabla de contenidos
- Sobre el proyecto
- Diagrama de clases (UML)
- Construido con
- Para empezar
- Roadmap del proyecto
- To-Do List
- Contribuciones
- Licencia
- Autor
- Otros Recursos que usé
El proyecto apunta a ser una forma sencilla de convertir archivos CSV a otros formatos, como JSON (Actualmente el único formato disponible).
Se intenta mantener el dinamismo y la versatilidad, utilizando un sistema de parseo que cambia dinámicamente según los datos que se le pasen.
También posee un ApiController via HttpClient que se encarga de manejar las peticiones al servidor (por si se requiere consumir una API con los datos parseados), y un sistema de logs que se encarga de registrar los errores y las acciones que se realizan en el programa.
El proyecto está en constante desarrollo, por lo que se irán agregando funcionalidades y mejorando el código con el pasar del tiempo. Mientras tanto, sientanse libres de utilzarlo, armarlo y desarmarlo a gusto! 😄
Recientemente realicé una refactorización completa al código de Convertrail. Como ahora está estructurado, decidí agregarle un diagrama como corresponde, para facilitar así su comprensión.
(Por si no se ve correctamente: Está programado en Mermaid🧜♀️ así que debería de verse integrado a la perfección en este Readme. De no ser así, pueden copiar el código y pegarlo en el siguiente editor online)
classDiagram
class FileConverter {
<<Interface>>
+convert(data: R): T
}
class CSVFileConverter {
-convert(data: R): T
}
class JSONFileConverter {
-convert(data: R): T
}
class CSVToJSONAdapter {
-csvConverter: CSVFileConverter
-jsonConverter: JSONFileConverter
+CSVToJSONAdapter()
+convertCSVToJson(csvFile: File, jsonFilePath: String, jsonFileName: String): void
}
CSVFileConverter --|> FileConverter : implements
JSONFileConverter --|> FileConverter : implements
CSVToJSONAdapter --|> FileConverter : uses
class CSVInputStrategy {
<<Interface>>
+readCSV() : File
}
class CSVInputConext {
-strategy: CSVInputStrategy
+CSVInputConext(strategy: CSVInputStrategy)
+getCSV(): File
}
class FileCSVInputStrategy {
-readCSV(): File
}
FileCSVInputStrategy --|> CSVInputStrategy : implements
CSVInputConext --|> CSVInputStrategy : defines
Por el momento, presenta dos estructuras base; Una para el input de los CSV (Dentro del paquete "input"), y otra para la conversión de los mismos (Dentro del paquete "conversion").
El paquete "conversion" se aferra al Patrón de diseño estructural "Adapter", que es la opción que elegí (y la más viable) para escalabilidad del mismo respecto a los tipos de archivos y sus formatos de salida.
Siguiendo el mismo enfoque, apliqué un Patrón de comportamiento Strategy en el paquete "input", para facilitar el ingreso de archivos CSV, pudiendo definir distintas estrategias de operación para distintos tipos de ingreso de datos.
Este proyecto fue construido con las siguientes herramientas:
- Java (Versión 17, aunque el código es compatible con versiones anteriores hasta Java 11)
- SpringBoot (Versión 3.1.1)
- Maven (Versión 4.0.0, para manejar dependencias como GSON, Jackson, OpenCsv, etc)
- OpenJDK (Versión 17, para compilar el código)
- VSCode (Como entorno de desarrollo, con todas las extensiones del pack de Java, las del pack de Spring y alguna que otra más) (NOTA: Hubo situaciones en las que VSCode rompía el proyecto al integrarlo en un Workspace. Lo sé, rarísimo. En esos casos para arreglarlo usé Eclipse IDE)
Si necesitan saber sobre alguna otra herramienta que se haya utilizado, pueden preguntar en los issues.
Estas son las instrucciones para correr el proyecto en tu computadora local (A modo de ejemplo, esto no quiere decir que sea la única forma de correrlo).
- Clonar el repositorio
git clone https://github.com/DanteZulli/quartz_scheduler.git
- Asegurarse de tener instalado correctamente instalado Java 17.
- Asegurarse de tener correctamente instalados todos los tools de OpenJDK 17 (O superior) y que estos se encuentren agregados al PATH (O que la ruta de acceso esté especificada en tu IDE).
openjdk version "17.0.7" 2023-04-18
OpenJDK Runtime Environment Temurin-17.0.7+7 (build 17.0.7+7)
OpenJDK 64-Bit Server VM Temurin-17.0.7+7 (build 17.0.7+7, mixed mode, sharing)
- Importar el proyecto en tu IDE favorito (En mi caso, VSCode).
- Crear una build del proyecto y correrlo.
- Java 17 (O superior)
- OpenJDK 17 (O superior)
- Maven 4.0.0 (O superior)
- VSCode (O cualquier otro IDE que soporte Java 17)
- Git (O cualquier otro software de control de versiones)
- Un poco de paciencia
En general, esta es la estructura del proyecto. Se intentará mantener/modificar con el pasar del desarrollo, desde yá pido disculpas si no se encuentra actualizada.
src/main/java/
└── ...convertrail/
├── api/
│ ├── setup/
| | └── Archivos de configuración de la API
│ └── Archivos generales de la API
|── input/
| └── Archivos para el manejo de archivos CSV
|── conversion/
| └── Archivos para la conversion de archivos CSV
└── ConvertrailApplication.java
csv_pruebas/
└── Archivos CSV varios a modo de pruebas/referencias
json_output/
└── Archivos JSON generados a partir de los
Podés revisar los open issues para ver una lista de las features propuestas (y los bugs conocidos).
- Migrar a REST el ApiController. (Actualmente es un simple HttpClient).
- Agregar soporte para otros formatos de archivos (XML, YAML, etc).
- Configurar correctamente el sistema de logs (Con log4j2).
- Crear algún tipo de interfaz gráfica para el usuario.
- Agregar soporte para archivos comprimidos (ZIP, RAR, etc).
- Agregar soporte para archivos encriptados (AES, RSA, etc).
- Agregar soporte para archivos de texto plano (TXT, DOC, etc).
- Desarrollar un sistema de tests para el proyecto (JUnit, Mockito, etc).
- Mejorar la estructura del proyecto (Separar en módulos, etc).
(Se aplicaron patrones de diseño Strategy y Adapter) - Sintetizar el código (Reducir la cantidad de líneas, etc).
Se redujo código redundante en gran parte de las clases - Estandarizar el código (Aplicar buenas prácticas, etc).
Se aplicaron patrones, y se re-designaron las responsabilidades de cada clase y método
Entre otras cosas que se irán agregando con el pasar del tiempo.
Las contribuciones son lo que hacen que la comunidad open source sea un lugar tan increíble para aprender, inspirarse y crear. Cualquier contribución que hagas es muy apreciada. :D
- Si tenes sugerencias para mejorar o modificar el proyecto, podés abrir un issue.
- Si queres contribuir directamente, podes hacer un fork del proyecto, crear una branch con tus cambios y luego hacer un pull request.
- Hacé un Fork del proyecto
- Creá tu propia branch (
git checkout -b feature/AmazingFeature
) - Hacé un commit con tus cambios (
git commit -m 'Add some AmazingFeature'
) - Hacé un push (
git push origin feature/AmazingFeature
) - Abrí un Pull Request
Distribuído bajo la licencia MIT. Ver LICENSE para más información
- Dante Zulli - Github - Todos mis proyectos
- Othneil Drew (Para el template del Readme)
- ImgShields (Para los badges)
- Dall-E (Para esos maguitos facheros)