C# einlesen von datei

Du solltest aber trotzdem vermeiden, Strings mit dem Vergleichsoperator zu vergleichen. Das geht nicht immer gut.
Statt dessen solltest du die string.Equals() Methode benutzen, oder in diesem speziellen Fall, bei der Prüfung auf einen leeren String, die von BigNum vorgeschlagenen Methode string.IsNullOrEmpty().
 
Darlis schrieb:
Du solltest aber trotzdem vermeiden, Strings mit dem Vergleichsoperator zu vergleichen. Das geht nicht immer gut.
Wenn du die "String-==-Operator-Problematik" in Java meinst: Das gibts in C# (bzw. im .NET Framework) nicht. Strings kann man problemlos mit == vergleichen.
[Sollte man meiner Meinung aus semantischen Gründen sogar, weil sich Strings wie Wertetypen verhalten und man solche sonst auch ganz selbstverständlich mit == vergleicht.]

string.IsNullOrEmpty ist hier natürlich trotzdem sinnvoll. In erster Linie weil es besser lesbar ist.
 
Zuletzt bearbeitet:
Hey BigNum,

es ist mir jetzt übers WE folgendes problem eingefallen. wenn ich aus der 2. Datei daten einlese und in der Tabelle einfügen möchte, soll ich beachten, dass die zeilen richtig zu einander passen. das heisst, von der zweite Quell datein, muss ich die Tabelle mit der fehlende Informationen aus der Datei einfügen. zum Bsp. von der erste und "Bestellnummer" und "Geräte Typ". von der der zweite "Ort" und auch "Bestellnummer"...jede zeile dann soll mit der Richtigen Infos über das gerät gefüllt werden.

wie mache ich das denn??
Ergänzung ()

vielen Dank Jungs :)
 
Genau das habe ich Dir doch in Posting #19 (ab Deiner "2. Frage") erklärt:
Du legst eben keine neue Zeile an (mit "dtWorkTable.NewRow()"), sondern suchst Dir die passende vorhandene Zeile mit "dtWorkTable.Rows.Find(...)".

Und in der Initialisierung das "primary key"-Zeug nicht vergessen!


HTH

BigNum
 
Zuletzt bearbeitet:
ahhh, ok..wunderbar, danke ;-)
Ergänzung ()

BigNum, ich weiss nicht warum es nicht funktionniert?? ich habe es so gemacht:
Code:
         public DataTable ImportDatei2(DataTable dtWorkTable, string path)
         {

             if (File.Exists(path))                                                   // Überprüfen ob Datei existiert
             {
                 using (StreamReader sr = new StreamReader(path, Encoding.Default))
                 {
                     string line;                                                     // 
                     while ((line = sr.ReadLine()) != null)                           //  Schleife
                     {
                         string[] strS = line.Split(new Char[] { ';' });              // Spalten Trennung

                         if (strS[0].Trim() != "")                                    // Leere Zeile ausschneiden    if (!string.IsNullOrEmpty(strS[0]))
                         {                                                      
                             DataRow row = dtWorkTable.Rows.Find(BMK);                 // Entsprechende Spalte einfügen in der Tabelle

                             
                         }                       
                     }
                 }
                 return dtWorkTable;
             }
             else
             {
                 MessageBox.Show("Datei nicht gefunden");                  // Fehler Meldung falls Datei nicht gefunden
                 return null;
             }
         }

und in der tabelle #16 habe ich:
Code:
 DataColumn[] PrimaryKeyColumns = new DataColumn[1];
            PrimaryKeyColumns[0] = dtWorkTable.Columns["BMK"];
            dtWorkTable.PrimaryKey = PrimaryKeyColumns;
 
