Springen naar inhoud


- - - - -
VS 2010

Tekstbestanden

vs2010

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

#1 Scheepers

Scheepers

    Senior Developer

  • Leden
  • PipPipPip
  • 206 berichten
    Laatst bezocht 04 okt 2017 11:13

Geplaatst op 01 augustus 2017 - 16:23

Ik had een vraag over tekstbestanden.
Ik heb een werklijst .txt die bestaat uit maximaal 80 regels en in elke regel bestaat uit een vast aantal items gescheiden door komma's.
Elke regel heeft op plaats :
2 - idnummer
7 - monsternr
8 - bepaling
12 - uitslag (deze is leeg in het begin)

Ook heb een uitslagen.txt die ik uitlees en ook daar zitten dezelfde items in als in het werklijst.txt en nog veel meer uitslagen.
Wat ik wil is dat correcte uitslagen uit uitslagen.txt toegevoegd worden aan de correcte regel op plaats van de uitslag(12) van werklijst.txt.

#2 Dirk Andries

Dirk Andries

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 956 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 01 augustus 2017 - 17:53

Bericht bekijkenScheepers, op 01 augustus 2017 - 16:23, zei:

Ik had een vraag over tekstbestanden.
Ik heb een werklijst .txt die bestaat uit maximaal 80 regels en in elke regel bestaat uit een vast aantal items gescheiden door komma's.
Elke regel heeft op plaats :
2 - idnummer
7 - monsternr
8 - bepaling
12 - uitslag (deze is leeg in het begin)

Ook heb een uitslagen.txt die ik uitlees en ook daar zitten dezelfde items in als in het werklijst.txt en nog veel meer uitslagen.
Wat ik wil is dat correcte uitslagen uit uitslagen.txt toegevoegd worden aan de correcte regel op plaats van de uitslag(12) van werklijst.txt.


En hoe lang is" uitslag"?
Of op welke positie begint er iets nieuws?
Of: hoe lang is een regel (als er niks meer achter komt).


En: een voorbeeldbestandje vóór zou fantastisch zijn (en eentje ná helemaal toppie).

Veranderd door Dirk Andries, 01 augustus 2017 - 18:12.

Trust me, I have no idea what I'm talking about.

#3 Damic

Damic

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 581 berichten
    Laatst bezocht 15 okt 2017 12:38
  • LocatieMechelen (BE)

Geplaatst op 01 augustus 2017 - 17:54

Ja dit kan, wat heb je zelf al gevonden?

#4 Dirk Andries

Dirk Andries

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 956 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 01 augustus 2017 - 18:23

Bericht bekijkenScheepers, op 01 augustus 2017 - 16:23, zei:

Ook heb een uitslagen.txt die ik uitlees en ook daar zitten dezelfde items in als in het werklijst.txt en nog veel meer uitslagen.
Wat ik wil is dat correcte uitslagen uit uitslagen.txt toegevoegd worden aan de correcte regel op plaats van de uitslag(12) van werklijst.txt.
Je wil dus verschillende uitslagen uit uitslagen.txt wegschrijven op plaats 12 van werklijst.txt.
Hoe moeten die verschillende uitslagen worden gescheiden als ze worden weggeschreven op plaats 12?
Dat is niet duidelijk.
Trust me, I have no idea what I'm talking about.

#5 Dirk Andries

Dirk Andries

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 956 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 02 augustus 2017 - 08:25

Bijvoorbeeld (code vertrekt van wat aannames)

Visual Basic Code:
Public class Fixer
Public Sub LeesEnSchrijf()
	 Dim uitslagen = File.ReadAllLines("uitslagen.txt").ToDictionary(Function(s) GetId(s), Function(s) GetUitslagen(s))
	 Dim werklijst = File.ReadAllLines("werklijst.txt").ToDictionary(Function(s) GetId(s), Function(s) s)
	 File.WriteAllLines("fixed.txt", Fix(uitslagen, werklijst))
End Sub

Private Function Fix(uitslagen As Dictionary(Of String, String), werklijst As Dictionary(Of String, String)) As String()
	 For Each uitslag In uitslagen
		 If werklijst.ContainsKey(uitslag.Key) Then
			 werklijst(uitslag.Key) = werklijst(uitslag.Key) + GetUitslagen(uitslag.Value)
		 End If
	 Next
	 Return werklijst.Values.ToArray
