[C++/CLI]Dateneinlesen, Zeichen und Wörter rausschmeießen?

Alex Großmann

Erfahrenes Mitglied
Morgen :)

Also ich habe das bisher so:
Code:
//.. Designer Code abgeschnitten

private: System::Void btn_csv_Click(System::Object^  sender, System::EventArgs^  e) {
//OpenFileDialog Konfigurieren
			
ofd_csv->Filter = "XLS Datei (*xls)|*.xls|CSV Datei (*csv)|*.csv|Alle Datein(*.*)|*.*";  
ofd_csv->FilterIndex = 1;
ofd_csv->RestoreDirectory = true;
ofd_csv->ShowDialog();

			//FileStream & StreamReader anlegen

			FileStream^ fs = nullptr;
			StreamReader^ sr = nullptr;

			

			try
			{
				fs = gcnew FileStream(ofd_csv->FileName, FileMode::Open);
				sr =gcnew StreamReader(fs);


			
				String^ str;
				sr->ReadLine();

	
				while ( sr->Peek() > -1 )			// Lesen bis das Dokument zuende ist
				{
					str = sr->ReadLine();
					array<String^>^ zeile = str->Split(';');  //Ergibt einen Fehler das die Typumwandlung nicht möglich ist
					tb->Text = zeile;
				}

				

				

				
								
			}
			catch (Exception ^e)
			{
				tb->Text = e->Message;
			}

			finally
			{
				if (sr)
				{
					sr->Close();
				}
			}

			 }	 
	};
}

Das ganze gibt auch iwie immer nur die Letzte Zeile im Dokument aus...was ist hier falsch?!
 

sheel

I love Asm
Code:
while ( sr->Peek() > -1 )
{
    str = sr->ReadLine();
    array<String^>^ zeile = str->Split(';');
    tb->Text = zeile;
}
Das Dateiende besser nicht mit Peek prüfen,
sondern ob Readline null ergibt.
Code:
while((str = sr->ReadLine()) != nullptr)
{
    array<String^>^ zeile = str->Split(';');
    tb->Text = zeile;
}
Warum immer nur die letzte Zeile da ist:
Zeile 1 kommt in die tb.
Zeile 2 kommt, überschreibt 1.
3 überschreibt 2...
+= statt = nehmen, dann sieht man schon mehr.
 

Alex Großmann

Erfahrenes Mitglied
Funktioniert perfekt :D
Danke dir.

Nun nochmal zum Verständniss:
Die CSV wäre z.B.:
Code:
Name ; Name2 ; Straße ; Ort

Im Array würde jetzt an stelle 0 ( zeile[0] ) ALLE Namen stehen, an Stelle 1 alle "Namen2", Stelle 3 alle Straßen und Stelle 4 alle Orte. Zumindestens gibts es das so schon einmal aus...

Wenn ich nun das mit den Parametermethoden oben machen möchte, muss ich das momentane Array nochmal Splitten oder?!
Und vorallem, kann es ja sein das z.B. wenn ein Bundesland in der CSV als Spalte stände, es aber bei manchen Nutzern nicht eingetragen ist, das alles nicht mehr Stimmt?!
 

sheel

I love Asm
Im Array würde jetzt an stelle 0 ( zeile[0] ) ALLE Namen stehen, an Stelle 1 alle "Namen2", Stelle 3 alle Straßen und Stelle 4 alle Orte. Zumindestens gibts es das so schon einmal aus...
Was machst du? :confused:

kA,wo da alle Namen auf einmal herkommen sollen.
Wenn man Zeile für Zeile durchgeht hat man
doch nur jeweils eine Zeile, die man gleich inserten kann.

Und vorallem, kann es ja sein das z.B. wenn ein Bundesland in der CSV als Spalte stände, es aber bei manchen Nutzern nicht eingetragen ist, das alles nicht mehr Stimmt?!
Wenn eine Spalte nicht eingetragen ist bleibt ja trotzdem ein Leerbereich zwischen ;
a;b;c;;e
 

Alex Großmann

Erfahrenes Mitglied
Das stimmt :)

2 kleine Probleme gibts aber noch, an dennen ich grad übelst hänge...

zum einen können keine Umlaute aufgenommen werden? Da sind im DataGridView und in der Datenbank dann nur so Vierecke mit einem Fragezeichen drinnen...?

Und zum andern:
Ich mache ja ein INSERT INTO Befehl, der so aufgebaut ist:
Code:
 (...) = "INSERT INTO Kunde (name) VALUES ( ' "+informationen[0]+ " ' )";
In Informationen Feld 0 steht eben der Name.
Nun ist das Problem, das die Apostrophe im Values teil da sein müssen, nun hab ich da einen Namen welcher ein Apostroph in der Mitte hat...die Datenbank geht bis dahin, und der restliche Teil vom Namen wird dann als unbekannter Code gewertet, und mir schmiert das ganze Programm mit einer Exception ab -.-

Hast du dazu Anregungen?!

Grüße
 

deepthroat

Erfahrenes Mitglied
Hi.
zum einen können keine Umlaute aufgenommen werden? Da sind im DataGridView und in der Datenbank dann nur so Vierecke mit einem Fragezeichen drinnen...?
Du verwendest ein falsches Encoding. Woher kommen denn die Dateien?
Ich mache ja ein INSERT INTO Befehl, der so aufgebaut ist:
Code:
 (...) = "INSERT INTO Kunde (name) VALUES ( ' "+informationen[0]+ " ' )";
In Informationen Feld 0 steht eben der Name.
Nun ist das Problem, das die Apostrophe im Values teil da sein müssen, nun hab ich da einen Namen welcher ein Apostroph in der Mitte hat...die Datenbank geht bis dahin, und der restliche Teil vom Namen wird dann als unbekannter Code gewertet, und mir schmiert das ganze Programm mit einer Exception ab -.-
Siehe Beitrag #10 von sheel wie man es machen sollte.

\edit: Übrigens kann sqlite auch direkt (einfache) CSV Dateien importieren...

Gruß
 
Zuletzt bearbeitet:

Alex Großmann

Erfahrenes Mitglied
Ahh genau...mit den Paramethern hatte ich schon vergessen-.-
Danke nochmal.

Wie ändere ich das Encoding?
In der CSV werden alle Namen korrekt, auch mit Umlauten angezeigt...
Die Daten kommen aus nem anderen Programm, welches Zugriff auf die Kundendaten hat...auf dieses Programm habe ich jedoch keinen Zugriff, ich bekomme nur die CSV´s geschickt...


Und zu deinem Edit; das habe ich auch schon gelesen, jedoch möchte ich die Daten nicht direkt in die Datenbank schreiben, da das DatenGridView noch einige andere Punkte anbietet, außerdem soll es möglich sein die Daten nochmal zu Ändern...

Grüße und besten Dank!
 

Neue Beiträge