Autor Beitrag
fuji
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 03.12.09 18:27 
Hallo,

ich bin absoluter Neuling in C-Sharp ;)

ich möchte gerne aus einer ASCII Datei Werte nacheinader einlesen und und vergleichen.
Mit welcher Methode geht das oder wie muss ich da vorgehen? Hoffe jemand kann mir einen Tipp geben?


Moderiert von user profile iconChristian S.: Topic aus WinForms verschoben am Do 03.12.2009 um 17:51
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 03.12.09 18:41 
Hallo,

ich nehme mal an, dass du nicht "ASCII-Datei" meinst, sondern "Textdatei". Es wäre auch schön, wenn du genauer lesen würdest:
* Das Unterforum WinForms bezieht sich auf "Alles zur Entwicklung grafischer Oberflächen von klassischen Desktop-Anwendungen".
* Für "Zugriff auf Dateien (z.B. FileStream, StreamReader, StreamWriter)" passt stattdessen das Unterforum IO, XML und Registry.

Die einfachsten Verfahren gehen mit File.ReadAllLines (Ziel ist ein String-Array) oder File.ReadAllText (Ziel ist ein String einschließlich aller CR/LF). Bei Bedarf muss der passende Zeichensatz festgelegt werden.

Was du mit "vergleichen" meinst, müsstest du genauer erläutern. Der Standardvergleich mit String.Compare stellt einfach fest, ob zwei Strings gleich sind oder nicht. Schau einmal an, welche Methoden die String-Klasse anbietet.

Gruß Jürgen

PS. Zum Einstieg siehe auch OpenBook Visual C#.
fuji
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 04.12.09 10:30 
afbharhrh


Zuletzt bearbeitet von fuji am Mi 09.12.09 13:18, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 04.12.09 10:38 
Hallo,

bei dieser Struktur scheint mir ReadAllText am sinnvollsten zu sein. Dieser String muss dann analysiert werden.

Diese Aufgabe scheint mir für RegEx prädestiniert zu sein; aber dazu habe ich immer noch keine Ahnung. Ersatzweise kannst du mit String.Split alle Werte in ein String-Array aufteilen und per Schleife prüfen.

Sobald du die einzelnen Werte als Zahlen verwenden willst, solltest du unbedingt TryParse verwenden (nicht Convert.ToXxx oder Parse), weil Schreibfehler bei solchen Dateien immer vorkommen können. Beachte auch, dass es bei double immer zu Rundungsfehlern kommen kann; wenn das wichtig ist, dann ist decimal besser geeignet. (Faustformel: Für kaufmännische Berechnungen decimal, für wissenschaftliche double.)

Gruß Jürgen
fuji
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 07.12.09 15:36 
oo


Zuletzt bearbeitet von fuji am Mi 09.12.09 13:18, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 07.12.09 16:21 
Das enttäuscht mich. Du hast alle Begriffe schon genannt bekommen, die relevant ist. Das einzige, was ich noch nicht konkret erwähnt hatte, ist eine Methode für Suchen und Ersetzen:
Zitat:
nur mit der Veränderung das antsatt des Wortes tabelle dann "table" in der Ausgabe steht

Aber den Hinweis, die String-Methoden durchzulesen, hatte ich schon gegeben.

Etwas mehr Eigeninitiative bitte! Jürgen
fuji
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.12.09 09:06 
ich habe mir die string Methode durchgelesen.
und ich weiß auch das ich die Metrhoden FileReadAllLines
und Replace zum ersetzen der zeichen neben soll.

ICh weiß aber nicht, wie ich den Code dazu schreiben soll. Bin eben Anfänger.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 08.12.09 10:22 
... und eben eine for-Schleife. Außerdem sind natürlich Zuweisungen relevant.

Dann weißt du doch alles; also versuch es einfach mal, das in Code umzusetzen. Dann kommen konkrete Fragen und konkrete Antworten.

Jürgen

PS. Gewöhne dir bitte auch exakte Formulierungen an, das hilft grundsätzlich beim Programmieren. Es gibt nicht "die string Methode", sondern viele String-Methoden. Du beziehst dich vermutlich auf Replace, insofern ist das im Moment klar. Aber grundsätzlich deutet so eine Aussage auf fehlendes Verständnis und/oder fehlende Bereitschaft, sich Gedanken zu machen.
fuji
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.12.09 10:55 
jd


