Transformer les fichiers texte Europresse en CSV

T

Ce script R permet de convertir un fichier texte d’articles, issu du site Europresse et déjà formaté pour le logiciel IRaMuTeQ, en un fichier CSV (txtTOcsv). On fait donc un petit retour en arrière : on délaisse le format texte brut avec ses variables étoilées pour revenir à un encodage (mieux) structuré, où chaque variable est encodée dans une une colonne.

Lors de la création de mon script pour réaliser des AFC à partir de textes d’Europresse (déjà formatés pour IRaMuTeQ), j’ai rencontré le probleme d’exploiter directement le fichier texte… J’ai donc opté pour un format CSV, où les colonnes m’ont facilité la gestion des variables, ce format csv est à mon sens plus facile à manipuler pour le script d’analyse AFC avec Shiny.

Avant d’utiliser ce script, il est crucial de disposer d’un fichier texte structuré selon les spécifications du logiciel IRaMuTeQ, pour garantir la conversion. Votre fichier texte doit ressembler à quelque chose comme ça, rempli de jolies étoiles 😉 !

Pour exécuter votre script correctement, vous devez installer les librairies suivantes.
Voici une liste basée sur les commandes commentées et les bibliothèques utilisées dans votre script :

install.packages(c("shiny", "dplyr", "readr", "shinyFiles"))

shiny : pour créer et exécuter l’application Shiny.
dplyr : pour manipuler les données (utilisé pour les listes et les colonnes).
shinyFiles permet normalement la sélection de répertoires dans une application Shiny. Cependant, dans ce script, cette fonctionnalité a été remplacée par textInput, car des bugs ont été rencontrés lors de l’utilisation de l’interface de sélection du répertoire cible.

Une méthode simple et efficace pour contourner ce problème consiste à utiliser le terminal de votre Mac pour obtenir rapidement le chemin du répertoire cible. Il vous suffit de glisser-déposer votre répertoire dans la fenêtre du terminal : celui-ci affichera instantanément le chemin, que vous pourrez copier et coller directement dans l’interface Shiny.

Le code source

Le script s’exécute directement depuis RStudio. La prochaine étape consistera à développer un petit script complémentaire qui permettra de fusionner ou regrouper les articles en fonction d’une variable étoilée, comme le nom du journal, par exemple.

# Text to CSV
# www.codeandcortex.fr

#install.packages(c("shiny", "dplyr", "readr", "shinyFiles"))

# Charger les librairies nécessaires
library(shiny)
library(dplyr)

# Augmenter la taille limite d'upload (exemple : 10 Mo)
options(shiny.maxRequestSize = 10*1024^2)

# Interface utilisateur
ui <- fluidPage(
  titlePanel("Txt-To-CSV"),
  
  sidebarLayout(
    sidebarPanel(
      fileInput("file_txt", "Choisissez le fichier texte (.txt)", accept = c("text/plain")),
      textInput("directory", "Chemin du répertoire cible :", value = fs::path_home()),
      actionButton("process", "Transformer en CSV"),
      checkboxInput("preview", "Aperçu des données transformées", TRUE)
    ),
    
    mainPanel(
      tableOutput("data_preview"),
      textOutput("status")
    )
  )
)

# Fonction serveur
server <- function(input, output, session) {
  
  observeEvent(input$process, {
    req(input$file_txt, input$directory)
    
    # Lire le fichier texte
    texte <- tryCatch({
      readLines(input$file_txt$datapath, encoding = "UTF-8", warn = FALSE)
    }, warning = function(w) {
      message("Attention : Fichier avec une ligne incomplète.")
      readLines(input$file_txt$datapath, encoding = "UTF-8")
    })
    
    # Nettoyer les lignes
    texte <- trimws(texte)  # Supprimer les espaces inutiles
    texte <- texte[texte != ""]  # Supprimer les lignes vides
    
    if (length(texte) == 0) {
      output$status <- renderText({
        "Le fichier texte est vide ou mal formaté."
      })
      return(NULL)
    }
    
    # Initialiser des listes pour stocker les variables étoilées et les paragraphes associés
    variables_list <- list()
    paragraphes_list <- list()
    
    variables_temp <- NULL
    paragraphe_temp <- NULL
    
    # Parcourir le texte ligne par ligne
    for (i in 1:length(texte)) {
      ligne <- texte[i]
      
      # Si la ligne commence par '****', c'est une ligne de variables étoilées
      if (startsWith(ligne, "****")) {
        # Si un bloc de variables étoilées et paragraphe existe déjà, on l'ajoute aux listes
        if (!is.null(variables_temp) && !is.null(paragraphe_temp)) {
          variables_list <- append(variables_list, list(variables_temp))
          paragraphes_list <- append(paragraphes_list, list(paragraphe_temp))
        }
        # Retirer '****'
        variables_temp <- unlist(strsplit(sub("^\\*\\*\\*\\*", "", ligne), " "))
        paragraphe_temp <- NULL  # Réinitialiser le paragraphe temporaire
      } else {
        # Si c'est une ligne de texte, on l'ajoute au paragraphe en cours
        if (!is.null(variables_temp)) {
          paragraphe_temp <- if (is.null(paragraphe_temp)) {
            ligne
          } else {
            paste(paragraphe_temp, ligne)  # Fusionner les lignes de texte
          }
        }
      }
    }
    
    # Ajouter le dernier bloc
    if (!is.null(variables_temp) && !is.null(paragraphe_temp)) {
      variables_list <- append(variables_list, list(variables_temp))
      paragraphes_list <- append(paragraphes_list, list(paragraphe_temp))
    }
    
    # Déterminer le nombre maximal de variables étoilées pour définir les colonnes
    max_vars <- max(sapply(variables_list, length))
    
    # Créer un DataFrame avec autant de colonnes que nécessaire pour les variables
    variables_df <- do.call(rbind, lapply(variables_list, function(x) {
      length(x) <- max_vars  # Remplir avec des NA pour équilibrer le nombre de colonnes
      return(x)
    }))
    
    # Ajouter les paragraphes correspondants
    df <- data.frame(variables_df, Paragraphe = unlist(paragraphes_list), stringsAsFactors = FALSE)
    
    # Renommer les colonnes des variables pour plus de clarté
    colnames(df)[1:max_vars] <- paste0("Variable_", 1:max_vars)
    
    # Récupérer le chemin du répertoire cible
    dir_path <- input$directory
    
    if (!dir.exists(dir_path)) {
      output$status <- renderText({
        "Le répertoire cible n'existe pas. Veuillez vérifier le chemin."
      })
      return(NULL)
    }
    
    # Chemin complet pour sauvegarder le fichier CSV
    csv_path <- file.path(dir_path, "corpus_txtTOcsv.csv")
    write.csv(df, csv_path, row.names = FALSE)
    
    output$status <- renderText({
      paste("Fichier sauvegardé dans :", csv_path)
    })
    
    # Afficher un aperçu si demandé
    if (input$preview) {
      output$data_preview <- renderTable({
        head(df, 10)  # Afficher les 10 premières lignes du tableau fusionné
      })
    }
  })
}

# Lancer l'application Shiny
shinyApp(ui = ui, server = server)

 

 

A propos de l'auteur

Stéphane Meurisse

Ajouter un commentaire

Stéphane Meurisse