[VB.NET] Export naar CSV

Pagina: 1
Acties:

  • CoRrRan
  • Registratie: Juli 2000
  • Laatst online: 24-06 09:35

CoRrRan

Don't Panic!!!

Topicstarter
Ik ben bezig met het schrijven van een programma dat een redelijk grote array wegschrijft naar meerdere .csv-files.

Momenteel gebruik ik het StreamWriter-object en schrijf ik elke regel 1 voor 1 weg, waarbij ik eerst de regel klaar maak door elke array-regel uit te lezen.
Pseudo code:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
For Each group in Array1
  stream = streamwriter(group.naam)

  For Each entry in Array2
    output = output & nieuwe invoer & separator
    stream.writeline(output)
  Next

  stream.flush
  stream.close
Next


Voor mijn testcase zijn mijn bestanden ongeveer 70KB en ik schrijf er 68 weg, maar in het normale gebruik kan 1 bestand best meerdere megabytes zijn en hoef ik er maar 5 weg te schrijven.

Is er nog een snellere manier om dit te doen? Ik zat eraan te denken om elk bestand eerst in een string te zetten, alvorens ik het bestand in 1x wegschrijf, maar ik vrees dan dat ik aan de limiet van het string-datatype aanloop.

-- == Alta Alatis Patent == --


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Een streamwriter heeft als het goed is een buffergrootte. Deze kun je eventueel zelf instellen in de constructor. Door de buffer groter te maken zorg je ervoor er meer in het geheugen wordt geplaatst alvorens het naar de schijf gaat. Je kunt uitproberen met welke waarde je programma het beste functioneert.
Het voordeel van het op deze manier aanpakken is dat jij niet zelf het wiel van het bufferen opnieuw gaat uitvinden. Bovendien heeft het gebruik van een string (=immutable) met veel concatenaties (& teken) tot gevolg dat er veel geheugen kopieeer acties moeten worden uitgevoerd. Ik vermoed dat de streamwriter intern een StringBuilder oid gebruikt. Dus als je er toch voor gaat om het wiel opnieuw uitvinden, gebruik dan in elk geval niet de string class.

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
Wellicht kan je een StringBuilder gebruiken om iedere regel samen te voegen, ik verwacht dat dit alleen al een groot verschil zal maken in prestaties.

Daarnaast is het inderdaad vaak verstandiger om eerst alles in 1 string te zetten, want schrijven naar geheugen gaat een stuk sneller als naar de schijf. Ik verwacht niet dat je snel tegen de limieten aan zal lopen, hoewel ik nooit zelf echt een controle heb gedaan wat maximaal verstandig is. Het is eventueel te overwegen om periodiek het geheugengebruik van de stream te controleren en als die te groot wordt, de hele stream weg te schrijven.

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


  • CoRrRan
  • Registratie: Juli 2000
  • Laatst online: 24-06 09:35

CoRrRan

Don't Panic!!!

Topicstarter
Kijk, dat was precies wat ik nodig had! Dank jullie voor de antwoorden.

Zoals jullie misschien kunnen lezen uit mijn post, ben ik nog niet heel erg bekend met alle ins en outs van VB.NET. Ik ben pas recent overgestapt naar VB.NET, en mijn basis is nog slechter, namelijk VBA. Gelukkig zijn er genoeg hulp paginas te vinden op i-net, maar je moet natuurlijk wel de goede zoek argumenten gebruiken. Ik was denk ik nooit op een StringBuilder-class gekomen.

Nu nog erachter zien te komen hoe ik het geheugengebruik van mijn StringBuilder-object kan opvragen en weg te schrijven als het te groot wordt.

-- == Alta Alatis Patent == --


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Probeer de MSDN helpfile over StringBuilder eens:
Klikkerdeklik
De Length property zou een aardige indicatie van het geheugengebruik moeten geven.

En de kern van mijn betoog was dat je beter gewoon gebruik kunt maken van de buffereigenschappen van de StreamWriter class, ik hoop dat dat is overgekomen.

  • CoRrRan
  • Registratie: Juli 2000
  • Laatst online: 24-06 09:35

CoRrRan

Don't Panic!!!

Topicstarter
bigbeng schreef op maandag 14 mei 2007 @ 10:47:
Probeer de MSDN helpfile over StringBuilder eens:
Klikkerdeklik
De Length property zou een aardige indicatie van het geheugengebruik moeten geven.