Zuletzt bearbeitet von fuji am Mi 09.12.09 13:19, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 08.12.09 15:03 
Hatte ich nicht schon von exakten Formulierungen und Gedanken gesprochen? Bei dir geht das noch wie Kraut und Rüben durcheinander. Mach dir doch einen Plan (erstens, zweitens usw.); beachte genau, was zuerst erledigt werden muss, damit der nächste Schritt überhaupt möglich ist; dann setze das Schritt für Schritt in Code um.

Bei dir geht es schon damit los:
Zitat:
also wen auf den Button geklickt wird, soll die zuvor eingelsenen Datei in den string zeile für zeile eingelesen werden

Was denn nun: zuvor schon eingelesen oder jetzt einlesen?

Dann: Zuerst wird die Variable "path" benutzt, um einen neuen String "str" zu erzeugen. Erst danach wird path deklariert und gleichzeitig mit einem Wert versehen. Später soll str.Replace verwendet werden; aber steht in str wirklich etwas drin, wo sich die gewünschte Ersetzung lohnt?

Dann: Bei "readtext" wird die Datei eingelesen. (Das ist die einzige Zeile, die wirklich Sinn macht und 100%ig korrekt ist.) Aber machst du danach irgendetwas mit dem Inhalt der Variablen readtext? (Nein, der Compiler wird diese Zeile wegen der Optimierung streichen.)

Schließlich WriteAllLines: Grundsätzlich gilt doch, dass rechts vom Gleichheitszeichen etwas steht, mit dem etwas gemacht wird (Ausgangswert), links steht das Ergebnis der Zuweisung. Dein Versuch, mit einem Dateinamen Zeilen zu schreiben, sodass das Ergebnis in einem String-Array landet, ist doch offensichtlich widersinnig. Hast du auch nur einmal in der SDK-Doku/MSDN/Hilfe nachgeschaut, wie WriteAllLines auszusehen hat, was es macht und wie es arbeitet? Dann hättest du erkennen müssen, dass es eine void-Methode ist, die niemals rechts von einem Gleichheitszeichen stehen kann; ihre Parameter dagegen müssen die vorgegebenen Werte sein, nämlich Dateinamen und die vorhandenen Zeilen, die gespeichert werden sollen.

Ganz am Rande solltest du auch auf die Einrückungen achten: Was zusammengehört, sollte in der gleichen Weise eingerückt sein. (Das kann auch durch das Kopieren vom Editor ins Forum schief gehen; du solltest es hier genau prüfen.)

