Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
CSV Import mit Datum als String
Silentwolf
myCSharp.de - Member



Dabei seit:
Beiträge: 17
Herkunft: Österreich

Themenstarter:

CSV Import mit Datum als String

beantworten | zitieren | melden

Hallo liebe Leute,

Ich würde gerne einen gespeicherten Bankauszug in CSV Format in meine SQL Datenbank importieren.

Ein Feld in diesem Auszug ist "Umsatzzeit" Formatiert als: "YYYY"-"MM"-"DD"-"hh"."mm"."ss"."zsssss"
Die letzen 6 Zeichen sind also Millisecunden bin mir aber nicht sicher wie man das korrekt darstellt. Sollte aber glaub kein Problem sein.

Für diesen Zweck habe ich mal eine Klasse erstellt.
Mit den einzelnen Feldern als Properties.

Wie müsste ich denn das besagt Feld als Property nun erstellen?
Mein erster Ansatz wäre gewesen es als DateTime zu speichern wie im Beispiel.


        private DateTime _umsatzzeit;

        public DateTime Umsatzzeit
        {
            get { return _umsatzzeit; }
        }


Müsste ich aber dann sicherlich noch parsen damit ich auch ein vernüftiges Datum bekomme oder?

Oder einfach als String deklarieren und einfach als solchen in die Datenbank übergeben?
Wird ja eigentlich nur als Referenz verwendet und könnte ja durchaus als String gespeichert werden.

Wie ist der beste Ansatz oder wie macht Ihr solche "Date Time" Properties.

Hoffe das ist verständlich ausgedrück und hoffe jemand kann mir nur diesbezüglich einen Tipp geben?

Vielen Dank

Albert
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 437
Herkunft: Kassel

beantworten | zitieren | melden

Du wirst die CSV Datenspalte parsen müssen. Beim einlesen ist es ja nur ein String.

DateTime (Docs) bietet dafür die statische DateTime.TryParseExact (Docs) Methode an, die auch ein Format entgegennimmt.
Ob du jetzt die Subsekunden Auflösung bei Bankauszügen benötigst sei dahingestellt aber DateTime kann diese auch verwalten.

Dazu sei gesagt: [FAQ] DateTime vs. DateTimeOffset und der Umgang mit Zeiten in .NET

Es gibt verschiedene fertige Libs, die das parsen von CSV vereinfachen. Da musst du dann nicht so viel selber programmieren. Auf Anhieb fällt mir CsvHelper ein.
private Nachricht | Beiträge des Benutzers
Silentwolf
myCSharp.de - Member



Dabei seit:
Beiträge: 17
Herkunft: Österreich

Themenstarter:

beantworten | zitieren | melden

Hallo Papst,

vielen Dank für die Erklärung und Deine Links.
Hab ich mir fast gedacht das ich es Parsen muss.

Zitat
Ob du jetzt die Subsekunden Auflösung bei Bankauszügen benötigst sei dahingestellt aber DateTime kann diese auch verwalten.

Nein brauche ich nicht umbedingt :-) aber sie sind halt im Format enthalten kann man dann einfach weglassen nehme ich an?

Ok werde mich gern mit Deinen Links auseinandersetzen und nachlesen.

CSV Helper hab ich schon gehört oder mal gelesen und auch mit DateTime oder DateTimeOffset.
Aber wo und wie man diese dann in einem eigenen Projekt "wenn auch nur ein winziges Projekt" einsetzt is oftmals für Anfänger schwierig oder für mich zumindest )


Deshalb sind Tipps wie von Dir für Anfänger sehr hilfreich!


Vielen Dank!
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.999

beantworten | zitieren | melden

Wenn ich über den nuget link, dann auf das csvhelper nuget gehe, dann Projekt webside komme ich nach
A .NET library for reading and writing CSV files. Extremely fast, flexible, and easy to use. | CsvHelper
Da dann Get Started aufrufen.

Ist da wirklich einfach erklärt
private Nachricht | Beiträge des Benutzers
Silentwolf
myCSharp.de - Member



Dabei seit:
Beiträge: 17
Herkunft: Österreich

Themenstarter:

beantworten | zitieren | melden

Hallo nochmal,

folgendes habe ich nun mit CSV Helper herausgefunden:

