Query een CSV bestand LINQ

Zo af en toe ben ik nog steeds verbaasd wat je allemaal met LINQ kunt doen. Ik zag op Internet een vraag voorbij komen waar een ontwikkelaar zich afvroeg of je ook een query kon afvuren tegen een Comma Separated Values (CSV) bestand. Gebaseerd op een van de antwoorden, heb ik deze post geschreven. Het is echt verbazingwekkend wat je allemaal kunt met zo weinig Visual Basic code! Zoals je misschien al wel weet ben ik een grote fan van LINQPad. Ik gebruik dit veel wanneer ik LINQ queries aan het schrijven. Een van de krachtige functies van LINQPad is de .Dump() extension method. Zoals de naam al doet vermoeden, het dumpt het resultaat naar de Results window van LINQPad. Wees je er echter wel van bewust dat deze .Dump() methode niet beschikbaar is binnen Visual Studio; dan moet je deze achterweg laten en het resultaat op een andere manier weergeven.

 
Dim path = GetAndCreateFilePath() 
   
Dim results = (From line In File.ReadAllLines(path).Dump("Lines read") 
               Let value = line.Split(","). 
                                Skip(1). ' Skip the RowNumber 
                                Select(Function(x) Integer.Parse(x)) 
               Select New With {.MinimumValue = value.Min(), 
                                .MaximumValue = value.Max(), 
                                .Average = value.Average(), 
                                .RowTotal = value.Sum()}).ToList().Dump("Statistics") 
    
File.Delete(path) 


Zoals je in de Visual Basic code hierboven kunt zien, maken we eerst CSV-bestand aan, vragen deze uit en vervolgens verwijderen we het tijdelijke bestand weer. Voordat we ons echt gaan verdiepen in de LINQ logica, moeten we weten wat de GetAndCreateFilePath() methode nu eigenlijk wegschrijft. Elke regel begint met een regelnumemer en enkele andere numerieke waardes.

 
Private Function GetAndCreateFilePath() As String 
   
    Dim filePath = Path.GetTempFileName() 
   
    Dim stringBuilder As New StringBuilder 
    With stringBuilder 
        .AppendLine("1, 309, 88, 125, 825") 
        .AppendLine("2, 458, 258, 198, 189") 
        .AppendLine("3, 87, 587, 675, 136")     
    End With 
   
    File.WriteAllText(filePath, stringBuilder.ToString()) 
   
    Return filePath 
   
End Function 


In het eerste codevoorbeeld vuren we een LINQ statement van tegen een List(Of String), de line variabele. Met hulp van de Split() functie, verdelen we deze regelen in een array met in elk element een waarde uit die regel. Omdat we niet geïnteresseerd zijn in het regelnummer, slaan we deze over met Skip(1). Een opmerking terzijde, maar sinds Visual Basic .NET 2015 kun je ook commentaren binnen coderegels zelf opnemen. In dit voorbeeld helpt het om uit te leggen waarom we Skip(1) toepassen.

Wanneer we de juiste range hebben geselecteerd kunnen we het resultaat, inclusief berekeningen eenvoudig projecteren naar een anoniem type. Zoals eerder al gezegd, schrijft de .Dump() methode het resultaat naar het Results venster. Je kan deze methode vaker binnen een LINQ statement aanroepen. De eerste keer schrijven we de daadwerkelijke regels weg en aan het einde de statistieken. De kracht van LINQ is echt verbazingwekkend!

 

Ik heb deze post eerder in het Engels gepubliceerd op mijn eigen blog: www.obelink.com

Nieuwsbrief

Blijf op de hoogte van alles wat op VBcentral gebeurd. Meld je nu aan voor onze nieuwsbrief! »

Over ons

Wij zijn gek op het Microsoft .NET ontwikkelplatform en haar ontwikkeltalen, maar we hebben een sterke voorkeur voor Visual Basic .NET! »

Neem contact op

VBcentral.nl
Bataafseweg 20
7101 PA Winterswijk
Nederland
+31 (543) 538 388
info@vbcentral.nl