Parrain schrieb:
Code:
...
                     while ((line = sr.ReadLine()) != null)                           //  Schleife
                     {
                         string[] strS = line.Split(new Char[] { ';' });              // Spalten Trennung

                         if (strS[0].Trim() != "")                                    // Leere Zeile ausschneiden    if (!string.IsNullOrEmpty(strS[0]))
                         {                                                      
                             DataRow row = dtWorkTable.Rows.Find(BMK);                 // Entsprechende Spalte einfügen in der Tabelle

                             
                         }                       
...
Du musst in der Zeile "DataRow row = dtWorkTable.Rows.Find(BMK);" natürlich die Spalte nehmen, in der der BMK (was auch immer das ist) steht, also z.B.

DataRow row = dtWorkTable.Rows.Find(strS[0]);

vorausgesetzt, der BMK steht in der ersten Spalte Deiner Datei!
Dies kann allerdings nur funktionieren, wenn Du in Deiner "ImportGeräteliste"-Import Methode wie in Posting #18 angegeben die Spalte "BMK" auch befüllst!!!
Zudem fehlt im obigen Code noch das Setzen der eingelesenen Spalten, desweiteren solltest Du auch noch eine Abfrage einbauen, ob der BMK auch gefunden wurde.
Also sollte Dein Code ungefähr so aussehen:
Code:
...
                     while ((line = sr.ReadLine()) != null)                           //  Schleife
                     {
                         string[] strS = line.Split(new Char[] { ';' });              // Spalten Trennung

                         if (strS[0].Trim() != "")                                    // Leere Zeile ausschneiden    if (!string.IsNullOrEmpty(strS[0]))
                         {                                                      
                             DataRow row = dtWorkTable.Rows.Find(strS[0]); // vorausgesetzt in der ersten Spalte ist BMK
                             if(row != null)
                             {
                                 row["Ort"]= strS[2]; // hier natürlich die richtige Zuordnung
                                 row["F_SIL"]= strS[7]; // hier natürlich die richtige Zuordnung
                                 usw.
                             }
                             else
                             {
                                 Fehler: BMK nicht gefunden!
                             }
                         }                       
...


HTH

BigNum
 
Danke BigNum für deine antwort..BMK ist eine Abkürzung. die Spalte habe ich schon zügefügt letztes mal und wird auch in der tabelle ausgegeben.
ich probier mal :-)
Danke
Ergänzung ()

bekomme immer eine fehler meldung (Die Spalte 'BMK' hat die Einschränkung, dass sie eindeutig sein muss. Der Wert '-FC1' ist bereits vorhanden.) und zwar wo HIER steht:
Code:
public DataTable ImportGeräteliste(DataTable dtWorkTable, string path)
        {

            if (File.Exists(path))                                                  // Überprüfen ob Datei existiert
            { 
                using (StreamReader sr = new StreamReader(path, Encoding.Default))
                { 
                    string line;                                                    // 
                    while ((line = sr.ReadLine()) != null)                          //  Schleife
                    {                        
                        string[] strS = line.Split(new Char[] { '§' });             // Spalten Trennung
 
                        if (strS[0].Trim() != "")                                  // Leere Zeile ausschneiden    if (!string.IsNullOrEmpty(strS[0]))
                        {
                            DataRow row = dtWorkTable.NewRow();                     // Neue Zeile Definieren

                            row["Hersteller"] = strS[5].Trim();                     // Einträge einfügen   und Leerraumzeichen entfernen mit Trim()
                            row["Bestellnummer"] = strS[6].Trim();                  // Einträge einfügen  
                            row["Gerätetyp"] = strS[7].Trim();                      // Einträge einfügen  
                            row["BMK"] = strS[3].Trim();

                            dtWorkTable.Rows.Add(row);      //  HIER
                        }
                    }
                }
                return dtWorkTable;
            }
            else
            {
                MessageBox.Show("Datei nicht gefunden");                            // Fehler Meldung falls Datei nicht gefunden ist
                return null;
            }
        }


        public DataTable ImportDatei2(DataTable dtWorkTable, string path)
         {

             if (File.Exists(path))                                                   // Überprüfen ob Datei existiert
             {
                 using (StreamReader sr = new StreamReader(path, Encoding.Default))
                 {
                     string line;                                                     // 
                     while ((line = sr.ReadLine()) != null)                           //  Schleife
                     {
                         string[] strS = line.Split(new Char[] { ';' });              // Spalten Trennung

                         if (strS[0].Trim() != "")                                    // Leere Zeile ausschneiden    if (!string.IsNullOrEmpty(strS[0]))
                         {                                                      
                             DataRow row = dtWorkTable.Rows.Find(strS[9]);            // Finde Spalte mit BMK
                             if (row != null)                                         // Überprüfen 
                             {
                                 row["Ort"] = strS[8];                                // Eintrag Ort einfügen                                  
                             }
                             else
                             {
                                 MessageBox.Show("Betriebsmittelkennzeichen nicht gefunden");               // Fehler Meldung falls BMK nicht gefunden ist
                             }
                         }                       
                     }
                 }
                 return dtWorkTable;
             }
             else
             {
                 MessageBox.Show("Datei nicht gefunden");                             // Fehler Meldung falls Datei nicht gefunden ist
                 return null;
             }
         }

in der Tabelle sieht es so aus :
Code:
DataColumn[] PrimaryKeyColumns = new DataColumn[1];
            PrimaryKeyColumns[0] = dtWorkTable.Columns["BMK"];
            dtWorkTable.PrimaryKey = PrimaryKeyColumns;

von der zweite tabelle muss ich nur noch die eine spalte ablesen "Ort"
 
Zuletzt bearbeitet:
Das Problem ist, dass in deiner Datei die selbe BMK mehrfach vorkommt. Da diese in deiner Tabelle aber nur einmal vorkommen darf (Primary Key), bekommst du eine Fehlermeldung.

Lösungen:
- Die doppelte Zeile ignorieren
- Die vorhandene Zeile überschreiben
- Eine weitere Spalte zum Primary Key machen
- Den Fehler in den Stammdaten korrigieren (Falls die BMK eindeutig sein soll, würde ich das empfehlen)
 
Parrain schrieb:
bekomme immer eine fehler meldung (Die Spalte 'BMK' hat die Einschränkung, dass sie eindeutig sein muss. Der Wert '-FC1' ist bereits vorhanden.) und zwar wo HIER steht:
Ich denke Du solltest erst einmal verstehen was man unter einem Schlüssel bzw. Primärschlüssel versteht.

Ein Beispiel für einen Schlüssel ist z.B. der Code Insee.

Wenn Du verstanden hast, was ein Schlüssel ist, solltest Du Dich fragen, ob BMK ein Schlüssel ist/sein kann.

Ergänzend zu Darlis Ausführungen kann man vielleicht noch sagen, daß es auch die Möglichkeit eines "zusammengestzten Schlüssels" gibt. Ein Beispiel hierfür wäre die Hausnummer, welche innerhalb einer Straße eindeutig ist, innerhalb einer Stadt aber nicht.
Man könnte aber innerhalb einer Stadt einen (zusammengesetzten) Schlüssel aus Straßenname und Hausnummer bilden.

Analog dazu könnte (nicht muss) es z.B. sein, daß BMK ein Teil eines zusammengesetzten Schlüssels ist. Aber ohne die Daten zu kennen ist das nur Raterei...


HTH

BigNum
 
Also für mich sollte nach was ich verstanden habe über die Rolle des PrimaryKey, zw. der beide Datein einen gemeinsamen schnittpunkt herausgefunden. In meinem Fall wird es das BMK sein, weil der in beide Datein gibt.
Das heisst, ich habe die benötigte spalte aus der 1. Datei eingelesen, mit hilfe des PrimaryKey werde ich aus der 2. Datei die spalte die ich noch brauche, also "Ort", einlesen. Aber die Zeilen aus der 2. Datei werden in der richtige zeile in meiner dtWorkTable zügefügt.
Also wenn ich als bsp. das in der dtdWorkTable habe:

Lars; Berlin; 1980;
Mike; Frankfurt; 1970;
clara; Hamburg; 1990;
Laura; Bremen; 2000;

und in der 2. Datei:

Mike; Elektriker;
Laura, Student;

dann wird das gefiltert und die berufe in der dtWorkTable in der zugehörige zeile eingefügt. Wobei die spalte mit der Namen der PrimaryKey ist.

Grüße :)
 
