如何解析 CSV 并导入到 MYSQL 问题
Posted
技术标签:
【中文标题】如何解析 CSV 并导入到 MYSQL 问题【英文标题】:How to parse CSV and import to MYSQL issue 【发布时间】:2015-10-12 17:51:45 【问题描述】:我真的被困在这一刻了..我搜索和研究,我没有找到类似的东西,所以也许我想要的不可行。
我有一个这种格式的 .xls 文件
|contact| col1 |col2 | col3 |
---------------------------------
|name1 | info1 |info2 | info3 |
|address1| | | |
|phone1 | | | |
| | | | |
|name2 | | | |
|address2| info1 |info2 | info3 |
|phone2 | | | |
| | | | |
|name_n | info1 | info2| info3 |
|addres_n| | | |
|phone_n | | | |
----------------------------------
所以我正在考虑创建一个名为contact 的表和另一个名为info 的表。表联系人将包含 id(主键)、姓名、地址和电话作为字段。还有另一个带有 id(主键)、name(外键)、col1、col2 和 col3 的表。这样,如果我想知道名称的详细信息(在表 info 中),我可以转到另一个表并查看所有值。
于是我研究了如何导入这个xls格式的文件,最佳的解决方案是将xls文件转换为逗号分隔的csv文件。
因此,我想使用的代码是(在转换为逗号分隔的 csv 之后)如下:
但重点是我只想做到以下几点:
“信息”表:name1,info1,info2,info3。 “联系人”表:姓名 1、地址、电话 1。与“信息”表相关
LOAD DATA INFILE '/home/username/myfile.csv'
INTO TABLE numbers FIELDS TERMINATED BY ';'
LINES STARTING BY '-' TERMINATED BY '\r\n'
IGNORE 1 LINES
(contact,col1,col2,col3);
填表时没问题,因为我只需在要填入表的行的开头添加一个“-”(包含非空字段的行)。
与“联系人”表相关:
这很困难,因为如果我只想获取联系人列,我将不得不添加一些符号然后进行操作。好吧,我想在 name1 的开头添加一个“*”(例如),在 phone1 的末尾添加另一个用于定义 LINE 的边界。但我也想定义字段,这将是一个';'也是。但是,LOAD DATA INFILE 算法也采用空字段。我只想获取包含与“空字符串”/“null”/不同的内容的字段。所以问题是我是否能够说些什么来避免空字符串。因为正如我在mysql DOC 中看到的那样:
空字段值的解释与缺失字段不同:
对于字符串类型,该列设置为空字符串。
对于数字类型,该列设置为 0。
对于日期和时间类型,该列设置为该类型的相应“零”值。请参阅第 11.3 节“日期和时间类型”。
但它并没有说要避免它。 (我的意思是,如果是一个空值,然后传递下一个字段并再次评估,直到找到一个非空值)
我问这个是因为我的想法是面对它它会像这样填充一行: Name1,null,null,null,address1,null,null,null,phone1 等等。
有什么想法吗?
【问题讨论】:
您的 Excel 工作表中是否有 name1,address1,phone1** 3 行? 不,只是那个值。这个:|联系方式| col1 |col2 | col3 |是我的 excel 电子表格中的内容。使用“IGNORE 1 LINES”可以避免 【参考方案1】:现在只关注联系人,如果您的 excel 电子表格有 4 列,其中columnA
是所有行的N
操作。如果您希望它最终出现在您的真实表中,请将其更改为 Y
。
您的 csv 现在有 4 列:
行动、姓名、地址、电话
你 load data infile
进入一个工作台。现在您将数据放入(有些实际上并不需要),insert into select
where action='y' 将完成它,从 worktable 到您的 real table。
【讨论】:
好的,我想我明白了你的想法。所以首先我可以做我想做的事..但首先我将带有“null”值的csv导入“草稿表”,然后我在那里操作以获取(使用“insert into select”)非空值到真正的桌子。我认为这个选项是其他回复中最可行的一个。谢谢 :=)【参考方案2】:在 Excel 中,您可以创建两个工作表,第一个包含联系人数据,第二个包含信息数据。这些工作表可以单独导出为 csv 文件。
【讨论】:
我知道,但我有 70 张带有 |contact col1 col2 col3| 的工作表。因此我当然可以手动完成...但我认为这不是那么有效。也许现在是好的,因为我只有 70 个工作表,但想象一下我有 5000000000 个工作表......根本没有效率。以上是关于如何解析 CSV 并导入到 MYSQL 问题的主要内容,如果未能解决你的问题,请参考以下文章
几个CSV大文件如何导入mysql数据库,并更新替换对应数据?
如何使用 Spring Boot 将 CSV 文件导入 MYSQL