C# Textdatei auslesen und in Array speichern

freakhouse

Ensign
Registriert
Okt. 2005
Beiträge
151
Hi,
habe eine Frage zum einlesen und abspeichern von werten. Habe eine Textdatei in der Werte stehen und diese sollen ausgelsen und in ein Array abgespeicert werden.
Mein Array ist folgendes:

Code:
double[] awerte=new double[366];

Console.WriteLine("Um wiviele Werte handelt es sich?");
int b = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Es wurden folgende Werte eingelesen");
StreamReader objReader = new StreamReader(@"C:\Users\Admin\Desktop\Niederschlag.txt");
Console.Write(objReader.ReadToEnd());
objReader.Close();
for (int i = 0; i < b; i++)
{
awerte = Convert.ToDouble(objReader);
}

Darauf zeigt er mir halt die Werte ein, aber beim einlesen macht er ärger. Verständlich. Aber nur weiß ich nicht wie ich diese Werte jetzt in mein Array abspeichern kann.
Kann mir jmd weiterhelfen
Danke im Voraus!
 
du versuchst ein Objekt von Typ StreamReader in einen Double Wert zu konvertieren... weiss erstmal den string der von der Method ReadToEnd() zurückgegeben wird einer Variable zu, diese kannste dann auf die Console ausgeben und weiterverarbeiten (z.B. parsen)
 
Schau dir mal
http://www.tsql.de/csharp/csharp_textdatei
an, das hilf bestimmt.
Ergänzung ()

TextDatei td1 = new TextDatei();
for(int i = 1; i <= maximum; i++)
{
array = Convert.ToDouble(td1.ReadLine("dateiurl", i));
}

1.Klasse von TSQL einbeziehen
2.Diesen Code einfügen
3."dateiurl" durch die URL ersetzen
4.eine Variable maximum mit der maximalen Zeilenanzahl erzeugen
5.ein Double-Array mit der Größe von maximum deklarieren
 
Als erstes steht doch die Frage offen, wie liegen die Daten vor? In welchem Format? Komma Separiert? Untereiander oder nebeneiander mit Leerzeichen separiert?
Wenn sie untereiander stehen und du willst je eintrag in deinem Array eine Zahl machs doch einfach so hier.

Code:
List<int> zahlenInhalt  = File.ReadAllLines("test.txt").ToList().ConvertAll<int>(converter => Convert.ToInt32(converter));
Geht natürlich genauso mit double.
Liegen sie Kommasepariert vor liest du eben mit File.ReadAllText("test.txt") ein und machst nen Split auf den String. Das selbe wenn sie Leerzeichensepariert vorliegen. Liegen sie in einem ganz anderen Format vor musst du uns das mal sagen. ICh kann jetzt nur raten ;)
 
geht die Konvertierung nur wenn die werte auch den Intwerten entsprechen?
 
Ja natürlich. Das war nur ein Schematisches Beispiel, logischer Weiße muss man darauf reagieren wenn eine Exception kommt und die Werte nicht im erwartetenden Format vorliegen, oder vorher ein TryParse machen. Aber die Vorgehensweiße bleibt die gleiche.
 
hmm es geht dann irgendwann in die endlosschleife wenn du immer wieder versuchst die gleiche zeile zu parsen die nicht "parse-bar" ist.

ich meine, man darf nicht sowas wie das da unten machen:

Code:
private void MyToInt(Object i)
{
    try{
        ...
    }
    catch
    {
        MyToInt(i);
    }
}
 
Nein das sowieso nicht, wird ein Parsefehler gewurfen, ist die Datei korrupt und man sollte das Programm beenden, den user informieren das die datei invalide ist und diesen fehler beheben lassen.
 
hi,
danke für die zahlreichen antworten. habe es aber leider noch nicht hinbekommen.
Die Zahlen in der Textdatei haben folgendes format:
1
2
3
...

habe mir das so gedacht

Code:
                    StreamReader myFile = new StreamReader(@"C:\Users\Admin\Desktop\Niederschlag.txt", System.Text.Encoding.Default);
                    
                    Console.WriteLine("Es wurden folgende Ergenisse ausgelesen");
                    Console.WriteLine(myFile.ReadToEnd());
                    string sContent = myFile.ReadToEnd();                  
                    myFile.Close();
                    double ab = Convert.Double(sContent);
                    for (int i = 0; i < 5; i++)
                    {
                        awerte[i] = Convert.ToDouble(ab);
                    }
