2017-05-08 4 views
1

J'ai un certain type de fichier qui contient une colonne avec des flotteurs que je lis dans l'aide insérererreur de type KDB lors de l'insertion I F

`table insert ("TISISIFIIIFFIbIFFFFFFIIIFIIFFFFIIIIIIIIIIIIFFFFFFIIFFIIIIFFIIIIIIIIIIIIIIIII"; enlist "\t") 0:`:my_file.txt 

malheureusement, parfois les valeurs de la colonne se trouvent être tous les entiers et le fichier txt est enregistré comme ints, pas comme flottant, donc 1 au lieu de 1.0 et il semble que kdb lance une erreur de type. Existe-t-il un moyen pour que kdb accepte les ints enregistrés dans ce format comme des flottants?

J'ai beaucoup de colonnes avec des flottants et théoriquement, le problème peut apparaître dans l'un d'eux. Est-il possible de dire à kdb sur insert de traiter n'importe quel int comme float si le type de colonne est float?

+0

Avez-vous utilisé la fonction' meta' pour vérifier les types de données des colonnes? Je ne suis pas capable de reproduire le problème (sur kdb + 3.2) –

Répondre

2

L'erreur de type se produit réellement à partir de votre insertion. Vous essayez d'insérer des données analysées, mais les types de chaque colonne ne sont pas conformes aux types de chaque colonne dans 'table'. Vous dites essentiellement que vos données brutes peuvent contenir des flottants, donc vous allez devoir les lire en tant que flottants. Ce que vous faites avec cette colonne après l'analyse vous appartient cependant.

1) garder comme flotteurs, lire flotteurs, insérer flotteurs, colonne doit être un flotteur dans « table » prélecture (je suppose que c'est ce que vous voulez passer par votre question):

update "f"$COLUMN from `table 
`table insert (1#"F";1#"\t") 0:`myfile.txt 

2) mise à jour à un nombre entier, puis insérer dans « table » - vous allez avoir mettre à jour le schéma de la table d'abord, lu comme flotteurs, puis exécutez une mise à jour après chaque lecture:

update "i"$COLUMN from `table 
`table insert update "i"COLUMN from (1#"F";1#"\t") 0:`myfile.txt 

une autre option que vous voudrez peut-être envisager, mais s'il vous plaît tester d'abord car il peut remplacer trop, est de remplacer le " .0 "à partir de vos flottants, puis juste lire en entiers:

q)\cd /var/tmp 
q)`:myfile.txt 0:("x\tx1";"1.0\t2.0";"3.0\t1.0") 
q)\sed -i -e 's/.0//g' myfile.txt 
q)("II";1#"\t")0:`myfile.txt 
+0

Je veux réellement les garder comme des flotteurs. le problème semble être que certaines valeurs sont enregistrées comme ints comme dans le csv, les flottants ronds seront sauvegardés comme ints, donc, 115.0 sera sauvegardé comme 115. – chrise

+0

Si certains sont enregistrés comme ints dans le csv, vous pouvez les lire tous en tant que floats bien - juste garder votre colonne comme un flottant, les lire en tant que flottants, et insérer en tant que flotteurs (# 1 ci-dessus) –