domenica 18 giugno 2017

.Net ripulire i file di testo dai caratteri speciali con VB.Net e C#

Si riporta l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_net-realizzare-un-programma-per-ottimizz_1531.aspx


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à.

Nessun commento: