.Net : Ripulire i file di testo da caratteri speciali

Articolo che fornisce le basi e tecniche sulla realizzazione di programmi di windows Application, per la gestione dei file di testo.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

L’articolo che proponiamo oggi riguarda la possibilità di realizzare un programma di tipo “Windows Application” tramite il linguaggio di programmazione Visual Basic .Net e C#, con Visual Studio 2015 community, con il quale leggere e ottimizzare tutti i file di testo, per ripulirli dai caratteri speciali.
Può capitare, che in un contesto con vari sistemi operativi, tra Unix e Windows, lo scambio dei file, può comportare la presenza di alcuni caratteri speciali, che Windows non riconosce.
L’articolo vuole guidare il lettore a realizzare un semplice programma per la bonifica di tali file.

Creazione del progetto

Prima di tutto, bisogna creare un nuovo progetto di tipo “Windows Application” con Visual Studio 2015, con il linguaggio di proprio interesse.
Aggiungiamo alla nostra form, un pulsante, che all’evento click eseguirà determinate azioni.
Nel file di configurazione, nel file App.config, scriviamo due parametri, uno che indica il percorso dove si trovano i file, e l’altro se esaminare un file o un certo tipo di file.
Si riporta qui di seguito il frammento di codice.

<appSettings >
<add key="Percorso" value="E:\testfile\"/>
<add key="NomeFile" value="*.txt"/>
</appSettings>


Stesura del codice

Facciamo doppio click sul pulsante, ed in visualizzazione codice, in alto sopra ogni dichiarazione, aggiungiamo lo spazio dei nomi che ci permetterà di gestire i file di testo, le regular expression e i file di configurazione.
Si riporta qui di seguito le dichiarazioni per entrambi i linguaggi.

VB.Net
Imports System.Configuration
Imports System.IO
Imports System.Text.RegularExpressions
C#
using System.Configuration;
using System.Collections.Specialized;
using System.Text.RegularExpressions;

Ora passiamo nell’evento click del pulsante, nel quale dobbiamo estrapolare le informazioni dal file di configurazione e poi esaminare il file o i file presenti nella cartella indicata nel file di configurazione.
Qui di seguito si riporta tale dichiarazione.

VB.Net 
Private Sub btnOttimizza_Click(sender As Object, e As EventArgs) Handles btnOttimizza.Click
Dim Percorso As String = ConfigurationManager.AppSettings("Percorso")
Dim NomeFile As String = ConfigurationManager.AppSettings("NomeFile")
For Each percorsoFile As [String] In Directory.GetFiles(Percorso, NomeFile)
LeggiCreaFile(percorsoFile)
Next
End Sub
C#
private void btnOttimizza_Click(object sender, EventArgs e)
{
string Percorso = ConfigurationManager.AppSettings["Percorso"];
string NomeFile = ConfigurationManager.AppSettings["NomeFile"];
foreach (String percorsoFile in Directory.GetFiles(Percorso, NomeFile))
{
LeggiCreaFile(percorsoFile);
}
}

Si crea una funzione, che dato il percorso e nome del file, esamina il suo contenuto, riga per riga, e poi verifica la presenza di caratteri speciale, che tramite un’altra funzione (TrascodificaTesto) converte il testo anomalo in quello da noi indicato.
Al tempo stesso nella funzione viene scritto in un file temporaneo, la riga bonificata dai caratteri speciali.
Si riporta qui di seguito tali dichiarazioni per entrambi linguaggi.

VB.Net
Private Sub LeggiCreaFile(pPercorsoFile As String)
Try
Dim FileTemporaneo As String = DateTime.Now.ToString("yyyyMMddhhmmss") + "_" + Path.GetFileName(pPercorsoFile)
FileTemporaneo = Path.Combine(Path.GetDirectoryName(pPercorsoFile), FileTemporaneo)
Using ScriviFile As New System.IO.StreamWriter(FileTemporaneo, False)
Dim letturafile As New System.IO.StreamReader(pPercorsoFile)
Dim Linea As String = ""
Dim ContaRiga As Int32 = 0
Linea = letturafile.ReadLine()
While Linea IsNot Nothing
ScriviFile.WriteLine(TrascodificaTesto(Linea))
ContaRiga += 1
If ContaRiga = 100 Then
ScriviFile.Flush()
ContaRiga = 0
End If
Linea = letturafile.ReadLine()
End While
If ContaRiga > 0 Then
ScriviFile.Flush()
End If
letturafile.Close()
End Using
Catch ex As Exception
Throw
End Try
End Sub
C#
private void LeggiCreaFile(string pPercorsoFile)
{
try
{
string FileTemporaneo = DateTime.Now.ToString("yyyyMMddhhmmss") + "_" + Path.GetFileName(pPercorsoFile);
FileTemporaneo = Path.Combine(Path.GetDirectoryName(pPercorsoFile), FileTemporaneo);
using (System.IO.StreamWriter ScriviFile = new System.IO.StreamWriter(FileTemporaneo, false))
{
System.IO.StreamReader letturafile = new System.IO.StreamReader(pPercorsoFile);
string Linea = "";
Int32 ContaRiga = 0;
while ((Linea = letturafile.ReadLine()) != null)
{
ScriviFile.WriteLine(TrascodificaTesto(Linea));
ContaRiga += 1;
if (ContaRiga == 100)
{
ScriviFile.Flush();
ContaRiga = 0;
}
}
if (ContaRiga > 0)
{
ScriviFile.Flush();
}
letturafile.Close();
}
}
catch (Exception ex)
{
throw;
}
}

