mysql load data処理空文字列インポートデータベースがデフォルトで0になった場合
2164 ワード
この場合、フィールドがintまたはfloatタイプであるに違いありません.空の文字列はデフォルトで0、varcharは空の文字列です.
解決策は一般的に2つです.1つ目はすべての空の文字列をNに置き換えます.
test_old.txtはmysqlから直接生成されたテキストで、test_newは最後に新しいテキストに処理し、直接
load data infile 'F:/factor_db/test_new' into table t_stock_factor_barra fields terminated by '\t' lines terminated by '\r' ignore 1 lines
データベースはnullです
2つ目をお勧めします.
F:/factor_db/barra_testはインポートするドキュメントです
(`full_insID`,`date`,@`beta`,@`book_to_price_ratio`,@`earnings_yield`,@`growth`,@`leverage`,@`liquidity`,@`momentum`,@`non_linear_size`,@`residual_volatil
ity`,@`size`)
データベース表フィールド名です.必ず順番に書きます.
@を付けたのは、空文字列があると判断してnullとしてそのまま保存したもので、以下に`フィールド名`=NULLif(@フィールド名,')という言葉を付け加えると完成します
解決策は一般的に2つです.1つ目はすべての空の文字列をNに置き換えます.
import re
with open("F:\\factor_db\\test_new", 'a') as g:
for line in open("F:\\factor_db\\test_old.txt", 'r'):
b = list(set(re.findall('\t+', line)))
b.sort(key = lambda i:len(i),reverse=True)
line = line.replace('\t
', '\t\\N
')
if max([len(i) for i in b])==1:
g.write(line)
else:
for i in b:
templen=len(i)
line=line.replace(i, '\t\\N'*(templen-1)+'\t')
g.write(line)
test_old.txtはmysqlから直接生成されたテキストで、test_newは最後に新しいテキストに処理し、直接
load data infile 'F:/factor_db/test_new' into table t_stock_factor_barra fields terminated by '\t' lines terminated by '\r' ignore 1 lines
データベースはnullです
2つ目をお勧めします.
load data infile 'F:/factor_db/barra_test' into table t_stock_factor_barra fields terminated by '\t' lines terminated by '\r
' ignore 1 lines
(`full_insID`,`date`,@`beta`,@`book_to_price_ratio`,@`earnings_yield`,@`growth`,@`leverage`,@`liquidity`,@`momentum`,@`non_linear_size`,@`residual_volatil
ity`,@`size`)
set
`beta` = NULLif(@beta,''),
`book_to_price_ratio` = NULLif(@book_to_price_ratio,''),
`earnings_yield` = NULLif(@earnings_yield,''),
`growth` = NULLif(@growth,''),
`leverage` = NULLif(@leverage,''),
`liquidity` = NULLif(@liquidity,''),
`momentum` = NULLif(@momentum,''),
`non_linear_size` = NULLif(@non_linear_size,''),
`residual_volatility` = NULLif(@residual_volatility,''),
`size` = NULLif(@size,'')
;
F:/factor_db/barra_testはインポートするドキュメントです
(`full_insID`,`date`,@`beta`,@`book_to_price_ratio`,@`earnings_yield`,@`growth`,@`leverage`,@`liquidity`,@`momentum`,@`non_linear_size`,@`residual_volatil
ity`,@`size`)
データベース表フィールド名です.必ず順番に書きます.
@を付けたのは、空文字列があると判断してnullとしてそのまま保存したもので、以下に`フィールド名`=NULLif(@フィールド名,')という言葉を付け加えると完成します