Ermittelt den Datentyp aus den als String übergebenen Werten

7

Ich schreibe ein Framework, das eine Verbindung zu vielen verschiedenen Datenquellentypen herstellt und Werte aus diesen Quellen zurückgibt. Die einfachen sind SQL, Access und Oracle. Die härteren sind Sharepoint, CSV.

Wenn ich Werte aus textbasierten Quellen zurücksende, möchte ich den Datentyp der Daten bestimmen.

Da eine CSV nur aus Text besteht, müssen keine Metadaten abgefragt werden. Ich müsste die Daten irgendwie analysieren, um den Datentyp zu bestimmen.

Beispiel:

  

Liste von "wahr", "wahr", "falsch", "falsch" wäre boolean   Liste von "1", "0", "1", "0" wäre boolean   Liste von "1", "4", "-10", "500" wäre eine ganze Zahl   Liste von "15.2", "2015.5896", "1.0245", "500" wäre doppelt
  Liste von "2001/01/01", "2010/05/29 12:00", "1989/12/25 10:34:21" wäre datetime

Es basiert auf Ссылка

%Vor%

Bearbeiten: Ich muss nur Folgendes berücksichtigen:

%Vor%

Können Sie eine mögliche Verbesserung der Priorität sehen?

    
callisto 15.03.2011, 12:28
quelle

5 Antworten

12

Ich habe die folgende Lösung gefunden, die funktioniert:

%Vor%     
callisto 16.03.2011, 13:05
quelle
8

Da Dimi ein Kopfgeld zahlt und eine "modernere" Lösung braucht, werde ich versuchen, eine zu liefern. Erstens, was brauchen wir von einer vernünftigen Klasse, die Strings in verschiedene Sachen umwandelt?

Angemessenes Verhalten bei grundlegenden Typen.

Respektieren Sie Kulturinformationen, besonders wenn Sie Zahlen und Daten konvertieren.

Möglichkeit, die Logik bei Bedarf mit benutzerdefinierten Konvertern zu erweitern.

Als Bonus vermeiden Sie lange "if" -Ketten, da sie recht fehleranfällig sind.

%Vor%

Verwenden Sie so:

%Vor%     
Evk 05.05.2016 09:07
quelle
3
%Vor%     
zabulus 16.03.2011 13:50
quelle
1

Wäre es einfacher, es in einem generischen Datentyp mit .ToInt16 (), .ToInt32 (), .ToBool () usw. zu speichern? Wenn Sie eine App schreiben, die int erwartet und es boolesch wird, wird es scheitern, also wäre es besser, den Programmierer explizit zum erwarteten Datentyp konvertieren zu lassen.

Das Problem mit Ihrem Ansatz besteht darin, dass Sie nicht wissen, ob eine Zeile, die 0 als erstes Element enthält, -100000 als Elementnummer 100 enthält. Dies bedeutet, dass Sie keine erfolgreiche Konvertierung durchführen können, bis alle Zeilen TryParsed sind all die verschiedenen Datentypen. Sehr teure Operation!

Wenn überhaupt, würde ich vorkompilierte reguläre Ausdrücke und / oder benutzerdefinierte Logik verwenden, um die Daten zu verarbeiten. Zum Beispiel Iteration aller Zeilen, um die höchste / niedrigste Zahl, das Auftreten von Strings usw. zu finden.

    
Tedd Hansen 15.03.2011 12:40
quelle
1

Es kann nicht der beste Ansatz sein, mit den schmalsten Typen zu beginnen und auf die breiteste zu arbeiten. Wenn ich etwas über die Daten wüsste, würde ich mit dem am häufigsten vorkommenden Typ beginnen und auf das Geringste hinarbeiten. Wenn ich das nicht wüsste, würde ich vielleicht nachforschen oder nicht, um eine Vorstellung davon zu bekommen, was das statistisch sein könnte, wenn möglich. Sonst würde ich nur meine beste Schätzung machen. Warum früh auf Bit oder Datetime testen, wenn Sie nur einmal alle 10.000 Datensätze erwarten?

    
mickeyf 15.03.2011 13:47
quelle

Tags und Links