A questo punto scriviamo la funzione che permette di bonificare il contenuto del file, con un’espressione regolare, con i valori da noi indicati.
Qui di seguito si riporta tale dichiarazione per entrambi linguaggi.

VB.Net
Private Function TrascodificaTesto(pTesto As String) As String
pTesto = Regex.Replace(pTesto, "[åàáâãäæ]", "a")
pTesto = Regex.Replace(pTesto, "[ÁÀÄÃÅÂ]", "A")
pTesto = Regex.Replace(pTesto, "[èéêë]", "e")
pTesto = Regex.Replace(pTesto, "[ÈÉËÊ]", "E")
pTesto = Regex.Replace(pTesto, "[ìíîï]", "i")
pTesto = Regex.Replace(pTesto, "[ÍÌÏÎ]", "I")
pTesto = Regex.Replace(pTesto, "[òóôõö]", "o")
pTesto = Regex.Replace(pTesto, "[ÓÒÖÔÕ]", "O")
pTesto = Regex.Replace(pTesto, "[ùúûü]", "u")
pTesto = Regex.Replace(pTesto, "[ÚÙÛÜ]", "U")
pTesto = Regex.Replace(pTesto, "[¥]", "N")
pTesto = Regex.Replace(pTesto, "[ý]", "y")
pTesto = Regex.Replace(pTesto, "[Š]", "S")
pTesto = Regex.Replace(pTesto, "[š]", "s")
pTesto = Regex.Replace(pTesto, "[ç]", "c")
pTesto = Regex.Replace(pTesto, "[ñ]", "n")
pTesto = Regex.Replace(pTesto, "[Ñ]", "N")
pTesto = Regex.Replace(pTesto, "[ž]", "z")
pTesto = Regex.Replace(pTesto, "[[]", "(")
pTesto = Regex.Replace(pTesto, "[]]", ")")
pTesto = Regex.Replace(pTesto, "[@]", " ")
pTesto = Regex.Replace(pTesto, "[#]", " ")
pTesto = Regex.Replace(pTesto, "[ø]", " ")
pTesto = Regex.Replace(pTesto, "[^\u0000-\u007F]", " ")
Return pTesto
End Function
C#
string TrascodificaTesto(string pTesto)
{
pTesto = Regex.Replace(pTesto, "[åàáâãäæ]", "a");
pTesto = Regex.Replace(pTesto, "[ÁÀÄÃÅÂ]", "A");
pTesto = Regex.Replace(pTesto, "[èéêë]", "e");
pTesto = Regex.Replace(pTesto, "[ÈÉËÊ]", "E");
pTesto = Regex.Replace(pTesto, "[ìíîï]", "i");
pTesto = Regex.Replace(pTesto, "[ÍÌÏÎ]", "I");
pTesto = Regex.Replace(pTesto, "[òóôõö]", "o");
pTesto = Regex.Replace(pTesto, "[ÓÒÖÔÕ]", "O");
pTesto = Regex.Replace(pTesto, "[ùúûü]", "u");
pTesto = Regex.Replace(pTesto, "[ÚÙÛÜ]", "U");
pTesto = Regex.Replace(pTesto, "[¥]", "N");
pTesto = Regex.Replace(pTesto, "[ý]", "y");
pTesto = Regex.Replace(pTesto, "[Š]", "S");
pTesto = Regex.Replace(pTesto, "[š]", "s");
pTesto = Regex.Replace(pTesto, "[ç]", "c");
pTesto = Regex.Replace(pTesto, "[ñ]", "n");
pTesto = Regex.Replace(pTesto, "[Ñ]", "N");
pTesto = Regex.Replace(pTesto, "[ž]", "z");
pTesto = Regex.Replace(pTesto, "[[]", "(");
pTesto = Regex.Replace(pTesto, "[]]", ")");
pTesto = Regex.Replace(pTesto, "[@]", " ");
pTesto = Regex.Replace(pTesto, "[#]", " ");
pTesto = Regex.Replace(pTesto, "[ø]", " ");
pTesto = Regex.Replace(pTesto, @"[^\u0000-\u007F]", " ");
return pTesto;
}

Conclusioni

L’articolo ha voluto fornire al lettore delle basi sulla realizzazione di un semplice programma per la gestione dei file di testo, per la relativa verifica del formato.
Una tecnica che può tornare utile, nei contesti in cui si fa uso intenso di file, soprattutto con diversi sistemi operativi come possono essere l’integrazione tra Unix e Windows.
Naturalmente questo esempio di codice, di un possibile programma può essere esteso, realizzando programmi di una certa funzionalità e complessità.