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

Alex Großmann

Erfahrenes Mitglied
Hallo liebes Forum,

seit einiger Zeit versuche ich verzweifelt eine CSV Datei einzulesen.

Ich müsste das ; rauswerfen, und noch ein paar Begriffe (sind die Überschriften der Spalten) rauswerfen, welche in der 1. Zeile stehen.
Außerdem würd ich gerne die Wörter die zwischen den ";" sind in einzelnen Arrays schreiben.

Habt Ihr da Ideen?!

Vielen Dank im Vorraus!
 

sheel

I love Asm
Hi

verschoben.

Wo liegt genau das Problem?
Um die erste Zeile auszulassen: nac dem Einlesen einfach nicht verarbeiten.
Array der Teile: String.Split
 

Alex Großmann

Erfahrenes Mitglied
Ah sheel <3 (d.h. mein Problem wird gelöst höhö)

Ich überspringe also die erste Zeile (z.B. mit ner Laufvariable) und lese dann mit ReadLine() ein?
Wie löscht man das Semikolon? Oder meinst du das man immer ein Split macht wenn ein Semikolon erscheint?

Danke nochmals
 

sheel

I love Asm
Ah sheel <3 (d.h. mein Problem wird gelöst höhö)
:)

Also, du hast sowas
Code:
a1;a2;a3
b1;b2;b3
c1;c2;c3
Und willst zuerst ein Array b1-b2-b3
dann c1-c2-c3...?
Oder hab ich das (noch) nicht richtig verstanden?

Zum Zeile überspringen:
Eine Zählvariable beeinflusst die Datei nicht, also nicht nötig/brauchbar.
Aber einfach ein einzelnes ReadLine am Anfang,
und mit der gelesenen Zeile nichts weiter machen...

Und zum Splitten: Geht viel einfacher, als bis zu ; einlesen usw.
Einfach einen String str mit Readline einlesen und dann
C#:
str.Split(';');
Fertig.
Split gibt ein komplettes Stringarray zurück, mit den einzelnen Teilen, ohne ;
 

Alex Großmann

Erfahrenes Mitglied
Ja, danke dir.
Das ist ja wirklich ne gute Möglichkeit!

Ich meinte halt das in etwa so:
Code:
a1;a2;a3
b1;b2;b3
c1;c2;c3

ich möchte gern b1, b2, b3 in einzelne Array, sagen wir das mal konkreter :

Code:
Name, Straße, Ort 
Alex, Heinzhampelweg, Heinzhausen
Otto, Friesenweg, Frieshausen

Nun möchte ich den Namen in ein Array, die Straße in ein anderes Array und der Ort ebenso.
Dann wird der Array direkt verarbeitet, und das Programm geht zur nächsten Zeile und macht das gleiche wieder von vorne.

Aber da kann ich ja im Prinzip so vorgehen wie in deinem Beispiel oder?
 

sheel

I love Asm
Aber da kann ich ja im Prinzip so vorgehen wie in deinem Beispiel oder?
Ja.
Dazu kommt dann noch die "Umschichtung".
Zuerst eben eine Zeile einlesen und auftrennen
und dann Namen etc. in die entsprechenden Arrays schreiben.

Falls du da aber in einem Array zB. alle Namen zusammensammeln willst
gibts noch das Problem, dass die Datei eventuell zu viel Zeilen für das Array hat.
Die Zeilenanzahl weiß man beim Anlegen ja noch nicht.

Man könnte in die Einleseschleife eine Abfrage einbauen, ob es zu voll wird,
und ggf. ein größeres Array anlegen und die Werte vom Alten ins neue übernehmen...
oder statt Arrays LinkedLists verwenden (keine fixe Größe).
Bei Bedarf kann man die List am Schluss, wenn alles drin ist, in ein Array kopieren
(da wird dann eben nur einmal eins angelegt).
 

Alex Großmann

Erfahrenes Mitglied
Wie groß kann den so ein Array werden? (War ja Speicher abhänig oder?) Mehr als z.B. 100 Namen etc. sind in einem Array nicht zu erwarten...

Ich wollte die Daten aus der CSV direkt in eine Datenbank einfügen (insert)... da wäre es ja gut wenn man die Daten im Array gesammelt hat, und dann über eine Zählschleife mit Datenbankabfragen einfügt... ?
 

sheel

I love Asm
Das Array kann weit über 100 speichern, das ist überhaupt kein Problem.
Nur:Wenn man im Programm eine fixe Größe wie 100 angegeben hat
und dann doch mal 101 kommen, was dann?

Aber:
Wozu brauchst du für die Db alle Namen zusammen, alle Orte zusammen etc.?
Da reicht doch, wenn man Name/Straße/Ort immer zusammen hat,
so wie es beim Split herauskommt.
(Um diese Arraygröße pro Zeile kümmert sich Split, da braucht man nichts selbst machen).
 

Alex Großmann

Erfahrenes Mitglied
Ja das Stimmt dann natürlich, da muss ich nur noch nen Komma einfügen wo das Semikolon ist?! Kann man des net einfach ersetzen? XD

Es heißt ja: Insert Into XY (Name, Straße, Ort) Values (String_Name, String_Straße, String_Ort) ?!
 

sheel

I love Asm
Wäre auch möglich.
Zuerst ; durch ',' ersetzen und dann am Anfang und am Ende noch jeweils ein ' dazu.
name;straße;ort
name','straße','ort
'name','straße','ort'
...
insert into ... values('name','straße','ort');


Aber, falls du es noch nicht hast: Die Parametermethode wäre besser statt String-zusammenbauen.
Grund 1: Sicherheit. Wenn der Name aus irgendeinem Grund zB. ein ' drin hat
kommt bei der Methode oben alles durcheinander.
Grund 2: Bei mehreren Inserts gehts mit Parameterzeug schneller

Beispiel (in C#-Syntax) (geändert von http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare(v=vs.71).aspx)
C#:
SqlCommand command = new SqlCommand(null, rConn);

//Vorbereiten
command.CommandText = "insert into Personen (Name, Strasse, Ort) values (@name, @strasse, @ort)" ;
command.Parameters.Add ( "@name", "nix da") ;
command.Parameters.Add ( "@strasse", "nix da") ;
command.Parameters.Add ( "@ort", "nix da") ;
command.Prepare() ;


//Insert 1
command.Parameters[0].Value = "Hans";
command.Parameters[1].Value = "Hansesteig";
command.Parameters[2].Value = "Hansestadt";
command.ExecuteNonQuery();

//Insert 2
command.Parameters[0].Value = "Willi";
command.Parameters[1].Value = "Wonka";
command.Parameters[2].Value = "Wien";
command.ExecuteNonQuery();

...
Und da brauchst du die Werte einzeln. Split.