PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Array aufsplitten und in mehrere Arrays aufteilen


Gast
2010-02-02, 20:12:09
Hallo, ich habe eine Datei, die ausgelesen werden muss und die einzelnen Werte in eigene Arrays abgespeichert werden müssen. Die Datei sieht so aus:

2939 0,3375 231,6 0,82 0,372714

Momentan sieht es so aus, dass ich die Zeilen einlese und in ein Array abspeichere. Aber ich weiß nicht wies weiter geht

Monger
2010-02-02, 20:22:30
Das riecht nach Hausaufgabe! ;)

Komm, gib uns n bißchen mehr Info. Mir ist schon klar worauf das hinausläuft, aber streng dich wenigstens ein bißchen an.

Was für eine Programmiersprache?
Was hast du bisher versucht?
Wie genau sollen die Zahlen aufgeteilt werden?

Gast
2010-02-02, 20:42:40
Nein, keine Hausaufgabe, bekommen in der Berufsschule gar nichts auf. Wir haben heut mit Messwertverarbeitung angefangen und ich wollte es Zuhause schon einmal versuchen.

Sprache: VB.NET
2939 sollte in ein eigenes Array, 0,3375 in ein eigenes usw.

bis jetzt bin ich so weit:

Public Class Form1
Dim sr As New IO.StreamReader("C:\KLll.txt")
Dim d(50) As String
Dim teil As String

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Integer
Do
i = i + 1
d(i) = sr.ReadLine()
If IsNothing(d(i)) Then Exit Do
Listbox1.Items.Add(d(i))
Loop
sr.Close()
teil = d(i)
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim i As Integer
Dim n(100) As String
Do
i = i + 1
n(i) = Strings.Left(n(i), 5)
If IsNothing(n(i)) Then Exit Do
ListBox2.Items.Add(n(i))
Loop

End Sub
End Class



Die Listboxen sind nur dazu da, um zu schauen ob das Einlesen geklappt hat :o Das Einlesen funktioniert, aber ich weiß nicht wie ich aus dem Array d(50) (in dem ca. 50 Zeilen "2939 0,3375 231,6 0,82 0,372714" abgespeichert sind) die einzelnen Werte in eigene Arrays bekomme.

Der_Donnervogel
2010-02-02, 21:39:35
Nun dann wäre die Aufgabe ja schon fast gelöst. Es fehlt nur noch die Aufteilung der Zeilen in einzelne Werte. String besitzt genau für diesen Zweck eine passende Methode namens "Split".

Ach ja, noch eine Anmerkung zum Code. Eine Endlosschleife zu machen und aus dieser dann per Exit heraus zu springen ist schlechter Programmierstil. Es ist eigentlich fast immer besser die Entscheidung ob die Schleife endet oder nicht, von der Schleife selbst bestimmen zu lassen. Bei so kleinen Sachen ist es egal, aber bei größeren Programmen erleichtert es z.B. die Fehlersuche, wenn es immer nur einen definierten Punkt gibt wo eine Schleife verlassen wird.

Monger
2010-02-02, 21:44:12
Was meinst du mit "jede Zahl in ein eigenes Array"? Ein Array besteht üblicherweise aus mehr als einem Element.

Ich vermute, du willst einfach nur alle Zahlen aus der Textdatei in einer Liste haben. Dazu musst du entlang der Zeilenumbrüche und Leerzeichen auftrennen, und jeden Textschnipsel als eigene Zahl interpretieren. Das sähe zum Beispiel so aus:



Dim Lines() As String = IO.File.ReadAllLines(("C:\KLll.txt")

Dim Zahlenliste as new List(of Integer)

For Each Line as String in Lines
Dim Zahlen() As String = Line.Split(" "c)
For each Zahl As String In Zahlen
Zahlenliste.Add(Integer.Parse(Zahl))
Next
Next

"Integer.Parse" interpretiert das Textfragment als Zahl. Das ist wichtig, wenn du danach mit diesen Zahlen irgendwas berechnen willst. Wenn du die Zahlen ohnehin direkt in eine Listbox schreibst, kannst du dir diesen Zwischenschritt sparen, und direkt die Zahlenliste als String deklarieren.

Line.Split(" "c) splittet den angegebenen String (in diesem Fall eben eine Textzeile) entlang des angegebenen Zeichens auf.

Monger
2010-02-02, 21:52:33
... und nur so mal "Just for fun": für fortgeschrittene das ganze mal als LINQ Ausdruck (VB.NET 3.5), mit regulären Ausdrücken! ;)



Dim Text = IO.File.ReadAllText("C:\KLll.txt")

Dim Zahlenliste = (From x In Regex.Split(Text, " ") _
Let Zahl = Integer.Parse(x) Select Zahl).ToList

Gast
2010-02-02, 22:04:49
Danke!

Wir fangen demnächst auch noch mit C# an, sieht schwieriger aus (von der Syntax) als VB.NET. Was präferiert ihr so?

Der_Donnervogel
2010-02-02, 22:35:00
Für Anfänger ist sicher VB-Code besser zu lesen als C# Code (zumindest wenn man englisch kann). Im Prinzip ist es aber egal, da sowohl VB als auch C# auf .Net aufsetzen. Die Sprachen unterscheiden sich dementsprechend primär nur im Bereich der Syntax, aber nicht in dem was sie können.

Ich persönlich präferiere eigentlich fast VB-Code gegenüber C#-Code. Vermutlich, da ich das Programmieren mit BASIC begonnen habe. Es macht aber keinen großen Unterschied welche Sprache man nimmt. Etwas anderes wäre z.B. C++, da diese Sprache ein paar zusätzliche Tücken enthält.

