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
.