End Function

Private Function GetUitslagen(s As String) As String
	 Dim startpos = 0
	 For index = 1 To 12
		 startpos = s.IndexOf(","c, startpos)
	 Next
	 Return s.Substring(startpos + 1)
End Function


Private Function GetId(s As String) As String
	 Return New String(s.SkipWhile(Function(k) k <> ","c).Skip(1).TakeWhile(Function(k) k <> ","c).ToArray)
End Function


Public Sub MaakMonster()
	 Dim sb As New StringBuilder()
	 For id = 1 To 80
		 sb.AppendLine($"w,id{id},twee,drie,vier,vijf,zes,monster{id},bepaling{id},negen,tien,elf,")
	 Next
	 File.WriteAllText("werklijst.txt", sb.ToString)
	 sb.Clear()
	 For id = 1 To 80
		 sb.AppendLine($"u,id{id},twee,drie,vier,vijf,zes,monster{id},bepaling{id},negen,tien,elf," +
						 $"uitslag{id}-1,uitslag{id}-2,uitslag{id}-3,uitslag{id}-4,uitslag{id}-5")
	 Next
	 File.WriteAllText("uitslagen.txt", sb.ToString)
End Sub
End Class


en dan bijvoorbeeld:
Visual Basic Code:
Public Class FormFixer
Private Sub FormLoad(sender As Object, e As EventArgs) Handles MyBase.Load
	 Try
		 With New Fixer
			 .MaakMonster()
			 .LeesEnSchrijf()
		 End With
		 MessageBox.Show("Fixed")
	 Catch ex As Exception
		 MessageBox.Show(ex.ToString)
	 End Try
End Sub
End Class


Trust me, I have no idea what I'm talking about.

#6 Dirk Andries

Dirk Andries

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 956 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 02 augustus 2017 - 08:30

Oops!
VS2017 project in bijlage

Bijlage  FixUitslag.zip   12,1K   1 downloads
Trust me, I have no idea what I'm talking about.

#7 Scheepers

Scheepers

    Senior Developer

  • Leden
  • PipPipPip
  • 206 berichten
    Laatst bezocht 04 okt 2017 11:13

Geplaatst op 02 augustus 2017 - 10:49