Zuletzt bearbeitet:
Parrain schrieb:
Also für mich sollte nach was ich verstanden habe über die Rolle des PrimaryKey, zw. der beide Datein einen gemeinsamen schnittpunkt herausgefunden. In meinem Fall wird es das BMK sein, weil der in beide Datein gibt.
Das ist (leider) nur ein Teil der Wahrheit und Dein obiger Fehler (der in Post #27: "Die Spalte 'BMK' hat die Einschränkung, dass sie eindeutig sein muss. Der Wert '-FC1' ist bereits vorhanden.") zeigt, daß noch irgendwo der Hund begraben ist!
Aber der Einzige, der alle Fakten hat um diese Fragestellung zu beantworten bist Du!

Also solltest Du Dir die Frage stellen: Durch welche Kriterien (Spalten, oder Teile daraus) ist ein "Item" eindeutig festgelegt?

Parrain schrieb:
Das heisst, ich habe die benötigte spalte aus der 1. Datei eingelesen, mit hilfe des PrimaryKey werde ich aus der 2. Datei die spalte die ich noch brauche, also "Ort", einlesen. Aber die Zeilen aus der 2. Datei werden in der richtige zeile in meiner dtWorkTable zügefügt.
Also wenn ich als bsp. das in der dtdWorkTable habe:

Lars; Berlin; 1980;
Mike; Frankfurt; 1970;
clara; Hamburg; 1990;
Laura; Bremen; 2000;

und in der 2. Datei:

Mike; Elektriker;
Laura, Student;

dann wird das gefiltert und die berufe in der dtWorkTable in der zugehörige zeile eingefügt. Wobei die spalte mit der Namen der PrimaryKey ist.
Soweit ist es mir schon klar, nur die Alles entscheidende Frage ist: Ist BMK als (alleiniger) Primary Key tauglich?
Falls Ja, dann liegt irgendwo in Deinen Import-Daten ein Fehler, da ein BMK-Wert doppelt vorkommt.
Falls Nein, dann musst Du Dir entweder einen anderen Primary Key suchen, oder einen zusammengestzten Schlüssel bilden.

Um bei Deinem obigen Beispiel zu bleiben:
Angenommen Deine erste Tabelle lautet

Lars; Bender; Berlin; 1980;
Mike; Bender; Frankfurt; 1970;
clara; Schubert; Hamburg; 1990;
Laura; Schmidt; Bremen; 2000;
Mike; Schmidt; München; 1988;

dann reicht der "Vorname" als Primary Key nicht, da "Mike" nicht mehr eindeutig ist, Du musst (bzw. könntest) Dir also einen zusammengesetzten Schlüssel aus "Vorname" und "Nachname" bauen und für die Daten aus der zweiten Tabelle z.B. irgendein Kriterium finden welcher "Mike" denn gemeint ist...


HTH

BigNum
 
Hi BigNum,
du hast in alle punkte recht gehabt, das BMK kommt mehrmals vor...und wie du es auch gesagt hast habe ich mir überlegt einen andere spalte als PrimaryKey zu nehmen.
ich werde es jetzt probieren, und melde mich nochmal.
Vielen Dank :)

