SQL crear tabla

R

Hola,

A ver si alguien puede echarme una mano con esta tonteria

Tengo un fichero .csv con los campos
nombre,pais,var_1,var_2,var_3,......,var_n

Cuando creo una tabla hago lo tipico

CREATE TABLE tabla_1 (nombre STRING, pais STRING, var_1 float,...)

La cosa es que el campo var_x tiene como 100 valores y queria saber si sabeis de alguna forma de hacerlo automatico y no tener que meter los campos uno a uno

tute07011988

Si no he entendido mal lo que quieres hacer, con un bucle en PHP.

B

Aclara que es para ti un campo, valor y registro.... puedo entender al menos tres cosas con lo que has expuesto:

  • 1 Registro con 100 valores en el campo var_x
  • 100 Registros con un valor en el campo var_x
  • Lo que tiene 100 "posibilidades" es la 'x' de var_x
1 respuesta
R

#3 lo ultimo

cabron

Pero todos los campos existen en todos los registros?

Tienes dos opciones, una crear la sentencia Create Table de forma dinámica leyendo la primera fila del CSV que me imagino tendrá el nombre de las columnas. La otra opción es crear solo una columna de tipo json para tener datos no estructurados y meter en cada fila solo los valores que estén rellenos

Sin saber más sobre esos datos, si están normalizados o no, no te sabría decir qué es mejor

B

También puedes ignorar el especificar el nombre de la columna si todos los valores están establecidos y en su debida "posición".

Edit: Que es un create... pues lo que dice el post anterior. Yo leería la primera linea del CSV (que debe ser la cabecera)... haría "split" por el separador usado y lo usaría en la consulta.

Edit: Cierto es que vas a tener que hacer algún tipo de check para inferir el tipo de columna... al menos discernir entre entero, cadena, float, ... y eso sería traerse la segunda linea del csv y hacer los "tests" campo a campo. Con eso ya podrías tener el mapeado columna: tipo. Seguro que existe alguna librería para trabajar con csv que te da esa información.

1 respuesta
R

#6 y eso como se hace?

1 respuesta
Xustis

pues a mi lo que me suena ya mal de base es una tabla con 100 columnas, si no puedes dividirlo en distintas tablas o no te interesa, seguro que no te viene mejor meterlo todo en un json(1 columna) y sacar los campos que necesites indexar?

2 1 respuesta
B

#7 ¿Que lenguaje estás usando? Mira de si alguna librería disponible te puede hacer el trabajo. Sino, lo que comento... tendrías que leer al menos las dos primeras lineas del CSV, hacer el split. Pero esto del split se te puede complicar si tienes campos de texto que contengan en su cadena el separador que use el archivo csv. Por eso recomiendo mirar una librería y eso que te ahorras.
Sino ves nada... el tema de los "tests" es simplemente un bool isNumber(string data) { return toInt(data) != NaN; } y algo así con cada tipo que quieras inferir. También podrías usar 'regex' para hacer estos 'tests'.... bool isNumber(string data) { return /^\d+$/.test(data) }.

#8 Ufff... y de miles de campos... en una de las primeras empresas que entre a trabajar manejaban DB2 con tablas con miles de columnas.... no es raro encontrarse estos "monstruos". El mundo real es un lugar hostil.... xDD

1
desu

que lenguaje?

pon el .csv con un par de rows y te lo hago

en python:

base_query_create_table = """
CREATE TABLE tabla_1 (
a int, 
b int,
"""

def add_int_to_value(value):
    return f'{value} int'

def add_commas(values):
    return ",\n".join(values)

def query_create_table(values):
    values_with_int = map(add_int_to_value, values)
    values_with_commas =  add_commas(values_with_int)
    return f'{base_query_create_table}{values_with_commas}\n)' 

def read_header_from_file(f):
    return f.readline().strip().split(",")

def main():
    with open("foo.csv") as f:
        header = read_header_from_file(f)
        print(header)
        print(query_create_table(header[2:]))

main()

foo.csv

a,b,c0,c1,c2,c3
1,1,12,13,14,15
2,2,22,23,24,25

ahora practica a como insertar los valores

JuAn4k4

Yo diría que muchas herramientas para conectar a BDs tienen opciones para importar datos desde CSV.

R

Alfinal lo hice con una lista de python y ya. Un poco cutre pero da el apaño

1

Usuarios habituales