Springen naar inhoud


- - - - -
VS 2015

File Met Regels Van Ongelijke Lengte

VS2015

  • Log in a.u.b. om te beantwoorden
Er zijn 11 reacties in dit onderwerp

#1 ArieM

ArieM

    Junior Developer

  • Leden
  • PipPip
  • 78 berichten
    Laatst bezocht 07 sep 2020 19:38

Geplaatst op 04 juni 2020 - 11:28

Ik heb na jaren het programmeren in VB weer eens opgepakt en heb nu een probleem waar ik niet uit kom.

Ik heb een comma delimited file met regels van ongelijke lengte.
Het is een file waarin de scores van golfspelers worden bijgehouden en bewerkt. Elke regel geeft de scores weer van een bepaalde speler.
Hoe kan ik een getal toevoegen aan een bepaalde regel en vervolgens de getallen in die regel bewerken en weer wegschrijven.
Het leek mij op het eerste gezicht niet zo moeilijk, maar ik kom er niet uit.

Wie weet hier een goede oplossing voor?

#2 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1200 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 04 juni 2020 - 14:11

 ArieM, op 04 juni 2020 - 11:28, zei:

Ik heb na jaren het programmeren in VB weer eens opgepakt en heb nu een probleem waar ik niet uit kom.

Ik heb een comma delimited file met regels van ongelijke lengte.
Het is een file waarin de scores van golfspelers worden bijgehouden en bewerkt. Elke regel geeft de scores weer van een bepaalde speler.
Hoe kan ik een getal toevoegen aan een bepaalde regel en vervolgens de getallen in die regel bewerken en weer wegschrijven.
Het leek mij op het eerste gezicht niet zo moeilijk, maar ik kom er niet uit.

Wie weet hier een goede oplossing voor?
Nou, dat wordt:
  • Lees bestand in, stop de info in een object per speler met daarin een lijst met scores
  • Bewerk (wijzigen, toevoegen, ...)
  • Schrijf terug weg naar je bestand.


#3 ArieM

ArieM

    Junior Developer

  • Leden
  • PipPip
  • 78 berichten
    Laatst bezocht 07 sep 2020 19:38

Geplaatst op 04 juni 2020 - 15:46

Inlezen met readline of per item? En hoe schrijf je terug naar de juiste plaats in het bestand?

#4 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1200 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 04 juni 2020 - 16:08

 ArieM, op 04 juni 2020 - 15:46, zei:

Inlezen met readline of per item?
Het volledige bestand ineens? Met b.v. IO.File.ReadAllLines?

 ArieM, op 04 juni 2020 - 15:46, zei:

En hoe schrijf je terug naar de juiste plaats in het bestand?
Niet: je schrijft het (gewijzigde) bestand ineens volledig weg.

Tenzij het hier over een gigantisch bestand gaat natuurlijk, maar dan is een comma separated tekst ook al geen schitterend idee om te beginnen.

#5 ArieM

ArieM

    Junior Developer

  • Leden
  • PipPip
  • 78 berichten
    Laatst bezocht 07 sep 2020 19:38

Geplaatst op 04 juni 2020 - 16:25

Het bestand bevat ca. 100 regels met een max. lengte van 21 items. Als ik 1 regel bewerk, hoe krijg ik die dan weer op de juiste plaats in het bestand? Regels indexeren? Terugschrijven met writeline gaat niet, met terugschrijven per item krijg je geen regels.

#6 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1200 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 04 juni 2020 - 17:24

 ArieM, op 04 juni 2020 - 16:25, zei:

Het bestand bevat ca. 100 regels met een max. lengte van 21 items. Als ik 1 regel bewerk, hoe krijg ik die dan weer op de juiste plaats in het bestand? Regels indexeren? Terugschrijven met writeline gaat niet, met terugschrijven per item krijg je geen regels.
Je bewerkt geen regels, je bewerkt een object.
Die objecten hou je bij in een lijst.
Je schrijft de volledige lijst van objecten terug naar een (nieuw) comma separated bestand (je overschrijft dus het vorige).

