Laden...

CSV Import mit Datum als String

Erstellt von Silentwolf vor einem Jahr Letzter Beitrag vor einem Jahr 454 Views
S
Silentwolf Themenstarter:in
17 Beiträge seit 2020
vor einem Jahr
CSV Import mit Datum als String

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

P
441 Beiträge seit 2014
vor einem Jahr

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.

S
Silentwolf Themenstarter:in
17 Beiträge seit 2020
vor einem Jahr

Hallo Papst,

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

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!

F
10.010 Beiträge seit 2004
vor einem Jahr

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

S
Silentwolf Themenstarter:in
17 Beiträge seit 2020
vor einem Jahr

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

16.806 Beiträge seit 2008
vor einem Jahr

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.

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).

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.

S
Silentwolf Themenstarter:in
17 Beiträge seit 2020
vor einem Jahr

Hallo Abt,

vielen Dank für Deine Antwort.

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.

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.

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!

16.806 Beiträge seit 2008
vor einem Jahr

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.

S
Silentwolf Themenstarter:in
17 Beiträge seit 2020
vor einem Jahr

Du darfst prinzipiell fragen was Du willst, musst aber auch mit Antworten leben 😉

Ja schon klar 🙂

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