【问题标题】:Unable to import tab delimited data with empty values into mysql table无法将具有空值的制表符分隔数据导入mysql表
【发布时间】:2020-01-21 02:58:17
【问题描述】:

我有一个包含许多缺失值的制表符分隔数据文件,我需要将其导入 mariadb(10.4.5) 中的表中。

我使用了这个命令:

load data infile 'c:/path to file/file.txt' into table table_name fields terminated by '\t' lines terminated by '\n' ignore 1 rows;

但我收到此错误:

SQL 错误 (1366):不正确的双精度值:'' 列 db_name.table_name.col_name1 第 10 行

当我检查文本数据文件时,第 10 行的 col_name1 是一个缺失值 - 即。两个制表符分隔符之间没有任何内容。

我已经花了几个小时试图解决这个问题 - 我会很感激任何帮助:是否有任何数据方式,包括将缺失值(空字符串)导入 mysql 表?

在使用 LOAD DATA INFILE 之前是否需要对文本文件进行预处理?如果是这样,预处理的最佳方法是什么?

【问题讨论】:

  • 这能回答你的问题吗? MySQL load NULL values from CSV data
  • 我查看了这个 - 不同之处在于,在我的情况下,导入完全停止,而不是用零替换空字符串。我看起来虽然解决方案相似但不完全相同

标签: mysql string import mariadb missing-data


【解决方案1】:

在使用 LOAD DATA INFILE 之前是否需要对文本文件进行预处理?如果是这样,预处理的最佳方法是什么?

您必须在导入期间执行此操作。比如:

LOAD DATA INFILE 'c:/path to file/file.txt' 
INTO TABLE table_name 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS
-- the fields which values are set directly, 
-- and intermediate variables for values which must be processed,
-- positioned according to CSV structure
(field1, field2, @variable3, field4, ...)
-- process the values in the variables and set fields values
SET field3 = CASE WHEN @variable3 = '' THEN 0 ELSE @variable3 END;

(field1, field2, @variable3, field4, ...) 是从源 CSV 文件的每一行解析的数据字段的目的地。

即当前正在处理的源行中的第一个解析值将直接分配给目标表的字段field1。与第二个值和field2 相同。

解析出来的第三个值会赋值给用户自定义的局部变量@variable3

第 4 个解析值将再次分配给表格字段。如果存在更多数据和代码,依此类推。

根据上述规范解析整行后,将执行下一个处理指令:SET field3 = CASE WHEN @variable3 = '' THEN 0 ELSE @variable3 END

这很简单。如果变量@variable3的值被赋值给空字符串,那么值0被赋值给当前解析的记录的字段field3,否则从源文件的当前行解析的值被赋值给这个字段而不修改。

在处理完两行后,整个记录(分配给某个值的所有字段)通过常用方式存储到目标表中的一个新记录中(将默认值分配给未列出的字段、检查、触发器......)。

在存储记录后,读取、解析、处理、存储 CSV 中的下一行,然后是下一行……等等,直到文件结束或出现错误。

【讨论】:

  • 非常感谢 Akina。我不熟悉这里的语法:我假设 (field1, field2, variable3, field4, ...) 指的是所有字段名称;什么是变量3。你能举个例子吗?
  • @Paul 添加了一些解释。
  • 帮助很大!非常感谢您的详细解释。
猜你喜欢
  • 2021-02-23
  • 2021-08-26
  • 2014-12-13
  • 2021-08-28
  • 2018-10-25
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多