Hallo,
ich habe folgendes Problem, vielleicht kann mir jemand helfen.
Ich möchte die folgenden Daten in einem mehrdimensiolanen Array speichern.
Ich kenne aber die genaue Anzahl der Spalten und Zeilen nicht, wie mache ich das?
Vielleicht eine andere Datenstruktur nutzen? ArrayList? Anschließend wollte ich jedes Datum in einer Datenbank speichern.
Text1...Text2...Text3...Text4….1n
000.....0004.....0006.....0008... ,,,
001.....0004.....0004.....0004....,,,
002.....0005.....0004.....0004....,,,
006.....0005.....0004.....0004....,,,
.. ....
Danke
Hallo niko8380,
==> Jagged Arrays (natürlich nicht mit Arrays, sondern mit List<T>)
herbivore
hallo herbivore.
Vielen Dank für deine super schnelle Antwort.
Könntest du aber bitte noch ein kleines bishen konkreter werden, wie ich das jetzt machen muss? List<T>?? Ich bin halt ein Anfänger und fast am verzweifeln
Hallo niko8380,
du suchst erstmal, was jagged Arrays sind und dann machst du das gleiche bloß mit List<T>. Was dem Array sein T[] ist dem der Liste sein List<T>.
herbivore
hallo, da bi nich nochmal.
habe jetzt eine :
List<string> list = new List<string>();
list.Add(myString); //myString speichert die aktuell gelesene Zeile
foreach (string listEl in list)
{
Console.WriteLine(listEl);//testausgabe
}
herbivore´s Vorschlag war jetzt, wenn ich es richtig verstanden habe 😉 so etwas zu machen:
List<string>list = new List<string>();
list.Add(new List<string>());
Ich weiss nicht wie ich verzweigte List<T> durchlaufen kann und dynamisch mit Werten füllen kann. Bei den Arrays habe ich doch z.b. die T_[j]. also i,j indizes mit den ich genua ein Element ansprechen kann. Wie geht das bei List<>?
Bei meinen Daten beinhaltet nur die erste Zeile Elemente vom Typ String, alle weiteren Zeile sind eigentlich double , und so müssen sie auch in die DB gespeichert werden.
Wenn mir jemand ein wenig helfen kann evtl mit einem Beispiel, wäre schon ganz nett. Ich habe schon im inet gesucht, im Galileo.... und im Buch von Krause und Bünnign aber nichts hat bisher geholfen.
gruß
niko8380
Hallo niko8380,
string [] [] ist doch nichts anderes als ein ein Array, das String-Arrays enthält. Entsprechend wäre das List<List<String>>.
herbivore
hallo herbivore,
ich verstehen die Theorie(einigermaßen) aber beim umsetzten hapert es gewaltig.
Kannst du mir, wenn dir das keine große Umstände macht, an einem Beispile aufzeigen wir du das machen würdest?Oder auch jemand anderes! ich einem anderem Thread habe ich zwar etwas gefunden was meiner bisherigen Vorgehensweise sehr ähnlich ist, aber am ende benutzt derjenige ein 2D array zu speichern der Daten.
Gruß
niko8380
Hallo niko8380,
benutzen tut man es wie jagged Arrays und dazu gibt es ja eigentlich genug Beispiele.
herbivore
List<List<string>> liste = new List<List<string>>();
List<string> eintrag = new List<string>();
eintrag.Add("Hallo!");
liste.Add(eintrag);
eintrag = new List<string>();
eintrag.Add("Na");
eintrag.Add("wie");
eintrag.Add("gehts?");
liste.Add(eintrag);
foreach(List<string> element in liste) {
foreach(string s in element) {
Console.WriteLine("{0} ",s);
}
Console.WriteLine();
}
Sollte dann ausgeben
Hallo!
Na wie gehts?
Vielen dank sheitman(für das Beispiel) und herbivore für die bsiherige antworten!
kann jemand über meine code schauen und mir evtl. sagen was ich anders machen kann bzw. muss, damit das funktioniert?!!!
static void Main(string[] args)
{
FileStream stream = new FileStream("c:\\mdaten\\text2klein.txt", FileMode.Open);
StreamReader objReader = new StreamReader(stream);
string myString = "";
string[] myStringArray;
List<List<string>> liste = new List<List<string>>();
//List<string> buffer = new List<string>();
while ((myString = objReader.ReadLine()) != null)
{
//buffer.Add(myString);
if (myString.Length > 1)
{
myStringArray = myString.Trim().Split(new char[]{ ' ', '\n', '\t' }); //String wird gesplittet und jeder wert ein einem array gespeichert
List<string> innerListe = new List<string>();
for (int e = 0; e < liste.Count; e++)
{
innerListe = new List<string>();
for (int i = 0; i < myStringArray.Length; i++)
{
innerListe.Add(myStringArray[i]);
}
liste.Add(innerListe);
}
}
}
}
}
}
Gruß
niko8380
Hallo niko8380,
kannst du bitte erstmal schreiben, was nicht funktioniert?
herbivore
hallo herbivore und an alle anderen,
z.B. for (int e = 0; e < liste.Count; e++), das "liste.count" scheint mir nicht optimal zu sein, den die schleife wird nicht durchlaufen, 😉 deshalb habe ich die Liste buffer als Hilfe dazugenommen aber das gefällt mir nicht.
Ist der Aufbau generell richtig für eine List<List<string>>???
Habe mich an das Beispiel von sheitman orientiert.
Gruß
niko8380
das problem ebsteht wohl in dem codeabschnitt
List<string> innerListe = new List<string>();
for (int e = 0; e < liste.Count; e++) {
innerListe = new List<string>();
for (int i = 0; i < myStringArray.Length; i++) {
innerListe.Add(myStringArray[i]);
}
liste.Add(innerListe);
}
for (int e = 0; e < liste.Count; e++) {
macht ja keinen sinn, da deine liste ja noch leer ist... diese äußere schleife kann imho komplett enfallen
übrig bleibt dann
innerListe = new List<string>();
for (int i = 0; i < myStringArray.Length; i++) {
innerListe.Add(myStringArray[i]);
}
liste.Add(innerListe);
was funktionieren und ausreichen müßte
komplett würde das also so aussehen
static void Main(string[] args) {
FileStream stream = new FileStream("c:\\mdaten\\text2klein.txt", FileMode.Open);
StreamReader objReader = new StreamReader(stream);
string myString = "";
string[] myStringArray;
List<List<string>> liste = new List<List<string>>();
List<string> innerListe = null;
while ((myString = objReader.ReadLine()) != null) {
if (myString.Length > 1) { //SOLLTE DAS NICHT > 0 SEIN UND MIT TRIM()?
//String wird gesplittet und jeder wert ein einem array gespeichert
myStringArray = myString.Trim().Split(new char[]{ ' ', '\n', '\t' });
innerListe = new List<string>();
for (int i = 0; i < myStringArray.Length; i++) {
innerListe.Add(myStringArray[i]);
}
liste.Add(innerListe);
}
}
}
Hallo.
ich habe jetzt eine 2D Liste, mit Elemente vom Typ <string>.
Außer der ersten Zeile(s.o) meiner Datei, in der die die Name der Spalten stehen,
sind die restlichen Werte eigentlich vom Typ <double>.Muss ich nicht die Werte irgendwie in double konvertieren damit ich sie so auch in der Datenbank speichern kann??Ich möchte später, mit diesen Werten aus der Datenbank arbeiten und ich brauche sie doch als double.
Soll ich meine "konstruktion" verändern, d.h. in List<double> usw. ändern oder kann ich irgendwie konvertieren?
Generell:
Soll ich einen DataSet benutzen um die Daten in in die DB zu speichern, was meint ihr?
Danke für eure Zeit und Geduld 😉
Gruß
Niko8380
um von string nach double zu konvertieren kannst du
double d = Convert.ToDouble("2.3");
du kansnt statt nem dataset auch einfach mit datatable arbeiten 😉
for (int i = 0; i < data.Length; i++)
{
data[i] = lines[i].Split(new char[] { ' ', '\n', '\t' }); //Array wird "gesplittet"
}
for (int s = 1; s < data.Length; s++)
{
for (int z = 0; z < data[s].Length; z++)
{
meineConnection.Open();
double c = Convert.ToDouble(data[s][z]);
SqlCommand meinCommand = new SqlCommand("INSERT INTO Messwert(MessWert) VALUES(c)", meineConnection);
meinCommand.ExecuteNonQuery();
meine.Connection.Close();
}
}
ich bekomme dauernd folgende Fehlermeldung:
System.FormatException: Die Eingabezeichenfolge hat das falsche Format.
bei System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
bei System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) bei
Was mache ich da falsch??
würd sagen schau dir mal mit dem debugger an wie die zeichenkette aussieht die er im ToDouble benutzen möchte...
ansonsten gibt es noch Convert.ToDouble(String, IFormatProvider)
der zweite parameter gibt dabei vor wie der string formatiert ist bzw. wie er mit der formatierung umgehen soll (, oder . als kommazeichen etc.) ... einfach mal in die hilfe schaun
hallo nochmal.
ich glaube ich habe ein mögliche Problemstelle gefunden und zwar hat meine eingelesen Datei, an manchen Stellen, leider, zwei Tabulatoren(\t) hintereinander und erst dann kommt ein neuer Wert. So steht dann an dieser Stelle in einem -data~~[z]- ein leerer string(denke ich) und diesen kann er dann nicht in einem double konvertieren.
ich splitte mein array u.a. bei einem '\t' aber wie sage ich ihm jetzt das er das "Zweite" ('\t') ignorieren soll??
**Hat sich ERLEDIGT: **Ich habe in meinem array den Parameter "StringSplitOptions.RemoveEmptyEntries;" eingefügt der die leeren Strings entfernt. sieht jetzt so aus:
data_ = lines_.Trim().Split(new char[] { ' ', '\n', '\t' }, StringSplitOptions.RemoveEmptyEntries);
Sorry aber bevor ich poste benutzte ich die Suche intensiv.
Gruß
niko8380