Searching...
jueves, 8 de junio de 2023

Subida recursiva de archivos CSV en un directorio local a S3

Vamos a crear un trait CsvUploader que se encarga de la lógica de subir archivos CSV a S3 utilizando la AWS CLI. El método uploadCsvFiles recibe la ruta del directorio local donde se encuentran los archivos CSV, el nombre del bucket en S3 y el prefijo de ruta en S3 para los archivos. Luego, se itera sobre los archivos CSV dentro del directorio y se ejecuta el comando de subida utilizando la AWS CLI.

La clase S3BatchUpload utiliza el trait CsvUploader para subir todos los archivos CSV dentro de un directorio específico a S3. Simplemente se especifica la ruta del directorio local, el nombre del bucket en S3 y el prefijo de ruta en S3, y se llama al método uploadCsvFiles para realizar la subida.

Para que la estructura de directorios se mantenga en el bucket de destino se construye la clave s3Key en función de la estructura de directorios local. Se utiliza substring para obtener la parte de la ruta después del directorio base, y luego se reemplaza el separador de archivos local (File.separator) por el separador de rutas en S3 ("/"). De esta manera, se mantendrá la misma estructura de directorios en el bucket de destino.

import java.io.File

import sys.process._


trait AwsCliExecutor {

  protected def executeCommand(command: String): Int = command.!

}


trait CsvUploader extends AwsCliExecutor {

  def uploadCsvFiles(directoryPath: String, bucketName: String, s3KeyPrefix: String): Unit = {

    val directory = new File(directoryPath)

    val csvFiles = directory.listFiles(_.getName.toLowerCase.endsWith(".csv"))


    csvFiles.foreach { file =>

      val localFilePath = file.getAbsolutePath

      val s3Key = s3KeyPrefix + localFilePath.substring(directoryPath.length).replace(File.separator, "/")

      val uploadCommand = s"aws s3 cp $localFilePath s3://$bucketName/$s3Key"

      val result = executeCommand(uploadCommand)


      if (result == 0) {

        println(s"Archivo ${file.getName} subido exitosamente a S3 con ruta $s3Key.")

      } else {

        println(s"Ocurrió un error al subir el archivo ${file.getName} a S3.")

      }

    }

  }

}


object S3BatchUpload extends App with CsvUploader {

  val localDirectoryPath = "/path/to/your/local/directory"  // Ruta del directorio local con los archivos CSV

  val bucketName = "your-bucket-name"  // Nombre del bucket en S3

  val s3KeyPrefix = "path/to/upload"  // Prefijo de ruta en S3 para los archivos


  uploadCsvFiles(localDirectoryPath, bucketName, s3KeyPrefix)

}

0 comentarios:

Publicar un comentario

Gracias por participar en esta página.

 
Back to top!