allerdings sagt er bei der konvertierung von scontent in ab dass das eingabe format falsch sei.
 
sContent ist ja der gesamte Dateiinhalt, schon klar, dass das nicht geparst werden kann.
Du musst die Datei einfach nur zeilenweise auslesen und jede Zeile einzeln in double parsen.

Code:
string path = @"C:\Users\Admin\Desktop\Niederschlag.txt"
string[] stringValues = File.ReadAllLines(path, Encoding.Default);
double[] doubleValues = Array.ConvertAll<string, double>(stringValues, s => Double.Parse(s));
 
Zuletzt bearbeitet:
ja Zeilenweise auslesen

Code:
while(reader.Read())
{
   ///mache was
}
musst du dann nix besonderes mehr unternehmen... halt nicht vergessen das ganze abzufangen falls du in eine leere instanz schreiben willst, weil dein array zu kurz ist oder wenn die datei nicht gelesen werden kann.
 
Analog zu toeffie hier mein Lösungsansatz:

Code:
double[] awerte = Array.ConvertAll<string, double>(
  System.IO.File.ReadAllLines(@"C:\Users\Admin\Desktop\Niederschlag.txt", System.Text.Encoding.Default), 
  new Converter<string, double>(Convert.ToDouble));

EDIT: Uups, Grantig hatte schon das gleiche gemacht... Sorry für den Doppelpost
 
PHP:
StreamReader dateiLeser = File.OpenText(@"D:\example.txt"); // die Datei öffnen
List<double> werte = new List<double>(); // eine Liste für die Werte erstellen

while (!dateiLeser.EndOfStream) // bis zum Ende der Datei ...
{
    string zeile = dateiLeser.ReadLine(); // ... die nächste Zeile lesen und in einen String schreiben und ...
    werte.Add(Convert.ToDouble(zeile)); // ... die gelesene Zeile in double konvertieren und zur Liste hinzufügen
}

double[] werteArray = werte.ToArray(); // wenn du ein normales Array statt der Liste willst entspr. konvertieren
Am einfachsten und vermutlich auch am verständlichsten. Selbstverständlich sind noch Fehler abzufangen.
 
Zuletzt bearbeitet:
@Backslash: Vergiss bitte nicht den Stream wieder zu schließen ;) Entweder durch ein Close oder durch den dementsprechenden using-Block.
 
Und den string Zeile kann man sich auch sparen ;)

PHP:
StreamReader dateiLeser = File.OpenText(@"D:\example.txt"); // die Datei öffnen
List<double> werte = new List<double>(); // eine Liste für die Werte erstellen

while (!dateiLeser.EndOfStream) // bis zum Ende der Datei ...

    werte.Add(Convert.ToDouble(dateiLeser.ReadLine())); // ... die gelesene Zeile in double konvertieren und zur Liste hinzufügen
}

double[] werteArray = werte.ToArray(); // wenn du ein normales Array statt der Liste willst entspr. konvertieren
dateiLeser.Close();
 
So würde es hier auch gehen, dann müssen die Zahlen aber auch mit Komma geschrieben werden wenn es sich um Zahlen mit Komma stellen handelt.

Bsp.: 13,23

Bei einem Punkt würde er die Zahl "13.23" einlesen und daraus eine "1223.0" machen.

Code:
List<double> nums = new List<double>();
foreach (string str in File.ReadAllLines("test.txt", Encoding.Default))
    nums.Add(Convert.ToDouble(str));

Für File benötigst du den System.IO Namespace...

// edit:
Hier sind noch weitere Beispiele wie man eine Textdatei einlesen kann:
Textdateie einlesen bei dotnet-snippets.de


Man beachte das Beitrag #5 bereits die Lösung gab!
 
Zuletzt bearbeitet: (Link eingefügt)
Das schließen habe ich in der Eile doch tatsächlich vergessen, Schande über mich.
Dass man sich den string sparen kann ist klar, dient in diesem Fall auch eher der Veranschaulichung.

Im Nachhinein muss ich aber sagen dass die andere Lösung mir durchaus besser gefällt.


Ob Komma oder Punkt ist übrigens von der Systemeinstellung abhängig wenn man das nicht selbst anders definiert.
 
Zurück
Oben