Habe da sogar ein gutes Video online gefunden! Also der Code stammt vom Video ich hab ihn nur mal für mich angepasst!


using System;
using CsvHelper;
using System.IO;
using System.Globalization;
using System.Linq;
using CsvHelper.Configuration;
using CsvHelper.Configuration.Attributes;

namespace CSV_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            ReturnCsvFile();
        }

        static void ReturnCsvFile()
        {
            using (var streamReader = new StreamReader(@"C:\Users\Albert\Documents\CSharp\CSV_Files\Test.csv"))
            {
                using (var csvReader = new CsvReader(streamReader, CultureInfo.InstalledUICulture))
                {
                    csvReader.Context.RegisterClassMap<MyBankClassMap>();
                    var records = csvReader.GetRecords<MyBank>().ToList();
                }
            }
        }
    }
}

public class MyBankClassMap : ClassMap<MyBank>
{
    public MyBankClassMap()
    {
        Map(m => m.IBAN).Name("IBAN");
        Map(m => m.Auszugsnummer).Name("Auszugsnummer");
        Map(m => m.Buchungsdatum).Name("Buchungsdatum");
        Map(m => m.Valutadatum).Name("Valutadatum");
        //Map(m => m.Umsatzzeit).Name("Umsatzzeit");
        Map(m => m.Zahlungsreferenz).Name("Zahlungsreferenz");
        Map(m => m.Waehrung).Name("Waehrung");
        Map(m => m.Betrag).Name("Betrag");
        Map(m => m.Buchungstext).Name("Buchungstext");
        Map(m => m.Umsatztext).Name("Umsatztext");
    }
}

public class MyBank
{
    public string IBAN { get; set; }
    public int Auszugsnummer { get; set; }
    public DateTime Buchungsdatum { get; set; }
    public DateTime Valutadatum { get; set; }
    //public DateTime Umsatzzeit { get; set; }
    public string Zahlungsreferenz { get; set; }
    public string Waehrung { get; set; }
    public decimal Betrag { get; set; }
    public string Buchungstext { get; set; }
    public string Umsatztext { get; set; }
}

Leider bekomme ich noch einen Fehler beim Umsatzzeit Feld der Parser kann dieses Format denke ich nicht erkennen.
Im Video hatter er auch einen String als Datumsformat das hat CsvHelper ohne Propleme umwandelt.

Na ja brauche diese Zeit ja nicht wirklich aber interessiert hätte es mich schon was da noch zu tun wäre. Vielleicht kann ich das ja auch noch in den bissherigen Links
finden.

Und ich hätte da noch eine Frage bitte.

Wie geht man denn weiter vor das man diese Liste nun in SQL Server bekommt?
Muss diese oder sollte diese Liste zwischengespeichert werden oder kann diese dann auf direkten Weg in den SQL Server übertragen werden?

oder ist folgendes Beispiel schon der richtige Ansatz es zu schaffen


// define the INSERT statement using **PARAMETERS**
string insertStmt = "INSERT INTO dbo.REPORT_MARJORIE_ROLE(REPORT_ID, ROLE_ID, CREATED_BY, CREATED) " + 
                    "VALUES(@ReportID, @RoleID, 'SYSTEM', CURRENT_TIMESTAMP)";