Wanneer ik de code start krijg ik een foutmelding bij sb.AppendLine($". $ is not valid.
Ik gebruik VB 2012

Aangezien ik de code nog niet gestart krijg zie ik misschien iets over het hoofd, maar aan de hand van de combinatie van idnummer, monsternummer en bepaling mag de uitslag vanuit uitslagen.txt naar de desbetreffende regel in werklijst.txt waar dus ook hetzelfde idnummer, monsternummer en bepaling staat.
De uitslag is een double.

#8 Dirk Andries

Dirk Andries

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 956 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 02 augustus 2017 - 12:45

View PostScheepers, on 02 augustus 2017 - 10:49, said:

Wanneer ik de code start krijg ik een foutmelding bij sb.AppendLine($". $ is not valid.
Ik gebruik VB 2012
MaakMonster bouwt gewoon een fake werklijst.txt en uitslagen.txt bestand (omdat jij er geen leverde).
En die string interpolation bestaat inderdaad nog maar vanaf vb 2015 (vb 14).
Je kan het er makkelijk uithalen en vervangen door String.Format:
Visual Basic Code:
	 Public Sub MaakMonster()
		Dim sb As New StringBuilder()
		For id = 1 To 80
			sb.AppendLine(String.Format("w,id{0},twee,drie,vier,vijf,zes,monster{0},bepaling{0},negen,tien,elf,",id))
		Next
		File.WriteAllText("werklijst.txt", sb.ToString)
		sb.Clear()
		For id = 1 To 80
			sb.AppendLine(String.Format("u,id{0},twee,drie,vier,vijf,zes,monster{0},bepaling{0},negen,tien,elf," +
										"uitslag{0}-1,uitslag{0}-2,uitslag{0}-3,uitslag{0}-4,uitslag{0}-5",id))
		Next
		File.WriteAllText("uitslagen.txt", sb.ToString)
	End Sub


View PostScheepers, on 02 augustus 2017 - 10:49, said:

Aangezien ik de code nog niet gestart krijg zie ik misschien iets over het hoofd, maar aan de hand van de combinatie van idnummer, monsternummer en bepaling mag de uitslag vanuit uitslagen.txt naar de desbetreffende regel in werklijst.txt waar dus ook hetzelfde idnummer, monsternummer en bepaling staat.
De uitslag is een double.
Zoals al gezegd: ik ben vertrokken met enkele aannames: bijvoorbeeld dat idnummer alleen voldoende was voor identificatie.
En dat uitslagen.txt meerdere uitslagen bevatte voor 1 idnummer.
Ik vermoed nu dat dit allemaal wat fout was (overigens verwacht, want je geeft je info naar goede traditie maar mondjesmaat prijs).
Maar ik denk dat je de nodige aanpassingen zelf wel kan uitvogelen, want het principe blijft gelijk.
Zo niet, dan horen we het wel.
Trust me, I have no idea what I'm talking about.

#9 Dirk Andries

Dirk Andries

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 956 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 02 augustus 2017 - 13:27

View PostScheepers, on 02 augustus 2017 - 10:49, said:

Wanneer ik de code start krijg ik een foutmelding bij sb.AppendLine($". $ is not valid.
Ik gebruik VB 2012
Ik heb de code aangepast in de upload.
Ook al omdat in fixed.txt er wat te veel werd weggeschreven.
Visual Basic Code:
Private Function Fix(uitslagen As Dictionary(Of String, String), werklijst As Dictionary(Of String, String)) As String()  
	 For Each uitslag In uitslagen  
		 If werklijst.ContainsKey(uitslag.Key) Then
			 ' dit was fout
			 werklijst(uitslag.Key) = werklijst(uitslag.Key) + uitslag.Value 
		 End If  
	 Next  
	 Return werklijst.Values.ToArray  
End Function

moest zijn:
Visual Basic Code:
Private Function Fix(uitslagen As Dictionary(Of String, String), werklijst As Dictionary(Of String, String)) As String()  
	 For Each uitslag In uitslagen  
		 If werklijst.ContainsKey(uitslag.Key) Then
			 ' moest zijn 
			 werklijst(uitslag.Key) = werklijst(uitslag.Key) + GetUitslagen(uitslag.Value)  
		 End If  
	 Next  
	 Return werklijst.Values.ToArray  
End Function

Je kan het opnieuw downloaden.
Trust me, I have no idea what I'm talking about.

#10 Scheepers

Scheepers

    Senior Developer

  • Leden
  • PipPipPip
  • 206 berichten
    Laatst bezocht 04 okt 2017 11:13

Geplaatst op 12 augustus 2017 - 17:07

Ik heb alleen documentatie gekregen en nog geen voorbeelden.
Aangezien ik 2 tekstbestanden moet vergelijken met de combinatie idnummer, monsternr en bepaling per regel dacht ik misschien kan ik de functie 'linq' gebruiken.
Ik heb daar geen ervaring mee, maar het ziet er uit als een soort query.

#11 Dirk Andries

Dirk Andries

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 956 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 13 augustus 2017 - 10:41

View PostScheepers, on 12 augustus 2017 - 17:07, said:

Ik heb alleen documentatie gekregen en nog geen voorbeelden.
Aangezien ik 2 tekstbestanden moet vergelijken met de combinatie idnummer, monsternr en bepaling per regel dacht ik misschien kan ik de functie 'linq' gebruiken.
Ik heb daar geen ervaring mee, maar het ziet er uit als een soort query.
De functie GetId maakt gebruik van Linq, je kan dat uitbreiden met de andere vergelijkingen.
De beide .ToDictionary voor bouwen van de variabelen werklijst en uitslagen is ook Linq.
Linq heeft twee syntaxen: de zg. fluent syntax (die ik gebruik) en de zg. query syntax (die wat op sql lijkt, van heel ver).
Als je jezelf vertrouwd wil maken met Linq kan ik je LinqPad aanraden.
Trust me, I have no idea what I'm talking about.





Ook met taq VS 2010, vs2010 voorzien

0 gebruiker(s) lezen dit onderwerp

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

Inloggen


[VS 2010] Untitled 1

Met dank aan PascalBianca die tot op heden alles bijhoud sinds anno dec 2010)
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)
vbib.be - vbnet.be - vbdotnet.be - visualbasic.be