Metodo per esportazione in CSV dei dati di una tabella

In questo tutorial si vedrà come realizzare un metodo globale in C# che, data una tabella, la esporti in formato csv.

Per una corretta comprensione di questo tutorial si consiglia la lettura delle precedenti guide: Campionamento periodico e memorizzazione dei valori in uno store e Interacting with a Database Using Scripts (Advanced).

Gestione dello store

Per prima cosa, procedere alla creazione e/o alla configurazione di uno store, sia esso ODBC o SQLite, cliccando con il tasto destro la cartella Data-stores e selezionando da New il tipo desiderato. Creare quindi la tabella Table1.

Per lo scopo del tutorial la tabella sarà formata da quattro colonne con diversi tipi di dato, come segue:

  • Column1 di tipo Int16

  • Column2 di tipo Int32

  • Column3 di tipo Float

  • Column4 di tipo String

Nel caso la tabella sia vuota la si popoli con alcuni dati a piacere. Per semplificazione rinominare lo store creato come Store1.

Script di esportazione

Si proceda creando un nuovo runtime script, cliccando con il tasto destro la cartella Scripts e selezionando New >> RuntimeScript. Verrà quindi creato un nuovo oggetto RuntimeScript1, il quale, una volta cliccato, comporterà l’apertura di Visual Studio dove sarà possibile procedere con la modifica del codice.

Aprire il file RuntimeScript1.cs e inserire il seguente metodo:

using System;
using System.IO;

[ExportMethod]
public void ExportCSV(NodeId tableNodeId)
{
    // Getting the current project
    var project = Project.Current;

    // Getting the object table from its NodeId
    var tableObject = InformationModel.GetObject(tableNodeId);

    if (tableObject == null)
        return;

    // Getting the Tables collection
    var tablesCollection = tableObject.Owner;

    if (tablesCollection == null)
        return;

    // Getting the Store
    var storeObject = tablesCollection.Owner as Store;

    object[,] resultSet;
    string[] header;

    // Execute query on store of the current project
    storeObject.Query("SELECT * FROM \"" + tableObject.BrowseName + "\"", out header, out resultSet);

    // Check if the resultSet is a bidimensional array
    if (resultSet.Rank != 2)
        return;

    // Getting the number of rows and columns of the matrix
    var rowCount = resultSet != null ? resultSet.GetLength(0) : 0;
    var columnCount = header != null ? header.Length : 0;

    // Outpt file path
    string filePath = Path.Combine(project.ApplicationDirectory, "CSVExport-" + tableObject.BrowseName + "-" + DateTime.UtcNow.ToString("yyyyMMddHHmmss") + ".csv");

    // Writing CSV to file
    try
    {
        using (StreamWriter csvFileStream = new StreamWriter(filePath))
        {
            // Table header
            for (uint i = 0; i < columnCount; i++)
            {
                csvFileStream.Write(header[i]);

                if (i < columnCount - 1)
                    csvFileStream.Write(";");
            }

            csvFileStream.Write("\n");

            // Table content
            for (uint i = 0; i < rowCount; i++)
            {
                for (uint j = 0; j < columnCount; j++)
                {
                    if (resultSet[i, j] == null)
                        csvFileStream.Write("");
                    else
                        csvFileStream.Write(resultSet[i, j]);

                    if (j < columnCount - 1)
                        csvFileStream.Write(";");
                }
                csvFileStream.Write("\n");
            }
        }
    }
    catch(Exception e)
    {
        // Write the error in the log
        Log.Error("Unable to export table '" + tableObject.BrowseName  + "' to CSV file '" + filePath + "': " + e.Message, "");
    }
}

Questo script richiede in input la tabella che si desidera esportare, che verrà restituita in formato csv e sarà accessibile dall’Application Directory del progetto.

Esecuzione dello script

Per eseguire lo script sopra elencato è necessario richiamarlo durante l’esecuzione del Runtime. Per questo scopo possiamo semplicemente legare lo script al click di un bottone.

Per farlo bisogna creare un nuovo bottone e rinominarlo come ExportButton. Successivamente, nella Event View bisogna cliccare il tasto + vicino all’evento MouseClickEvent e selezionare Scripts >> RuntimeScript1 >> ExportCSV. Espandere quindi la proprietà Method e eseguire un data-bind di tableNodeId con Project >> DataStores >> Store1 >> Tables >> Table1. Allo script verrà passato come parametro il nodo della tabella di cui vorremmo ottenere il corrispettivo csv.

Esecuzione del progetto

Il progetto che viene consegnato successivamente, oltre ad esportare il file, presenta anche un bottone con annesso NetLogic per l’aggiunta di valori casuali nella tabella. Questa procedura non viene presentata in questa sede, poiché la sua struttura è identica a quella proposta nel tutorial Interacting with a Database Using Scripts (Advanced) per lo script di inserimento, ad eccezione di alcune modifiche minime, basate sui tipi di dato utilizzati e sull’aggiunta di una colonna ulteriore.

Scarica il progetto di esempio da qui.