Eu tenho um arquivo que pode conter de 3 a 4 colunas de valores numéricos que são separados por vírgula. Os campos vazios são definidos com exceção quando estão no final da linha:
1,2,3,4,5
1,2,3,,5
1,2,3
A tabela a seguir foi criada no MySQL:
+ ------- + -------- + ------ + ----- + --------- + ------- + | Campo Tipo | Nulo Chave Padrão | Extra | + ------- + -------- + ------ + ----- + --------- + ------- + | um | int (1) | SIM | NULL | | dois | int (1) | Sim | NULL | | três | int (1) | SIM | NULL | | quatro | int (1) | SIM | NULL | | cinco | int (1) | SIM | NULL | + ------- + -------- + ------ + ----- + --------- + ------- +
Estou tentando carregar os dados usando o comando MySQL LOAD:
LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS
TERMINATED BY "," LINES TERMINATED BY "\n";
A tabela resultante:
+ ------ + ------ + ------- + ------ + ------ + | um | dois | três | quatro | cinco | + ------ + ------ + ------- + ------ + ------ + | 1 | 2 3 4 | 5 | 1 | 2 3 0 5 | 1 | 2 3 NULL NULL + ------ + ------ + ------- + ------ + ------ +
O problema está no fato de que quando um campo está vazio nos dados brutos e não é definido, o MySQL, por algum motivo, não usa o valor padrão das colunas (que é NULL) e usa zero. NULL é usado corretamente quando o campo está ausente.
Infelizmente, eu tenho que ser capaz de distinguir entre NULL e 0 nesta fase, para que qualquer ajuda seja apreciada.
Obrigado S.
editar
A saída de SHOW WARNINGS:
+ --------- + ------ + -------------------------------- ------------------------ + | Nível | Código Mensagem | + --------- + ------ + -------------------------------- ------------------------ + | Aviso | 1366 Valor inteiro incorreto: '' para a coluna 'quatro' na linha 2 | | Aviso | 1261 Linha 3 não contém dados para todas as colunas | | Aviso | 1261 Linha 3 não contém dados para todas as colunas | + --------- + ------ + -------------------------------- ------------------------ +
mysql
csv
load-data-infile
Spiros
fonte
fonte
LOAD DATA
. Consulte a seção de exemplos do d6tstack SQL sobre alterações no esquema de dados.Respostas:
Isso fará o que você quiser. Ele lê o quarto campo em uma variável local e, em seguida, define o valor real do campo como NULL, se a variável local acabar contendo uma sequência vazia:
Se todos estiverem vazios, você os lerá em variáveis e terá várias instruções SET, como esta:
fonte
''
quando fazem o download de um CSV (usandoIFNULL(Col,'')
naSELECT INTO OUTFILE
consulta) para o Excel, mas, em seguida, os uploads os aceitam como nulos versus tendo que lidar com\N
o CSV. Obrigado!0
que devem ser convertidos emNULL
(porque não é possível ter valor zero para os dados em questão) e também seqüências de caracteres vazias. Como garantir que zeros e cadeias vazias sejam convertidos emNULL
?nullif(@vone, 0)
.O manual do MySQL diz:
Então, você precisa substituir os espaços em branco por \ N assim:
fonte
Fields enclosed by: "
é que"\N"
de"name",\N,"stuff"
\N
é aceito como denotadorNULL
. Em vez dissoNULL
, use , como neste exemplo:"name","age",NULL,"other","stuff"
O comportamento é diferente dependendo da configuração do banco de dados. No modo estrito, isso geraria um erro ou um aviso. A consulta a seguir pode ser usada para identificar a configuração do banco de dados.
fonte
Pré-processe seu CSV de entrada para substituir entradas em branco por \ N.
Tentativa em um regex: s / ,, /, \ n, / ge es /, $ /, \ N / g
Boa sorte.
fonte
(variável1, @ variável2, ..) SET variável2 = nullif (@ variável2, '' ou '') >> você pode colocar qualquer condição
fonte
mostrar variáveis
Show variables like "`secure_file_priv`";
Nota: mantenha seu arquivo csv no local indicado pelo comando acima.
Nota: aqui a
date
coluna ' ' possui alguns valores em branco no arquivo csv.fonte