#7 ArieM

ArieM

    Junior Developer

  • Leden
  • PipPip
  • 78 berichten
    Laatst bezocht 07 sep 2020 19:38

Geplaatst op 04 juni 2020 - 18:04

Sorry, ik begrijp dit niet. Ondanks mijn leeftijd (82) ben ik een junior developer.  Zou je een voorbeeld kunnen geven?

#8 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1200 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 04 juni 2020 - 18:24

 ArieM, op 04 juni 2020 - 18:04, zei:

Sorry, ik begrijp dit niet. Ondanks mijn leeftijd (82) ben ik een junior developer.  Zou je een voorbeeld kunnen geven?
Zie voorbeeld.

Bijlage  Golferie.zip   12,06K   4 downloads

#9 ArieM

ArieM

    Junior Developer

  • Leden
  • PipPip
  • 78 berichten
    Laatst bezocht 07 sep 2020 19:38

Geplaatst op 04 juni 2020 - 20:50

Oké bedankt, Ik ga me hier even in verdiepen!

#10 Supervos

Supervos

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1411 berichten
    Laatst bezocht 27 jul 2020 14:55
  • LocatieBrugge

Geplaatst op 04 juni 2020 - 20:52

Er zijn meerdere mogelijkheden om dit aan te pakken, de ene al moeilijker dan de andere. Daarnaast is het te zien of je werkelijk met een correcte csv file werkt of als iedere lijn een afwijkend aantal items kan hebben.

Een eenvoudige manier waarbij je heel snel kleine aanpassingen kan doen is door het bestand als een array van strings in te lezen (met behulp van File.ReadAllLines(path)). In deze array ga je naar de correcte regel en wijzig je de string. Als je gebruik maakt van de Split(","c) methode heb je een nieuwe array waarbij je de kolommen hebt, deze terug naar een string omvormen doe je met String.Join(","c, lijnArray), het resultaat hiervan zet je op de correcte plaats in de array en met File.WriteAllLines(path, lijnen) schrijf je het terug weg.

(code uit de losse pols, kan zijn dat het niet werkt)
Code:
Dim pad = "c:/resultaten.csv"
Dim lijnen = File.ReadAllLines(pad)
' in dit voorbeeld willen we lijn 12 aanpassen en bevat het bestand meer dan 12 lijnen
Dim lijn = lijnen(11)
Dim kolommen = lijn.Split(","c)
' hiervan willen we kolom 3 aanpassen, dit is de score die we willen wegschrijven
kolommen(2) = "8"
' terug in de hoofd array zetten
lijn = String.Join(","c, kolommen)
lijnen(11) = lijn
' terug naar het bestand schrijven
File.WriteAllLines(lijnen, pad)

De indexen zijn altijd 1 minder omdat arrays vanaf 0 beginnen

#11 ArieM

ArieM

    Junior Developer

  • Leden
  • PipPip
  • 78 berichten
    Laatst bezocht 07 sep 2020 19:38

Geplaatst op 13 juni 2020 - 22:05

Sorry voor mijn late reactie, maar ik was een weekje weg. Jouw zip file kan ik niet helemaal volgen. Deze is voor mij wat te geavanceerd. Niettemin heb je me toch op ideeën gebracht waardoor ik het probleem toch kon oplossen. Bedankt hiervoor.
Een probleem voor mij is dat ik aan de help functie niets heb. Je kan eigenlijk net zo goed meteen op internet zoeken. Zelfs simpele zaken zoals "for...each" vind je niet. De help van VB2019 lijkt me alleen geschikt voor personen die het eigenlijk al helemaal weten.
Nogmaals bedankt voor de hulp.

mvg Arie

#12 Damic

Damic

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 770 berichten
    Laatst bezocht 13 sep 2020 11:01
  • LocatieMechelen (BE)

Geplaatst op 15 juni 2020 - 21:27

https://www.dotnetperls.com/for-vbnet als je zoekt zoek altijd met vb.net vooraan ;)





Ook met taq VS 2015, VS2015 voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[VS 2015] Untitled 1

Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)