Grüße
Ergänzung ()

Hi BigNum,

ich kriege das definitiv nicht mit PrimaryKey, weil in der selbe spalte wiederholen sich zum Bsp. BMK, name, vorname mehrmals..

was meinst du über das hier:
Code:
 if (File.Exists(Path) && dtWorkTable.Select("Funktion Like '" + strS[1] + "' AND Ort Like '" + strS[2] + "' AND BMK Like '" + strS[3] + "'").Length == 0)

oder ich soll es mit 3 Fachen PrimaryKey machen!!! geht das??? und zwar mit Funktion, Ort und BMK..
wenn ja, WIE????? :(

Grüße
 
Zuletzt bearbeitet:
Wenn du schon den Ort hinzunehmen musst stimmt doch irgendetwas mit deinen Daten nicht. Ist denn die Bestellnummer nicht eindeutig?

Abgesehen davon: Wenn du in der 2. Datei nur die Bestellnummer zum zuordnen hast, hast du doch keine andere Wahl, als alle Zeilen, in denen diese Bestellnummer vorkommt, mit den Daten aus der Datei zu aktualisieren. Oder kannst du diese doch irgendwie eindeutig zuordnen?

Wie sieht denn die 2. Datei aus? Sind die Daten denn dort eindeutig (nur eine Bestellnummer/BMK/wasauchimmer)?
 
Hi Darlis,

Die bestellnummer habe ich in nur eine datei, und zwar die erste. und ie habe ich auch schon herausgefiltert und in dert DataTable eingefügt..
Der gemeinsammen nenner zw. beide datein sind (BMK, ort, Funktionsgruppe). Der Ort bestimmt nur wo das Gerät in in einer anlage befindet.

Bei der zweite Datei wiederholen sich die werte des BMK, als auch die von Ort. Deshalb kann man die nicht als PrimaryKey nehmen. das erklärt die fehlermeldung die bekommt hatte. aber wenn noch die Funktion gruppe dazu kommt, dann wird's eindeutig.

für den grund habe ich gefragt ob man das PrimaryKey 3 fach benutzen kann, und wie???

Danke nochmal für eure antworten :)
 