// set up connection and command objects in ADO.NET
using(SqlConnection conn = new SqlConnection(-your-connection-string-here))
using(SqlCommand cmd = new SqlCommand(insertStmt, conn)
{
    // define parameters - ReportID is the same for each execution, so set value here
    cmd.Parameters.Add("@ReportID", SqlDbType.Int).Value = YourReportID;
    cmd.Parameters.Add("@RoleID", SqlDbType.Int);

    conn.Open();

    // iterate over all RoleID's and execute the INSERT statement for each of them
    foreach(int roleID in ListOfRoleIDs)
    {
      cmd.Parameters["@RoleID"].Value = roleID;
      cmd.ExecuteNonQuery();
    }

    conn.Close();
}      

Oder was könnte man diesbezüglich nachlesen? Kenn mich noch nicht so genau aus damit ich zielgenau suchen kann.

Vielen Dank

Albert
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Silentwolf am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.306

beantworten | zitieren | melden

Zitat von Silentwolf
Oder was könnte man diesbezüglich nachlesen? Kenn mich noch nicht so genau aus damit ich zielgenau suchen kann.
Weil es bei Software Entwicklung halt generell nicht nur einen Weg nach Rom gibt.
Gibt in der Regel immer mehrere dutzend Wege pro Problem/Anforderung.
Zitat von Silentwolf
Wie geht man denn weiter vor das man diese Liste nun in SQL Server bekommt?

Muss diese oder sollte diese Liste zwischengespeichert werden oder kann diese dann auf direkten Weg in den SQL Server übertragen werden?
Auch hier. Es gibt nicht nur einen Weg. Aber grob beantwortet:
Du musst die Informationen mindestens im RAM halten, was technisch auch "speichern" ist.
Du kannst dann die Einträge entweder einzeln in den DB Server schreiben (das hast Du aktuell), oder als Chunks (also jeweils zB 100 Einträge zeitgleich).
Zitat von Silentwolf
Na ja brauche diese Zeit ja nicht wirklich aber interessiert hätte es mich schon was da noch zu tun wäre. Vielleicht kann ich das ja auch noch in den bissherigen Links
finden.
Steht auch in der CsvHelper Readme, wie es Fzelle Dir gesagt hat.
Dort ist beschrieben, wie man Custom Formats umsetzt -> ConvertUsing() verwenden.
private Nachricht | Beiträge des Benutzers
Silentwolf
myCSharp.de - Member



Dabei seit:
Beiträge: 17
Herkunft: Österreich

Themenstarter:

beantworten | zitieren | melden

Hallo Abt,

vielen Dank für Deine Antwort.
Zitat
Weil es bei Software Entwicklung halt generell nicht nur einen Weg nach Rom gibt.

Das kann ich gut verstehe nur oft weiß man als Neuling halt nicht wirklich was man genau suchen muss oder nachlesen muß mit all dieser Fülle an Möglichkeiten
was dieses Spache und das .Net so bereit hält für einen.

Deshalb hoffe ich das es ok ist wenn man im Forum danach fragt oder um etwas Hilfe bittet. Obwohl das Forum für forgeschrittene Users ist.
Zitat
Du kannst dann die Einträge entweder einzeln in den DB Server schreiben (das hast Du aktuell), oder als Chunks (also jeweils zB 100 Einträge zeitgleich).

Dann würde ich auf dem aufbauen was ich bereits habe, denn so viele Datensätze sind es dann nicht die gesendet werden müssen.
Zitat
Steht auch in der CsvHelper Readme, wie es Fzelle Dir gesagt hat.
Dort ist beschrieben, wie man Custom Formats umsetzt -> ConvertUsing() verwenden.

Ok Danke!
Hab mir die Dokumentation schon abgespeichert aber noch nicht ganz durchgearbeitet.
Werde ich aber gleich machen.

Vielen Dank nochmals!
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.306

beantworten | zitieren | melden

Zitat von Silentwolf
Deshalb hoffe ich das es ok ist wenn man im Forum danach fragt oder um etwas Hilfe bittet. Obwohl das Forum für forgeschrittene Users ist.
Du darfst prinzipiell fragen was Du willst, musst aber auch mit Antworten leben ;-)
Das Forum ist für alle da. Alle Texte, dass das Forum für Fortgeschrittene sei, sind eigentlich entfernt. Wenn das noch irgendwo steht, schreib mir eine PN wo - dann geht das auch weg.
private Nachricht | Beiträge des Benutzers
Silentwolf
myCSharp.de - Member



Dabei seit:
Beiträge: 17
Herkunft: Österreich

Themenstarter:

beantworten | zitieren | melden


Zitat
Du darfst prinzipiell fragen was Du willst, musst aber auch mit Antworten leben ;-)

Ja schon klar
Zitat
Das Forum ist für alle da. Alle Texte, dass das Forum für Fortgeschrittene sei, sind eigentlich entfernt. Wenn das noch irgendwo steht, schreib mir eine PN wo - dann geht das auch weg.

mache ich wenn das der Fall sein sollte.

Vielen Dank erstmal für Deinen Input und natürlich auch für Deine Links!
Hilft alles sehr.

Danke
private Nachricht | Beiträge des Benutzers