Monger
2010-02-02, 22:59:16
Ich bin da natürlich alles andere als neutral, weil ich auf Arbeit praktisch ausschließlich mit VB.NET zu tun habe...

Aber ich finde, gerade mit .NET 3.5 hat VB.NET einen gewaltigen Sprung nach vorne gemacht. Da war auch ein bißchen Glück dabei, weil VB.NET ein paar syntaktische Besonderheiten hat, die gerade jetzt ziemlich nützlich werden...

Ein Beispiel: VB.NET unterstützt mittlerweile XML Literale:


Dim node = <Person Alter=25>
<Vorname>Monger</Vorname>
</Person>

Du kannst also XML Code eins zu eins in VB.NET kopieren. In C# ist die eckige Klammer schon seit langer Zeit ein reserviertes Zeichen, deshalb geht das dort in der selben Weise nicht.

Das obige Beispiel zeigt noch was: VB.NET kennt dynamische Objekte.

Dim s = "Monger" ' dynamischer Typ
Dim t as String = "Monger" ' statischer Typ

Die kommen in C# zwar ab .NET 4.0 auch, aber aufgrund der klassischen, C-ähnlichen Deklaration, und des etwas verqueren Schlüsselworts finde ich, dass der Unterschied zwischen später Typbindung und statischer Typisierung nicht wirklich klar wird:

Object s = "Monger"; // dynamischer Typ
String t = "Monger"; // statischer Typ


Natürlich ist das irgendwo Geschmackssache, aber wenn ich die Wahl zwischen VB.NET und C# hätte, würde ich mittlerweile wohl ersteres wählen.

Der_Donnervogel
2010-02-03, 00:11:49
Dim node = <Person Alter=25>
<Vorname>Monger</Vorname>
</Person>

Du kannst also XML Code eins zu eins in VB.NET kopieren. In C# ist die eckige Klammer schon seit langer Zeit ein reserviertes Zeichen, deshalb geht das dort in der selben Weise nicht.Diese Funktionalität ist wirklich gut, allerdings muss ich etwas widersprechen, was die Erklärung betrifft. Wir wollen den Programmieranfänger hier ja nicht verwirren:

Erstens sind hier wohl Spitze Klammern (also <>) und nicht eckigen Klammern (also []) gemeint. Zweitens ist auch in VB die Spitze Klammer ein reserviertes Zeichen, wie eigentlich in fast allen Sprachen. Die Klammern werden nämlich als Vergleichsoperatoren verwendet:

z.B. If a < 5 Then

Grundsätzlich hat Monger aber recht, dass einfach so xml-Code in C# Code einzubetten dort zu syntaktischen Problemen führen würde.

Was ich z.B. an VB sehr gerne habe, ist das mächtige Select Case. Ich habe mit den neueren C# Varianten nichts gemacht, aber so viel ich weiß, basieren die immer noch auf switch. Sachen wie
Dim a As Integer = 5
Select Case a
Case Is < 0
Case 0 To 2
Case 4, 5
Case 7 To 10
Case Else
End Select

sind schon ab und zu sehr praktisch, zumal es ja auch mit Strings umgehen kann und man auch für die Vergleiche Variablen nehmen kann und nicht auf Konstanten angewiesen ist. Was ich auch ab und zu praktisch finde, ist die implizite Typenkonvertierung/-umwandlung. Man muss aber wissen was man macht! Deshalb gleich die Warnung an den Anfänger hier im Thread:
Dim text As String = "10"
Dim zahl As Integer = text
Dim text1 As String = zahl & text
Dim zahl2 As Integer = zahl + text
Dim zahl3 As Integer = zahl & text
Dim text2 As String = text + text

Die Ergebnisse sind:

text1 = 1010
zahl2 = 20
zahl3 = 1010
text2 = 1010

Der "+" Operator addiert zwei Zahlen. Dabei kann eine Zahl auch in einem String stehen. Sofern VB den String in eine Zahl umwandeln kann, macht er das dann automatisch. Erkennt er aber mindestens einen String, den er nicht in eine Zahl verwandeln kann, dann wandelt er die Zahl in einen String um und verknüpft (konkateniert) beide. Das "+" ist bei Strings nämlich auch ein Symbol um Strings zu konkatenieren. Deshalb sollte man wenn man Strings konkatenieren will immer den Operator "&" verwenden und niemals "+". Ansonsten könnte es passieren, dass VB plötzlich anfängt Strings zu addieren wo man es gar nicht erwartet.

Monger
2010-02-03, 11:44:09
Erstens sind hier wohl Spitze Klammern (also <>) und nicht eckigen Klammern (also []) gemeint.

Ups! :redface:
Ja, ähh, meine ich doch! :D


Was ich z.B. an VB sehr gerne habe, ist das mächtige Select Case.
Vorallem spielt das auch sehr schön mit den Enums zusammen (von denen ich ansonsten nicht so sehr begeistert bin):


Public Enum Wochentage
Montag
Dienstag
Mittwoch
Donnerstag
Freitag
Samstag
Sonntag
End Enum

Public Sub doSth(tag as Wochentage)
Dim Text As String

Select Case tag
Case Wochentage.Montag to Wochentage.Freitag : Text = "Urgh!!"
Case Wochentage.Samstag or Wochentage.Sonntag : Text = "Yay!"
Case Else : Throw New ArgumentException("Wtf?!?")
End Select
End Sub