Parrain schrieb:
für den grund habe ich gefragt ob man das PrimaryKey 3 fach benutzen kann, und wie???
Ja, das geht selbstverständlich und zwar so:
In der Initialisierung brauchst Du folgendes:
Code:
DataColumn[] PrimaryKeyColumns = new DataColumn[3];
PrimaryKeyColumns[0] = dtWorkTable.Columns["BMK"];
PrimaryKeyColumns[1] = dtWorkTable.Columns["Ort"];
PrimaryKeyColumns[2] = dtWorkTable.Columns["Funktionsgruppe"];
dtWorkTable.PrimaryKey = PrimaryKeyColumns;
Und bei der späteren "Find"-Mehtode
Code:
...
DataRow row = dtWorkTable.Rows.Find(...)
...
brauchst Du als Arguement statt eines einzelnen Wertes ein Array von 3 Werten (BMK, Ort, Funktionsgruppe) wie in

http://msdn.microsoft.com/en-us/library/system.data.datarowcollection

bzw.

http://msdn.microsoft.com/en-us/library/f6dh4x2h

beschrieben.

Allerdings habe ich den starken Eindruck, daß Du die Sache mit den Schlüsseln nicht wirklich verstanden hast, sondern versuchst Dich "irgenwie durchzuwursteln". Und damit wirst Du früher oder später Schiffbruch erleiden...

Ein anderer Vorschlag wäre den "Ersteller" der Import-Daten zu fragen, ob er Dir Hilfestellung bzgl. der Wahl de(s/r) Schlüssel geben kann.


HTH

BigNum
 
Hallo BigNum,

deine links haben mich sehr geholfen, das PrimaryKey besser zu verstehen..Danke :)

ich habe dann auch weiter andere sachen gelesen, und bin auf List<String> Exists-Methode gekommen..und bin jetzt davon überzeugt, dass es mein problem lösen wird.

link dazu:

http://msdn.microsoft.com/de-de/library/vstudio/bfed8bca.aspx

Ich sollte noch kurz über die 2. Datei sagen, das ich im art des primaryKey 4 spalten nehmen soll damit es eindeutig sein kann. also BMK, Funktionsgruppe, Ort und dann auch anschluß. im anschluß wiederholen sich manche Zeilen, aber die deuten auf das selbe Gerät. Deshalb werde ich sie überschreiben.

ich habe es dann angefangen zu schreiben, und so hat es sich bei mir ergibt:
Code:
List<String> ImportZuLiVCAM = new List<string>();

using (StreamReader sr = new StreamReader(path, Encoding.Default))
      {
                string line;
                while ((line = sr.ReadLine()) != null)  
               {
                       foreach (DataRow drWorkTable in dtWorkTable.Rows)
                      {
                           string strT = "xxxxx";
                           try { strT = line.Split(';')[9].ToString().Trim(); }
                           catch { }//notwendig da Exportdatei fehlerhaft

                    
                           if (strT == drWorkTable["BMK"].ToString().Trim())
                          {
                                 string[] strS = line.Split(new Char[] { ';' });

                                 strT = strS[11].Remove(0, 1).Split('.')[0].Replace('W', '_').Trim();

                                 switch (strS[10].Trim())
                                 {
                             case "1":
                                 drWorkTable["E/A-Adresse"] = strT;
                                 break;
                             case "2":
                                 drWorkTable["E/A-Adresse"] = strT;
                                 break;
                             case "I1":
                                 drWorkTable["E/A-Adresse"] = strT;
                                 break;
                             case "SI1":
                                 drWorkTable["E/A-Adresse"] = strT;
                                 break;
                             case "FI.0":
                                 drWorkTable["E/A-Adresse"] = strT;
                                 break;
                             case "X10:PE":
                                 drWorkTable["E/A-Adresse"] = strT;
                                 break;
                             default:
                                 break;
                         }
                     }
                 }

             }
        }

             return dtWorkTable; 
}


