Wie schreibe ich nur jede ungerade Zeile in mein Array rein (C#)?
Moin Leute,
ich stecke gerade bei einem Problem fest.
Ich soll eine Datei öffnen und dann die Daten auslesen und in zwei Arrays speichern.
Die Datei hat in Zeile 1 den x1-Wert und in Zeile 2 den y1-Wert, in Zeile 3 dann x2 und in Zeile 4 y2, usw..
So ungefähr:
1,0234 x1
3,235 y1
2,346 x2
4,436 y2
...
Insgesamt sind es 20 Werte und ich soll alle x-Werte in Array 1 und alle y-Werte in Array 2 speichern.
Wie sage ich dem Programm, in welcher Zeile es gerade ist?
Mein jetziger Code ist ca. so:
double[] Array1 = new double[10];
double[] Array2 = new double[10];
FileStream fs;
fs = new FileStream(FileName, FileMode.Open);
constant int n = 20;
StreamReader sr = new StreamReader(fs);
for (i = 0; i <= n; i++)
{
// hier muss ich dann irgendwie sagen, dass das Programm alle ungeraden Zeilen in Array1 und alle Gerade in Array2 speichern soll.
Wie wäre denn im Allgemeinen die Methode, um den Wert der Zeile herauszufinden? Value.StreamReader.Line oder so?
1 Antwort
Ich habe die Frage nicht ganz verstande. Du willst aus einer Datei die ungeraden Zahlen auslesen und einspeicher richtig? Wenn ja könntest du es mit diesem code versuchen:
string[] lines = File.ReadAllLines("file.txt");
string[] oddLines = new string[lines.Length / 2];
int j = 0;
for (int i = 0; i < lines.Length; i++)
{
if (i % 2 != 0)
{
oddLines[j] = lines[i];
j++;
}
}
Dabei nicht vergessen, die oddLines mit einer schleife auszugeben
string[] lines = File.ReadAllLines("yourfile.txt");
double[] xValues = new double[lines.Length];
double[] yValues = new double[lines.Length];
for (int i = 0; i < lines.Length; i++)
{
string[] parts = lines[i].Split(',');
if (parts[1].StartsWith("x"))
{
xValues[i] = Convert.ToDouble(parts[0]);
}
else if (parts[1].StartsWith("y"))
{
yValues[i] = Convert.ToDouble(parts[0]);
}
}
So eventuell, wenn ich die Frage richtig verstanden haben sollte?
Ja so ungefähr. Würde das denn alle 20 Werte in die Arrays schreiben?
Würde das Split(' , ') nicht heißen, dass er die Nachkommastellen voneinander trennet?
Kann ich auch den Zähler der for Schleife prüfen, ob er gerade oder ungerade ist?
if(i = odd) oder if(i % 2 != 0) z. B.?
FileStream fs = new FileStream ("FileName.txt", FileMode.Open);
StreamReader sr = new StreamReader (fs);
double[] xValues = new double[10];
double[] yValues = new double[10];
for (int i = 0; i < lines.Length; i++)
{
if ( i % 2 != 0)
{
xValues[i] = (StreamReader(fs).Value); // macht sowas Sinn oder Brauche ich hier ein String Array um die werte erstmal da reinzuschreiben?
}
else if (i % 2 = 0)
{
yValues[i] =(StreamReader(fs).Value) ;
}
}
Was ich noch nicht weiß, ist wie ich die Daten aus dem Streamreader in doubles umwandle und ob der Streamreader gerade überhaupt Zeile für Zeile durchgeht. Muss ich dafür nicht den StreamReader in die for Schleife packen und dann sowas wie Newline oder so hinzufügen?
Stimmt habe es missverstanden. ersetze Split(' , ') mit einem Split(' ') dann sollte es klappen.
Zu der frage mit if(i = odd) oder if(i % 2 != 0), dass könntest du in der for-schleife noch ergänzen.
Das Dateiformat ist nach Angaben des FS anders.
Eine Zeile kann so aussehen:
4,436 y2
Das heißt, das Trennzeichen zum Splitten wäre ein Leerzeichen und den numerischen Wert sollte man besser parsen (s. double.Parse).
Da die Zeilenanzahl nicht mehr direkt auf einen un-/geraden Eintrag verweist, müsste man sich entweder eine mathematische Formel zur Berechnung bilden oder einfacher, man setzt eine zusätzliche Zählervariable hinzu, die immer nur jede zweite Zeile inkrementiert wird.
string[] lines = File.ReadAllLines("yourfile.txt");
double[] xValues = new double[lines.Length];
double[] yValues = new double[lines.Length];
for (int i = 0; i < lines.Length; i++)
{
string[] parts = lines[i].Split(' ');
double value = Convert.ToDouble(parts[0]);
if (value % 2 != 0)
{
if (parts[1].StartsWith("x"))
{
xValues[i] = value;
}
else if (parts[1].StartsWith("y"))
{
yValues[i] = value;
}
}
}
Meinst du sowas?
Ne Ne ich mochte jede Zeile mit einem x Wert in Array1 und jede Zeile mit einem y Wert in Array 2 speichern.