Also nochmal von vorn:
  1. Zuerst brauchen wir den Dateinamen, also Variable deklarieren und ggf. Wert zuweisen.
  2. Woher kommt der Dateiname? Aus dem OpenFileDialog? Dann schau in der Hilfe nach, wie du an den Namen kommst.
  3. Gehe davon aus, dass der Dateiname immer vollständig (incl. Pfad) anzugeben ist. Du kannst dich nicht darauf verlassen, dass das Arbeitsverzeichnis immer korrekt gesetzt ist. Wenn du nur den Namen hast, dann werden mit Path.Combine Pfad und Name zusammengesetzt. (Es gibt natürlich mehr Möglichkeiten, aber wegen '\' ist dieses Verfahren zu bevorzugen.)
  4. Dann wird die Datei eingelesen; wie gesagt, das hattest du richtig gemacht.
  5. Jetzt musst du dich entscheiden: Soll das originale Array behalten werden oder überschrieben werden? Einfacher ist das Überschreiben; sorgfältiger wäre ein neues Array.
  6. Jetzt kommt die Schleife: Zeile für Zeile ist durch Replace zu bearbeiten (nicht das Array, sondern jede einzelne Zeile). Was soll mit dem Ergebnis geschehen? Es muss an dieselbe Stelle im Array (entweder in das originale oder in das neue) geschrieben werden. Überlege auch, was mit den Zeilen passiert bzw. passieren soll, die den "Suchtext" nicht enthalten.
  7. Danach kann die Datei unter Verwendung des neuen Array und des Dateinamens gespeichert werden.

Bei künftigen Aufgaben solltest du so oder ähnlich einen ganz genauen Plan machen. (Das geschieht natürlich vorwiegend im Kopf, aber bis dahin Papier nicht schlecht.)

Also auf, neuer Versuch. Jürgen

PS. Die Fragen selbst halte ich nicht für blöd. Aber dass die klaren Gedanken fehlen (und damit auch die Systematik), stört mich.
fuji
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.12.09 09:37 
Ic


Zuletzt bearbeitet von fuji am Mi 09.12.09 13:19, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 09.12.09 10:13 
user profile iconfuji hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab jetzt bisschen was geändert und die Anwendung läuft auch soweit, das die datei gespeichert wird.

Gibt es einen Grund dafür, dass das Speichern bei jedem Schleifendurchlauf ausgeführt wird?

user profile iconfuji hat folgendes geschrieben Zum zitierten Posting springen:
Mein Problem ist jetzt noch das der Text von tabelle in table nicht verändert wurde, könnte sein das ich dort irgendwie falsch die Variablen zugewiesen habe?

Offensichtlich. Ich habe oben schon gefragt, was denn mit der Variablen readtext passiert: Nichts, gar nichts. Aber was machst du mit der Variablen path? Handelt es sich dabei um den Dateinamen oder den Dateiinhalt? Genau nachdenken bitte!

Wenn du die Schleife mit dem Debugger durchgehen würdest (Breakpoint auf eine Anweisung davor setzen), würdest du etwa folgende Informationen erhalten:

1. Durchgang für i = 0:
readtext ist ein Array, also ist das Prüfen umständlicher; aber Zeile 0 zeigt z.B. "&tabelle1"
path = "C:\Dokumente und Einstellungen\AllUsers\MyProgram\Data\blablabla.txt";
und was wird daraus durch das Replace? Richtig, keine Änderung - weder für path noch für readtext[0]
2. Durchgang für i = 1:
identisch usw. für z.B. 83 Durchläufe

Was die Länge des Pfades mit der Anzahl der Schleifendurchgänge zu tun hat, ist auch schleierhaft.

Lösung: Du hast ein String-Array, nämlich readtext. Dieses musst du verwenden, und zwar Zeile für Zeile (also indiziert arbeiten).

user profile iconfuji hat folgendes geschrieben Zum zitierten Posting springen:
Und 2. möchte ich die Datei eigentlich automatisch öffnen lassen

Das machst du doch. ButtonClick startet den ganzen Arbeitsablauf, und dazu gehört auch das Einlesen der Datei.

Wenn du es anders meinst (z.B. automatisch beim Programmstart), dann musst du den Inhalt von ButtonClick einfach in eine andere Methode auslagern und diese Methode aufrufen, am besten von Form-Load oder (noch besser) Form-Shown aus.

user profile iconfuji hat folgendes geschrieben Zum zitierten Posting springen:
und nicht speichern. Womit kann ich das machen?

Ganz einfach: Lass den Speichern-Befehl weg.

Das alles sollte auch ein "absoluter Neuling" durch genaues Nachdenken herausfinden können. Jürgen
fuji
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.12.09 11:51 
[c


Zuletzt bearbeitet von fuji am Mi 09.12.09 13:19, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 09.12.09 12:11 
Wenn du schon nicht vorher genau nachdenkst, dann lies doch bitte wenigstens genau. Das String-Arrray
Zitat:
musst du verwenden, und zwar Zeile für Zeile (also indiziert arbeiten).

Wo benutzt du innerhalb der Schleife einen Index? Wie das geht, habe ich indirekt doch schon geschrieben. (In meinem letzten Beitrag wollte ich das eigentlich wieder streichen, weil ich dachte, dieser Zaunpfahl wäre viel zu groß; aber anscheinend war er noch zu klein.)

Grundsätzlich musst du unter NET (also auch unter C#) genau auf die Typen achten: Wenn ein String benötigt wird, musst du einen String benutzen. Wenn ein Array vorgesehen ist, musst du ein Array angeben. Wenn du ein Array verwendest, wo ein String erwartet wird, bekommst du eben so eine Fehlermeldung.

Ist das denn so schwer zu verstehen und zu beachten? :oops: Jürgen
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 09.12.09 12:17 
Dein ganzer Quellcode macht so überhaupt keinen Sinn!

Versuch doch mal zu überlegen, was du überhaupt machen willst.

Formuliere dies in Punkte, so wie es JüTho dir als Beispiel gemacht hat bzw. du in deinem zweiten Beitrag - dann kannst du dir wahrscheinlich selbst helfen.

Und dann versucht man sukzessiv die einzelnen Schritte durchzuführen. Wenn du dann dazu ein Problem hast mach einen NEUEN Thread auf und verwende diesen nicht für alle möglichen Probleme (Topic relevant). Dann können später auch andere Benutzer davon profitieren.

Wenn ich mir einen Algorithmus/Programm überlege schreibe ich mir auf was dieser tut (als Kommentare) und mach mich dann an die Implementierung. Diese Vorgehensweise kann ich dir nur nahelegen.


Bei dir z.B.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
# Get filename

# Parse file

# Rename words

# Store rename content


Gruß Daniel