was meinst du, und was könnte mir vielleicht hier fehlen..
vielen dank:)
Ergänzung ()

hi, es funktioniert..aber es dauert lang bis das ergebnis raus kommt :( über 10 min
wegen endlose schleife, denke ich.. was kann ich da machen
 
Zuletzt bearbeitet:
Zeile 11: Du splittest den String aus der zweiten Datei für jede Zeile in der Tabelle. Es reicht aus, wenn du das einmal außerhalb der inneren Schleife machst.
Zeile 15: Du rufst auf einen Wert aus der Tabelle Trim() auf. Sind die Daten denn nicht schon "sauber".
Zeile 19: Das du strT einen anderen Wert zuweist finde ich verwirrend. Nimm eine neue Variable und benenne sie entsprechend.
Zeile 11&17: Du splittest mehrmals. Speichere das Zwischenergebnis.
Zeile 19: Anscheinend werden die Daten nur überschrieben, wenn die neuen Daten bestimme Kriterien erfüllen -> vor die Schleife ziehen.

Der gemeinsammen nenner zw. beide datein sind (BMK, ort, Funktionsgruppe)
Du vergleichst hier aber nur BMK.

Wo ist eigentlich die Endlosschleife?
 
Hallo Darlis, ja ich habe hier nur mit BMK verglichen, ich wollte probieren ob es klappt, weil ich noch eine andere spalte dazu genommen habe, mit dem es funktioniert (Anschluss).

Die datein sind nicht sauber leider, großes leer abstand.

wie kann ich zwichenergebnis speichern??

Das mit den strT habe ich nicht so verstanden wie du es meinst? Die daten werden überschrieben ja, weil wie gesagt manchmal wiederholen sich die Anschluß werte.

ich danke dir sehr für deine hilfe, ich werde gleich das umsetzen, und probieren wie es wird. ich sag noch bescheid :-)
 
Zuletzt bearbeitet:
Parrain schrieb:
Die datein sind nicht sauber leider, großes leer abstand.
Ich meinte die Daten, die du schon in die Tabelle geschrieben hast. Und nach Post #27 sind die schon mit Trim() behandelt worden. Den weiteren Aufruf kannst du dir also sparen.

Parrain schrieb:
Das mit den strT habe ich nicht so verstanden wie du es meinst? Die daten werden überschrieben ja, weil wie gesagt manchmal wiederholen sich die Anschluß werte.
Ich galube, du hast mich nicht richtig verstanden. Mir geht es rein um leserlichen Code. Du weist srtT einmal line.Split(';')[9] und später line.Split(';')[11] zu, was doch semantisch zwei vollkommen unterschiedliche Felder sind. Wenn du übermorgen nochmal auf den Code schaust, wirst du nicht mehr wissen, warum du das gemacht hast. Sprechende Variablennamen helfen hier ungemein.
Also in Zeile 10: string bmk = "xxxxx";
und ab Zeile 18: string eaAddress = strS[11]...
 
ah ok Darlis ich verstehe jetzt was du meinst, ich habe gedacht ich sollte das auch für die zweite datei machen deshalb das Trim().

mit [9] und [11] greife ich auf der spalte BMK und E/A-Adresse..

wie soll es dann allgemein aussehen?? ich versuche gerade nach deine anweisung es zu verbessern..

Grüße
Ergänzung ()

bin total durch einander gerraten :-D
ich kriege das nicht hin..
 
Zuletzt bearbeitet:
Zurück
Oben