Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Excel XLS - CSV Import in Sql2005

Frage Entwicklung Datenbanken

Mitglied: mischn1980

mischn1980 (Level 2) - Jetzt verbinden

23.05.2008, aktualisiert 29.05.2008, 8188 Aufrufe, 11 Kommentare

Excel XLS / CSV Import in Sql2005

Hallo,

ich haben ein kleines aber für mich im Moment nicht lösbares Problem.

Gegeben ist eine "CSV"-Datei die wie folgt aufgebaut ist:

Ansicht in Excel:
Feld1 [Tab] Feld2 [Tab] Feld3 [Tab] Feld4 [Tab] etc.....

Ansicht in

Im Quellcode ( C# 2008 ) hab ich das im Moment so gelöst:

string con = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + PFAD+ @";Extended
Properties=""text;HDR=Yes;FMT=Delimited\t;RMT=""";

using (OleDbConnection connection = new OleDbConnection(con))
{
OleDbCommand command = new OleDbCommand("SELECT * FROM [" + DATEINAME+ "]", connection);
connection.Open();

using (OleDbDataReader reader = command.ExecuteReader())
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy("Data Source=RECHNERNAME\\SQLEXPRESS;Initial
Catalog=DATENBANKNAME;Integrated Security=SSPI;"))
{
bulkCopy.DestinationTableName = "TABELLENNAME";
bulkCopy.WriteToServer(reader);
}
}
connection.Close();
}

Die Datei wird importiert jedoch werden alle Werte in die erste Spalte geschrieben.
Der Tabulator wird schön als Quadrat angezeigt.

Was mach ich falsch?
Was kann ich noch versuchen?

Bin wirklich um jeden Info dankbar.

Gruss

Michael
Mitglied: Biber
24.05.2008 um 18:39 Uhr
Moin mischn1980,

na ja, Dein Schnipsel works as designed... das wäre die gute Nachricht.
"Bulkcopy" ist ja neudeutsch für "Klumpenkopie"... und der ganze Klump wird eben as is in das erst(best)e Feld reingesemmelt.

Ändere es so, das Deine DB-Engine eine Chance hat, Splaten/Felder zu differenzieren.
01.
OleDbCommand command = new OleDbCommand("SELECT Feld1, feld2, feld3 FROM [" + DATEINAME+ "]", connection); 
02.
connection.Open(); 
03.
 
04.
using (OleDbDataReader reader = command.ExecuteReader()) 
05.
06.
using (SqlBulkCopy bulkCopy = new SqlBulkCopy("Data Source=RECHNERNAME\\SQLEXPRESS;Initial  
07.
Catalog=DATENBANKNAME;Integrated Security=SSPI;")) 
08.
09.
bulkCopy.DestinationTableName = "TABELLENNAME"; 
10.
// ab hier neuer: 
11.
    SqlBulkCopyColumnMapping mapFeld1 = 
12.
    new SqlBulkCopyColumnMapping("Feld1", "ZielFeld1"); 
13.
        bulkCopy.ColumnMappings.Add(mapFeld1); 
14.
 
15.
    SqlBulkCopyColumnMapping mapName = 
16.
        new SqlBulkCopyColumnMapping("Feld2", "ZielFeld2"); 
17.
         bulkCopy.ColumnMappings.Add(mapFeld2); 
18.
 
19.
        SqlBulkCopyColumnMapping mapFeld3 = 
20.
             new SqlBulkCopyColumnMapping("Feld3", "ZielFeld3"); 
21.
         bulkCopy.ColumnMappings.Add(mapFeld3); 
22.
 
23.
 
24.
 
25.
bulkCopy.WriteToServer(reader); 
26.
27.
 
[ungetestete Skizze)

P.S. BulkCopy ist zwar ein nettes neues Feature, aber man/frau MUSS es nicht immer nehmen.
Es bringt doch nur dort etwas, wo bei einem satzweisen Schreiben sonst viele Index/Constraint-Prüfungen laufen (würden).
Andererseits kannst Du nur BulkCopys machen (bzw. verantworten), wenn Du vorher den Index DROPst und hinterher neu aufbaust UND auch alle Constraints deaktivierst.

Wat sich auch alles Zeit kosten tut... abgesehen davon, dass Du beim BulkCopy erst hinterher feststellen kannst, ob und was für einen Müll da reingesaugt hast (siehe Deine eigene Beschreibung).

Tipp: Nicht alles benutzen, was neu ist und von M$ als "Feature" bezeichnet wird.

Wie groß ist denn diese XLS-Datei, dass Du ein BulkCopy für sinnhaft gehalten hast?

Grüße
Biber
Bitte warten ..
Mitglied: mischn1980
26.05.2008 um 08:41 Uhr
Hallo Biber,

vielen Dank schon mal für deine Antwort.

Die Excel-Datei ist nicht so groß aber ich muss rund 3000 importieren.

Die Dateien haben zwischen 30 und 300 Zeilen.

War / Bin der Meinung, dass ich durch den BulkImport Zeit einsparen kann.

Nach dieser Zeile [using (OleDbDataReader reader = command.ExecuteReader())] bekomme ich einen FieldCount von 1.

Hab noch ne weitere Info:



Gruss

Michael
Bitte warten ..
Mitglied: Biber
26.05.2008 um 09:54 Uhr
Moin michael,

dann ist der (oder ein weiterer) Fehler hier drin.

string con = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + PFAD+ @";Extended Properties=""text;HDR=Yes;FMT=Delimited\t;RMT=""";

  • Entweder bist Du mit der Anzahl oder Position der Anführungszeichen durcheinandergekommen
  • oder das IMHO merkwürdig aussehende "Fmt=Delimited\t;" wird nicht richtig interpretiert. Schreibt man/frau das laut Doku so im Falle TAB is sich Feldtrenner?
  • Und sind auch ganz,ganz sicher TABs drin (nur der Vollständigkeit halber)?

P.S. Unter Deinem "Info folgt" seh ich nur meine Rentenprognose...

Grüße
Biber
Bitte warten ..
Mitglied: mischn1980
26.05.2008 um 10:09 Uhr
Hi Biber,

ich komm im Moment nicht wirklich drauf was ich da noch schreiben wollte. Ist ein Tel dazwischen gekommen.

Aber zu deiner Frage. Tab ist wirklich der Feldtrenner.
Der Zeilentrenner ist ".

Na ich werd nochmal den con aufbauen und kucken was passiert.

Gruss

Michael
Bitte warten ..
Mitglied: mischn1980
26.05.2008 um 11:58 Uhr
Also ich kann anstellen was ich will.

Bekomm als ColCount immer 1.

Hab den Delimiter nochmal kontrolliert und es ist Tab.

Gruss

Michael
Bitte warten ..
Mitglied: Biber
26.05.2008 um 15:20 Uhr
Moin mischn1980,

hast Du auch "Fmt=Delimited" ohne
"\t" schon probiert?
string con = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + PFAD+ @";Extended
Properties=""text;FMT=Delimited;RMT=""";

Grüße
Biber
Bitte warten ..
Mitglied: mischn1980
27.05.2008 um 09:13 Uhr
Moin,

ja hab ich auch schon versucht.

Das Problem mit dem Trenner ist weg.

Hab im Web noch eine Routine gefunden mit der kann ich alles auslesen.

Dann sind allerdings alle Werte vom Typ String.

Schaffe es im Moment nicht den String in einen Double umzuwandeln.

Bisher hab ich es mit diesem Code versucht:

if (column.DataType == typeof(Double))
{
DataColumn bcol = dtbl.Columns[column.ColumnName];
foreach (DataRow row in dtbl.Rows)
{
if (row[bcol].Equals(""))
row[bcol] = "0.00";
else
row[bcol] = Convert.ToDouble(row[bcol],new
System.Globalization.CultureInfo("en-GB"));
}
}

Am Anfang Frag ich ab ob die "Zelle" keinen Inhalt hat und wenn ja soll er 0,00 eintragen. Wenn etwas drinn steht soll es von String in Double umgewandelt werden.

Das geht allerdings noch nicht. Stell mich im Moment an als ob ich noch nie Code geschrieben hab. Naja ist ja auch mein erstes Projekt seit fast 1,5 Jahren.

Gruss

Michael
Bitte warten ..
Mitglied: mischn1980
27.05.2008 um 11:58 Uhr
So ich dreh am Rad.

Bekomm Die Umwandlung nicht wirklich hin.

Kann ich da noch eine Hilfestellung bekommen?

Gruss

Michael
Bitte warten ..
Mitglied: 14695
28.05.2008 um 15:27 Uhr
Hm... an welcher Stelle hakt es denn?
01.
foreach (DataRow row in dtbl.Rows) 
02.
03.
   if (row[bcol].Equals("")) 
04.
     row[bcol] = "0.00"; 
05.
   else 
06.
     row[bcol] = Convert.ToDouble(row[bcol], new  
07.
                     System.Globalization.CultureInfo("en-GB"));

Wird die foreach-Schleife vollständig durchlaufen? Kommt er über If...Else hinweg? Trägt er Werte in die DR ein? Oder wandelt er nur nicht um?
Bitte warten ..
Mitglied: 14695
28.05.2008 um 15:29 Uhr
Hätte bei genauerem Hinsehen auch drauf kommen können. Du sagst, dass alle Spalten vom Typ "String" sind dann kann

01.
   If(DataColumn.DataType == typeof(Double))
nie true zurück geben.

Auch kannst du in einer Spalte vom Typ String keinen Wert vom Typ Double ablegen...
Bitte warten ..
Mitglied: mischn1980
29.05.2008 um 08:55 Uhr
Hallo Leute,

jetzt muss ich mich ersteinmal bedanken.

Eure Hilfe war wirklich extrem gut.

Die Software läuft und alle sind Glücklich.

Der Fehler beim double umwandeln war, dass einige Felder

den Wert "" hatten. Die Coodierung en-GB war auch falsch

musste de-GER sein.

Also dann mal vielen Dank an alle.

Gruss

Michael
Bitte warten ..
Ähnliche Inhalte
Microsoft Office
gelöst Excel csv-Import Zeichensatz-Problem (2)

Frage von thaefliger zum Thema Microsoft Office ...

Erkennung und -Abwehr
CSV-Import in Excel mit Code-Injection! (3)

Information von Lochkartenstanzer zum Thema Erkennung und -Abwehr ...

XML
gelöst CSV bzw. XLS Dateien in ein XML Schema einbinden (3)

Frage von fisi-flo zum Thema XML ...

Microsoft Office
CSV-Converter deaktiviert Add-ins in Excel (2)

Frage von freeskierchris zum Thema Microsoft Office ...

Neue Wissensbeiträge
Ubuntu

Ubuntu 17.10 steht zum Download bereit

Information von Frank zum Thema Ubuntu ...

Datenschutz

Autofahrer-Pranger - Bewertungsportal illegal

(8)

Information von BassFishFox zum Thema Datenschutz ...

Windows 10

Neues Win10 Funktionsupdate verbuggt RemoteApp

(3)

Information von thomasreischer zum Thema Windows 10 ...

Microsoft

Die neuen RSAT-Tools für Win10 1709 sind da

(2)

Information von DerWoWusste zum Thema Microsoft ...

Heiß diskutierte Inhalte
Router & Routing
Allnet - VDSL2 Modem - SFP (mini-GBIC) (20)

Frage von Dobby zum Thema Router & Routing ...

Voice over IP
DeutschlandLAN IP Voice Data M Premium, Erfahrung mit Faxgeräte? (17)

Frage von liquidbase zum Thema Voice over IP ...

TK-Netze & Geräte
TK-Anlage VoIP - DECT Erweiterung (16)

Frage von Lynkon zum Thema TK-Netze & Geräte ...