Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea รจ quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

VB.NET - Lettura da un file di testo complessa

Da qualche giorno sono entrato a far parte di Mediterranea Airlines, una compagnia di volo virtuale.
Scopo? Divertirsi e imparare a volare
Con cosa? Con MS Flight Simulator
Come? Il proprio responsabile assegna di volta in volta dei piani di volo (partenza da, arrivo a, seguendo questi waypoints) che vanno effettuati quando si vuole e quando si ha tempo (comunque nell'arco di un mese). Alla fine, bisogna compilare un report (rotta reale seguita, consumi di carburante, tempi, vento, situazione climatica, etc.) che bisogna rispedire al responsabile, che lo approva, lo pubblica on-line e incrementa le ore di volo.

Il piano di volo assegnato, nonchè il report da compilare, è un file di testo normalissimo, ma piuttosto noioso e scomodo da guardare, quindi ho cominciato a scrivere un piccolo software in VB.NET. In pratica, si tratta di un viewer che deve estrapolare info da un file simile a questo. Il file è piuttosto complesso, riporta moltissime informazioni come: arrivo e destinazione, waypoint da seguire con le relative frequenze, heading, distanze, tempi e altitudini da rispettare, etc. etc.

Ho scritto una classe che mi è servita per estrapolare tutti i dati e presentarli su un windows form più user-friendly rispetto al blocco note di Windows. La funzione scheletro è questa:

Private Sub ReadBriefingFile(ByVal NomeFileBriefing As String)
 'Apro il file
 Dim sw As New StreamReader(NomeFileBriefing, System.Text.Encoding.ASCII)
 Dim Lettura As String
 
 ContentFile = New ArrayList
 Do While sw.Peek >= 0
     Lettura = sw.ReadLine
     ContentFile.Add(Lettura)
 Loop
 
 sw.Close()
 sw = Nothing
End Sub

Dato un nome di file, riempio ContentFile che è un ArrayList di stringhe. Avrei potuto usare un semplice Array, ma ho preferito ArrayList perchè trovo comodissima la cosa di poter fare .Add senza sapere a priori di quanti elementi avrò bisogno. Al termine della Sub, quindi, dentro ContentFile ho tutte le righe del file (ContentFile(0) è la 1° riga, ContentFile(1) è la 2° riga e così via). In questo modo, mantengo in memoria tutto, senza bisogno di riaprire il file in fasi successiva. Ok, adesso posso estrapolare i valori che mi servono. Ho scritto la funzione:

Private Function GetValueField(ByVal Riga As Integer, ByVal Colonna As Integer, ByVal Larghezza As Integer) As String
    Dim Lettura As String

    If Riga > 0 Then
        Lettura = ContentFile(Riga - 1)
        If Larghezza > 0 Then
            Lettura = Lettura.Substring(Colonna - 1, Larghezza).TrimEnd
        End If
        Return (Lettura)
    End If
End Function

In pratica, dico: quale riga mi serve, quale colonna e la larghezza della stringa. Eventualmente posso prelevare l'intera riga indicando 0 (zero) nel parametro Larghezza. Funziona bene, però ho già scritto la release 2.0 (beta) che mi consente di estrapolare un dato indicando la parola_prima e la parola_dopo. Mi spiego meglio: una riga del file è questa:

Runway heading 1°,  altitude 479 ft

In pratica, esprimono l'heading esatto della pista, e l'altitudine della pista in piedi. Da questa riga dovrei estrapolare il valore 1 (heading) e 479 (altitude). Usando la function di prima, potrei scrivere qualcosa tipo:

Dim Heading As Double = Convert.ToDouble(GetValueField (10, 16, 1))
Dim Altitude As Double = Convert.ToDouble(GetValueField (10, 30, 3))

Niente di più semplice. ma cosa succede se l'heading è 11°, oppure 110°? Il codice sballa, giusto? Allora sto scrivendo una function simile alla precedente, però il cui prototipo potrebbe essere:

Private Function GetValueField(ByVal Riga As Integer, ByVal ParolaPrima As String, ByVal ParolaDopo As String) As String

e potrebbe essere richiamata così:

Dim Heading As Double = Convert.ToDouble(GetValueField (10, "heading", ","))

Insomma, oggi VB.NET & Framework applicato all'aeronautica!
:-)

Print | posted on Tuesday, June 7, 2005 3:46 PM |

Feedback

Gravatar

# re: VB.NET - Lettura da un file di testo complessa

le versioni supportate sono FS98, FS2000, FS2002 (quella che ho io) e la nuova FS2004. Puoi usare quella che vuoi, perchè l'importante è che tu fornisca un reporting dettagliato con tutte le info richieste.

anche io mi annoiavo, una volta, però quando impari ti rendi conto che in volo ci sono un sacco di cose da fare, seguire le radiali, mantenere l'altitudine, compensare la forza del vento, e allora un paio d'ore di volo volano via (ehm, gioco di parole) in un batter d'occhio...
:-)
ciao!
6/7/2005 5:26 PM | Igor Damiani
Gravatar

# .NET applicato all'aeronautica

6/8/2005 3:08 PM | Technology Experience
Gravatar

# Importazione file di testo con Access - NNTP.IT

Importazione file di testo con Access - NNTP.IT
8/25/2008 10:15 AM | Pingback/TrackBack
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET