SQL Server erkennt bei CSV Datei Zahlen nicht korrekt

af9999

Benutzer
Beiträge
7
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.612
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


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=
 

af9999

Benutzer
Beiträge
7
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.
 

af9999

Benutzer
Beiträge
7
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.
 

akretschmer

Datenbank-Guru
Beiträge
9.612
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.

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

ukulele

Datenbank-Guru
Beiträge
4.690
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:

af9999

Benutzer
Beiträge
7
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

  • verbindungsserver.jpg
    verbindungsserver.jpg
    67,3 KB · Aufrufe: 16

ukulele

Datenbank-Guru
Beiträge
4.690
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.
Das Datenquellenobjekt des OLE DB-Anbieters 'Microsoft.Jet.OLEDB.4.0' für den Verbindungsserver 'TEST' kann nicht initialisiert werden.
Der OLE DB-Anbieter 'Microsoft.Jet.OLEDB.4.0' für den Verbindungsserver 'TEST' hat die Meldung ''\\ads\Daten\test' ist kein zulässiger Pfad. Stellen Sie sicher, dass der Pfad richtig eingegeben wurde und dass Sie mit dem Server, auf dem sich die Datei befindet, verbunden sind.' zurückgeben. (Microsoft SQL Server, Fehler: 7303)

Hilfe erhalten Sie durch Klicken auf: http://go.microsoft.com/fwlink?Prod...00&EvtSrc=MSSQLServer&EvtID=7303&LinkId=20476
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?
 

af9999

Benutzer
Beiträge
7
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.
 

ukulele

Datenbank-Guru
Beiträge
4.690
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');
1899-12-30 12:03:00.000 45,4
Innerhalb des OPENROWSET geht schonmal kein cast()...
 

af9999

Benutzer
Beiträge
7
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.
 

ukulele

Datenbank-Guru
Beiträge
4.690
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.
 
Werbung:

af9999

Benutzer
Beiträge
7
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
 
Oben