En de kern van mijn betoog was dat je beter gewoon gebruik kunt maken van de buffereigenschappen van de StreamWriter class, ik hoop dat dat is overgekomen.
Op zich was dat wel duidelijk, maar ik ben momenteel nog aan het zoeken hoe ik de buffer van het StreamWriter-object kan manipuleren. Alle voorbeelden die ik vind zijn eigenlijk te simpel, waarbij er dus een klein stukje text naar een file wordt weggeschreven, zonder gebruik te maken van een buffer.

Ik kan me inderdaad indenken dat ik op een of andere manier de buffer van het StreamWriter object moet kunnen vullen, op dezelfde manier als dat ik nu momenteel alles in het StringBuilder-object doe, en dan op een gegeven moment de buffer te flushen en het bestand af te sluiten.

Ik ga nog even verder neuzen.

-- == Alta Alatis Patent == --


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
In dat geval kan ik je vertellen:
Het bufferen van de StreamWriter gaat automagisch. Bij de creatie van het StreamWriter object kun je de buffergrootte aangeven in de constructor. Kijk op MSDN bij de beschriving van de constructor van de StreamWriter class voor meer info: Klik (5e en 7e constructor)

Bij het aanroepen van Write en WriteLine e.d wordt in eerste instantie naar het buffergeheugen geschreven en pas bij overschrijding van de eerdergenoemde buffergrootte wordt een flush uitgevoerd en dus daadwerkelijk naar de file geschreven.

  • CoRrRan
  • Registratie: Juli 2000
  • Laatst online: 24-06 09:35

CoRrRan

Don't Panic!!!

Topicstarter
bigbeng schreef op maandag 14 mei 2007 @ 12:22:
In dat geval kan ik je vertellen:
Het bufferen van de StreamWriter gaat automagisch. Bij de creatie van het StreamWriter object kun je de buffergrootte aangeven in de constructor. Kijk op MSDN bij de beschriving van de constructor van de StreamWriter class voor meer info: Klik (5e en 7e constructor)

Bij het aanroepen van Write en WriteLine e.d wordt in eerste instantie naar het buffergeheugen geschreven en pas bij overschrijding van de eerdergenoemde buffergrootte wordt een flush uitgevoerd en dus daadwerkelijk naar de file geschreven.
Aha, dat verklaart een boel! Dank je wel voor je hulp in ieder geval. Nu eens kijken wat optimaal gaat zijn voor mij. Misschien moet ik dit wel variabel gaan maken, aangezien mijn input veel te veel kan variëren.

Ik had al wel heel netjes
Visual Basic:
1
2
streamCSV.Flush()
streamCSV.Close()
gebruikt, maar zonder het besef dat het StreamWriter-object NIET alles direct wegschrijft naar het bestand.

* CoRrRan wordt langzaamaan steeds weer wat wijzer op VB.NET gebied. *O*

-- == Alta Alatis Patent == --


  • -SaveMe-
  • Registratie: Januari 2002
  • Laatst online: 01-12 13:51

-SaveMe-

-klik-

Je kunt natuurlijk ook een dataset gebruiken en voor elk ingelezen bestand een datatable aanmaken.
Dan kun je later naar believen door de datatables, datarows en datacolumns lopen naar hartelust :)

GamiQ, de game notes app met game maps!


  • CoRrRan
  • Registratie: Juli 2000
  • Laatst online: 24-06 09:35

CoRrRan

Don't Panic!!!

Topicstarter
-SaveMe- schreef op maandag 14 mei 2007 @ 21:17:
Je kunt natuurlijk ook een dataset gebruiken en voor elk ingelezen bestand een datatable aanmaken.
Dan kun je later naar believen door de datatables, datarows en datacolumns lopen naar hartelust :)
Dat begrijp ik, en misschien kom ik daar uiteindelijk nog wel bij terecht, maar momenteel ben ik bezig met een conversie van een bepaalde werkwijze via omslachtige macro's en Excel worksheets naar een simpel en snel programma wat die handelingen allemaal in 1x doet. Daarna kan ik kijken of ik de resultaten niet direct kan interpreteren dmv de genoemde datatables.

-- == Alta Alatis Patent == --

Pagina: 1