Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQL Server erkennt bei CSV Datei Zahlen nicht korrekt

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von af9999, 17 September 2013.

  1. af9999

    af9999 Benutzer

    Hallo Zusammen,

    ich habe folgendes Problem. In einem Ordner wird jede Nacht eine CSV Datei mit folgendem Inhalt abgelegt

    z1;z2
    12,3;43,5

    Zu dem Order habe ich einen Verbindungsserver angelegt. Wenn ich nun die Daten mit select * from... auslesen möchte erhalte ich.

    1899-12-30 12:03:00.000 43,5

    Ich habe es schon mit cast und convert in einen Varchar probiert erfolglos. Ein Replace des "," in "." blieb auch erfolglos. ich erhalte immer wieder ein Datum

    Gerne können die Zahlen nacher auch Text sein.

    Weis einer Rat wie ich das anstellen kann??

    Ich habe festgestellt wenn die Zahlen recht groß sind dann klappts.

    Viele Grüße
    Andreas
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Welcher Datentyp hat denn z1?

    Code:
    test=# create table af9999 (z1 text, z2 text);
    CREATE TABLE
    Time: 309,381 ms
    test=*# copy af9999 from '/home/kretschmer/in.csv' csv delimiter ';';
    COPY 1
    Time: 14,494 ms
    test=*# select * from af9999 ;
      z1  |  z2
    ------+------
     12,3 | 43,5
    (1 row)
    test=*# select replace(z1,',','.')::numeric(5,2) as z1, replace(z2,',','.')::numeric(5,2) as z2 from af9999 ;
      z1  |  z2
    -------+-------
     12.30 | 43.50
    (1 row)
    test=*# rollback;
    ROLLBACK
    Time: 0,575 ms
    test=
    
    
     
  3. af9999

    af9999 Benutzer

    Da die Daten in in einer CSV Datei liegen haben sie keinen speziellen Datentyp. Wegen mir können die Daten alle als Text ausgelesen werden.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Du willst das in eine Tabelle einlesen. Welche Datentypen hast Du in dieser Tabelle? Das CSV keine Datentypen kennt kannst Du als bekannt voraussetzen ;-)
     
  5. af9999

    af9999 Benutzer

    wie ich oben geschrieben habe möchte ich die Daten aus der CSV Datei nicht in eine SQL Server Tabelle einlesen sondern dises mit select * from .... anzeigen.

    Ich habe aber auch schon probiert die Daten in eine Tabelle einzulesen. Als Datentypen habe ich von Float über decimal bis zu Text schon vieles ausprobiert. Leider ohne Erfolg.

    Witzig ist ja das der SQL Server die Zahlen korrekt anzeigt wenn diese > 100 sind.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Okay, ich bin da erst mal raus ...

    Ich kenne von PG die Möglichkeit, mittels FDW (Foreign Data Wrapper) auf z.B. CSV-Dateien zuzugreifen. Aber dazu muß man auch erst einmal sagen, welches Format die CSV hat und als welche Datentypen die Spalten zu interpretieren sind.
    http://www.depesz.com/2011/03/14/waiting-for-9-1-foreign-data-wrapper/

    Ich könnte mir ja vorstellen, daß es prinzipiell ähnlich in M$SQL geht und man auch da das Format der CSV definieren kann/muß.
     
  7. ukulele

    ukulele Datenbank-Guru

    Ich bekomme zwar einen Linked Server erstellt aber er zeigt meine CSV Datei nicht als Tabelle an nur eine default Datenbank. Wie genau hast du deine Datei als Verbindungsserver eingebunden? Oder nutzt du OPENROWSET?

    PS: Mit OPENROWSET hatte ich schon so meine Differenzen. Leider hängt das auch vom installierten OS und möglichen Office Komponenten ab aber wenn es erstmal läuft ist es nützlich. Das hier hab ich auf die schnelle gefunden:
    http://bradsruminations.blogspot.in/2011/01/so-you-want-to-read-csv-files-huh.html
     
    Zuletzt bearbeitet: 18 September 2013
  8. af9999

    af9999 Benutzer

    Ich habe dann mal ein SS vom Verbindungsserver hochgeladen und so spreche ich dann die CSV Datei an

    select *
    FROM CSV_DM_Salden...af2#csv
     

    Anhänge:

  9. ukulele

    ukulele Datenbank-Guru

    Also egal was ich versuche MSSQL stört sich an dem Pfad und kann die Datei bei mir nicht als Verbindungsserver einrichten. Ob mit oder ohne Dateiendung, ob Netzlaufwerk oder lokal kein Unterschied.
    Wenn ich die Anlage erzwinge
    Code:
    EXEC sp_addlinkedserver tollerTest, 'Jet 4.0', 'Microsoft.Jet.OLEDB.4.0','\\ads\Daten\test', NULL,'Text'
    sehe ich keine Tabellen und kann nichts abfragen...

    Leider kann ich also dein Problem schon an einem früheren Punkt nicht nachvollziehen :( . Hast du es auch mal mit OPENROWSET probiert oder kommt das für dich nicht in Frage?
     
  10. af9999

    af9999 Benutzer

    OPENROWSET würde auch gehen ist aber im Prinzip das gleiche wie ein Verbindungsserver.
    Warum bei Dir der Verbindungsserver nicht geht kann ich nicht nachvollziehen. Bei mir geht es in alle Richtungen (Lokal, Netzlaufwerk, absoluter Pfad) auch mit unterschiedlichen Dateien. Die Meldung bei Dir sagt allerdings exakt das der Pfad nicht gefunden werden kann. Kannst Du es bitte nochmal mit einem lokalen Pfad (der natürlich auch existiert) versuchen.
     
  11. ukulele

    ukulele Datenbank-Guru

    Also ich habs nochmal mit Code aus dem Internetzer probiert:

    Code:
    EXEC sp_addlinkedserver MyCSV, 'Jet 4.0', 'Microsoft.Jet.OLEDB.4.0','c:\Mappe1', NULL,'Text'
    
    EXEC sp_addlinkedsrvlogin MyCSV, FALSE, NULL,NULL,NULL
    
    --List all files
    EXEC sp_tables_ex MyCSV
    ...aber mehrere meiner SQL Maschinen sind der Meinung das der Pfad ungültig ist. (Mappe1 weil mit Excel erstellt)

    Mit OPENROWSET kann ich deinen Fehler aber reproduzieren:
    Code:
    SELECT    *
    FROM    OPENROWSET (    'MSDASQL',
                            'Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=C:\;',
                            'SELECT * from Mappe1.csv');
    Innerhalb des OPENROWSET geht schonmal kein cast()...
     
  12. af9999

    af9999 Benutzer

    also ich habe den Verbindungsserver über die Oberfläche erstellt. Klappte damit. Da musst Du dann auch nur das Verzeichnis angeben und kannst dann auf alle Textdateien in dem Verzeichnis zugreifen.
     
  13. ukulele

    ukulele Datenbank-Guru

    Ich hab mit OPENROWSET ähnliche Schwirigkeiten und bekomme es im Select nicht konvertiert. Ich könnte höchstens das Datum wieder umwandeln aber das kann ja nicht Sinn der Sache sein. Auch wenn ich eine Tabelle mit VARCHAR() als Datentyp anlege und die Werte erst dort importiere macht er mir aus 12,3 ein Datum.

    Hier hab ich ein ähnliches Problem ergooglet: http://social.msdn.microsoft.com/Fo...ved-when-reading-from-csv-file-via-openrowset
    Da greifen sie am Ende auf BULK Import zurück. Wenn ich noch einen Weg finde lasse ich es dich wissen aber ich fürchte das wird kniflig.
     
  14. ukulele

    ukulele Datenbank-Guru

    Oder du sorgst dafür das immer eine hohe Zahl in einer zusätzlichen Zeile in der Tabelle steht :confused:
     
  15. af9999

    af9999 Benutzer

    Hallo Ukulele,

    super mit dem Bulkinsert hat es dann geklappt. Ist aber ganz schön krank die ganze Nummer.

    Vielen Dank für Deine Hilfe.

    Viele Grüße
    Andreas
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden