2009-04-07 5 views
0

Ich mache eine einmalige Import-Routine von einem System zum anderen. Der erste Schritt besteht darin, viele Daten aus vielen CSV-Dateien zu importieren. Die erste Zeile in jeder CSV-Datei ist Feldnamen getrennt. Der Rest ist die Daten, auch Tab getrennt und Zeilen sind mit einem CR getrennt.Finde den Feldtyp basierend auf den Daten

Ich habe eine 20-Liner-Routine geschrieben, die die Tabellen erstellt und die Daten in eine SQL-Datenbank einliest. Ich setze alle Felder, die nur numerische Daten enthalten, und habe "ID" in seinem Feldnamen als INT und den Rest als NVARCHAR (255).

Jetzt möchte ich es verfeinern, so dass es die Daten untersucht und versuchen, herauszufinden, welche Art von Daten es in jeder Spalte enthält. Es gibt Zeit, Daten, ID-Felder, Textfelder und numerische Felder.

Ich weiß, wie man das macht, es ist ziemlich einfach, aber ich möchte wissen, ob es einige Arbeit in diesem Bereich getan hat und ob es einige Klassen gibt, die das da draußen behandeln.

Herausfinden der bevorzugten Größe ist schwieriger. Ich denke, ich muss 1. Durch alle Zeilen schauen und finden Sie die längsten Daten für jede Spalte. 2. Haben Sie eine Nachschlagetabelle, wo ich z. B. Länge 0-50 zu 100, Länge 51-255 zu 255 und so weiter zuordnen.

Jeder hat eine kluge Eingabe dazu? Wie gesagt, es ist nichts besonders schwer zu machen, aber es wäre nett, daraus eine intelligente Bibliothek zu machen, die später in anderen Import-Szenarien verwendet wird.

Antwort

1

Ich würde eine Vorverarbeitungsstufe ausführen - analysieren Sie die Daten in den CSV-Dateien, um sinnvolle Kapazitäten für nvarchar zu ermitteln - z. B. nvarchar (20) oder nvarchar (2000). Ich würde es bekommen, um einen Bericht mit einem Beispieleintrag für jede Spalte zu drucken - tatsächlich sogar die SQL-Anweisung "create table" zu erstellen, die Sie vor dem Ausführen manuell bearbeiten können. Wenn jeder Eintrag in einer Spalte als Zahl formatiert wird, dann mache es zu einem int und so weiter.

Als eine einmalige Sache erwarte ich vollständig, dass Sie jede Tabelle visuell überprüfen sollten, die Sie zuerst erstellen würden, bevor Sie den Datenimport ausführen.

1

Haben Sie ADO.NET berücksichtigt? Sie können die Daten in ein Dataset einlesen?

Verbindungszeichenfolge würde wie folgt aussehen: "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C: \ txtfile \; Erweiterte Eigenschaften = 'text; HDR = Ja; FMT = Delimited'" Notiere die HDR = JA, was Sie brauchen würden.

Und dann, wenn Sie eine Verbindung zu einem Verzeichnis haben, können Sie eine select-Anweisung wie verwenden:

„SELECT * FROM data.txt“

Es gibt zusätzliche Einstellungen zu optimieren, wie viele Zeilen suchen um den Typ usw. zu bestimmen. Sie könnten in die Datei schema.ini schauen, um die Typen manuell anzupassen. Außerdem können Sie die Registrierungsschlüssel HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet Set \ 4.0 \ Engines \ Text: Importmixed = Text aus dem Standard 'Majority Type'

Ich habe auch die SQL-Import-Tabelle auf einem Excel verwendet Datei (nach dem Speichern der CSV-Datei nach dem Öffnen in Excel). Das funktioniert auch ok. Nichts hat perfekt funktioniert - manchmal finde ich es immer noch einfacher, eine manuelle Codierung zu verwenden und die Spaltendaten selbst zu überprüfen.