{"id":55000269,"date":"2021-06-01T00:00:00","date_gmt":"2021-11-10T09:12:29","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=269"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"CSVDatei_in_Klassen_importieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/CSVDatei_in_Klassen_importieren\/","title":{"rendered":"CSV-Datei in Klassen importieren"},"content":{"rendered":"<p><b>Unter Access war es einfach: Dort haben wir eine CSV-Datei oder auch Excel-Tabellen einfach als verkn&uuml;pfte Tabelle eingebunden und konnten dann direkt auf die Daten zugreifen. Beispielsweise, um diese dann per Anf&uuml;geabfrage in die Zieltabelle zu schreiben. Unter Entity Framework ist das so nicht m&ouml;glich. Nat&uuml;rlich k&ouml;nnte man das &Ouml;ffnen der Datei von Hand realisieren und die einzelnen Elemente einlesen. Aber es gibt einen anderen, effizienteren Weg, den wir mit einem NuGet-Paket namens CsvHelper beschreiten k&ouml;nnen. Diese Klasse erlaubt es, die Zeilen einer CSV-Datei automatisch in die Elemente auf Basis einer entsprechenden Klasse einzulesen. Oder Sie k&ouml;nnen damit auch die Zeilen durchlaufen und die Inhalte auf Basis des Indexes oder der Spalten&uuml;berschrift einlesen und weiterverarbeiten.<\/b><\/p>\n<h2>CsvHelper hinzuf&uuml;gen<\/h2>\n<p>Das erw&auml;hnte NuGet-Paket <b>CsvHelper <\/b>f&uuml;gen wir &uuml;ber den Nuget-Paket-Manager hinzu, den Sie &uuml;ber den Men&uuml;eintrag <b>Projekt|NuGet-Pakete verwalten&#8230; <\/b>&ouml;ffnen. Hier wechseln Sie zum Bereich <b>Durchsuchen <\/b>und geben <b>csvhelper <\/b>in das Suchfeld ein. Es erscheint der Eintrag <b>CsvHelper<\/b>, den wir ausw&auml;hlen und mit einem Klick auf die Schaltfl&auml;che <b>Installieren <\/b>zum Projekt hinzuf&uuml;gen (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_269_001.png\" alt=\"Hinzuf&uuml;gen des CsvHelper-Pakets\" width=\"700\" height=\"401,3887\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Hinzuf&uuml;gen des CsvHelper-Pakets<\/span><\/b><\/p>\n<h2>Beispieldatei f&uuml;r den CSV-Import<\/h2>\n<p>Als Beispiel f&uuml;r die folgenden Importtechniken wollen wir eine CSV-Datei verwenden, die wir auf Basis der Tabelle <b>tblKunden<\/b> aus einer Access-Beispieldatenbank exportiert haben (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_269_002.png\" alt=\"Beispiel-Datei\" width=\"700\" height=\"322,8599\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Beispiel-Datei<\/span><\/b><\/p>\n<h2>Zielklasse f&uuml;r die Beispieldaten definieren<\/h2>\n<p>Das Ziel ist, die Daten aus einer <b>.csv<\/b>-Datei strukturiert zu erfassen, was in Form des Parsens direkt in Elemente einer Klasse geschehen soll. Dazu ben&ouml;tigen wir nat&uuml;rlich auch eine solche, und zwar eine namens <b>Kunde<\/b>. Diese definieren wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> Kunde\r\n     <span style=\"color:blue;\">Public <\/span>Property KundeID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property KundenCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Firma<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Kontaktperson<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Position<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Strasse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Ort<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Region<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property PLZ<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Land<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Telefon<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Telefax<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<h2>Benutzeroberfl&auml;che f&uuml;r die Beispiele<\/h2>\n<p>Die Beispiele wollen wir in der Benutzeroberfl&auml;che der Anwendung darstellen. Dazu f&uuml;gen wir einige Elemente hinzu:<\/p>\n<ul>\n<li>Textfeld <b>txtImportFile <\/b>zur Eingabe\/Anzeige der einzulesenden Datei<\/li>\n<li>Schaltfl&auml;che <b>btnChooseFile <\/b>zum &Ouml;ffnen eines Dateiauswahl-Dialogs<\/li>\n<li>Schaltfl&auml;che <b>btnImportNoAssignment <\/b>zum Starten des ersten Beispiels f&uuml;r den Einlesevorgang<\/li>\n<li>DataGrid <b>dgrKunden <\/b>zur Anzeige der eingelesenen Daten<\/li>\n<\/ul>\n<p>Die Steuerelemente ordnen wir wie in Bild 3 an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_269_003.png\" alt=\"Benutzeroberfl&auml;che f&uuml;r die Beispiele\" width=\"700\" height=\"398,6809\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Benutzeroberfl&auml;che f&uuml;r die Beispiele<\/span><\/b><\/p>\n<p>Die Elemente definieren wir per XAML-Code wie folgt:<\/p>\n<pre>&lt;Grid&gt;\r\n    &lt;Grid.RowDefinitions&gt;\r\n       &lt;RowDefinition Height=\"Auto\"&gt;&lt;\/RowDefinition&gt;\r\n       &lt;RowDefinition Height=\"Auto\"&gt;&lt;\/RowDefinition&gt;\r\n       &lt;RowDefinition Height=\"*\"&gt;&lt;\/RowDefinition&gt;\r\n       &lt;RowDefinition Height=\"Auto\"&gt;&lt;\/RowDefinition&gt;\r\n    &lt;\/Grid.RowDefinitions&gt;\r\n    &lt;GroupBox Header=\"Beispiele Artikel CSV-Datei in Klassen importieren\" FontWeight=\"Bold\" Grid.Row=\"0\"&gt;\r\n       &lt;ContentControl FontWeight=\"Normal\"&gt;\r\n          &lt;StackPanel Orientation=\"Vertical\"&gt;\r\n             &lt;Grid&gt;\r\n                &lt;Grid.ColumnDefinitions&gt;\r\n                   &lt;ColumnDefinition Width=\"Auto\"&gt;&lt;\/ColumnDefinition&gt;\r\n                   &lt;ColumnDefinition Width=\"*\"&gt;&lt;\/ColumnDefinition&gt;\r\n                   &lt;ColumnDefinition Width=\"Auto\"&gt;&lt;\/ColumnDefinition&gt;\r\n                &lt;\/Grid.ColumnDefinitions&gt;\r\n                &lt;Label Grid.Column=\"0\"&gt;Datei:&lt;\/Label&gt;\r\n                &lt;TextBox x:Name=\"txtImportfile\" Grid.Column=\"1\" HorizontalAlignment=\"Stretch\"&gt;&lt;\/TextBox&gt;\r\n                &lt;Button x:Name=\"btnChooseFile\" Grid.Column=\"2\"  \r\n                   Click=\"btnChooseFile_Click\"&gt;Datei ausw&auml;hlen&lt;\/Button&gt;\r\n             &lt;\/Grid&gt;\r\n             &lt;StackPanel Orientation=\"Horizontal\"&gt;\r\n                &lt;Button x:Name=\"btnImportNoAssignment\" \r\n                   Click=\"btnImportNoAssignment_Click\"&gt;Ohne Zuordnung einlesen&lt;\/Button&gt;\r\n             &lt;\/StackPanel&gt;\r\n          &lt;\/StackPanel&gt;\r\n       &lt;\/ContentControl&gt;\r\n    &lt;\/GroupBox&gt;\r\n    &lt;Label Grid.Row=\"1\"&gt;Eingelesene Eintr&auml;ge:&lt;\/Label&gt;\r\n    &lt;DataGrid x:Name=\"dgrKunden\" Grid.Row=\"2\"&gt;&lt;\/DataGrid&gt;\r\n&lt;\/Grid&gt;<\/pre>\n<h2>CSV-Datei ausw&auml;hlen<\/h2>\n<p>Um die Datei auszuw&auml;hlen, kann der Benutzer mit der Schaltfl&auml;che <b>btnChooseFile <\/b>einen Dateiauswahldialog &ouml;ffnen. F&uuml;r den Code ben&ouml;tigen wir die folgende <b>Imports Namespace<\/b>-Anweisung:<\/p>\n<pre>Imports Microsoft.Win32 <\/pre>\n<p>Die Schaltfl&auml;che l&ouml;st die folgende Methode aus. Hier stellen wir das Verzeichnis auf das aktuelle Anwendungsverzeichnis ein (also das Verzeichnis, in dem sich die <b>.exe<\/b>-Datei befindet). Au&szlig;erdem legen wir die Standarddateiendung auf <b>.csv <\/b>fest. Danach &ouml;ffnen wir den Dialog und lesen das Ergebnis in das Textfeld <b>txtImportfile <\/b>ein:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnChooseFile_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     <span style=\"color:blue;\">Dim <\/span>objOpenFileDialog<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> OpenFileDialog\r\n     objOpenFileDialog.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory\r\n     objOpenFileDialog.DefaultExt = \".csv\"\r\n     <span style=\"color:blue;\">If <\/span>(objOpenFileDialog.ShowDialog = <span style=\"color:blue;\">True<\/span>)<span style=\"color:blue;\"> Then<\/span>\r\n         txtImportfile.Text = objOpenFileDialog.FileName\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Einlesen mit Spalten&uuml;berschriften, aber ohne Mapping<\/h2>\n<p>Die einfachste Art, die Daten aus der CSV-Datei in eine Auflistung mit Elementen des Typs <b>Kunde <\/b>einzulesen, ist die hinter der Schaltfl&auml;che <b>btnImportNoAssignment<\/b>.<\/p>\n<p>F&uuml;r die Anweisungen in dieser Methode ben&ouml;tigen wir einige Namespaces, die wir wie folgt deklarieren:<\/p>\n<pre>Imports System.Globalization\r\nImports System.IO\r\nImports System.Text\r\nImports CsvHelper<\/pre>\n<p>In der Methode definieren wir je ein Element der Typen <b>StreamReader <\/b>und <b>CsvReader<\/b>. Dann schreibt die Prozedur den Inhalt des Textfeldes <b>txtImportfile <\/b>in die Variable <b>strImportFile<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnImportNoAssignment_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     <span style=\"color:blue;\">Dim <\/span>strImportFile<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objReader<span style=\"color:blue;\"> As <\/span>StreamReader\r\n     <span style=\"color:blue;\">Dim <\/span>objCsvReader<span style=\"color:blue;\"> As <\/span>CsvReader\r\n     <span style=\"color:blue;\">Dim <\/span>objRecords<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objKunde<span style=\"color:blue;\"> As <\/span>Kunde\r\n     <span style=\"color:blue;\">Dim <\/span>objKunden<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> List(Of Kunde)\r\n     strImportFile = txtImportfile.Text<\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000269\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000269?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000269\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"fcbe9f97aa\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Unter Access war es einfach: Dort haben wir eine CSV-Datei oder auch Excel-Tabellen einfach als verkn&uuml;pfte Tabelle eingebunden und konnten dann direkt auf die Daten zugreifen. Beispielsweise, um diese dann per Anf&uuml;geabfrage in die Zieltabelle zu schreiben. Unter Entity Framework ist das so nicht m&ouml;glich. Nat&uuml;rlich k&ouml;nnte man das &Ouml;ffnen der Datei von Hand realisieren und die einzelnen Elemente einlesen. Aber es gibt einen anderen, effizienteren Weg, den wir mit einem NuGet-Paket namens CsvHelper beschreiten k&ouml;nnen. Diese Klasse erlaubt es, die Zeilen einer CSV-Datei automatisch in die Elemente auf Basis einer entsprechenden Klasse einzulesen. Oder Sie k&ouml;nnen damit auch die Zeilen durchlaufen und die Inhalte auf Basis des Indexes oder der Spalten&uuml;berschrift einlesen und weiterverarbeiten.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662021,66032021,44000035,44000021,44000012],"tags":[],"yst_prominent_words":[],"class_list":["post-55000269","post","type-post","status-publish","format-standard","hentry","category-662021","category-66032021","category-COMDLLs_programmieren","category-Entity_Framework","category-Interaktiv"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000269","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000269"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000269\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000269"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000269"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000269"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000269"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}