Java 将内容从csv文件传输到mysql时解析csv文件中文本中的逗号

Java 将内容从csv文件传输到mysql时解析csv文件中文本中的逗号,java,mysql,csv,jdbc,Java,Mysql,Csv,Jdbc,我想将csv文件的内容传输到mysql。在我的csv文件中有包含逗号文本的列 我使用下面的代码来传输内容 ` ` 当执行它时,我得到的错误是“没有为参数23指定值”。 我的数据库表有22列,csv文件也有22列。所以我猜在第一行本身有一个文本,其中有一个逗号,它无法解析它,因此它假设为23列,而不是22列。 有人能帮我澄清问题并提供解决方案吗 CSV文件中有两种类型的逗号。一种类型的逗号分隔字段,另一种类型的逗号是文本的一部分,总是出现在引号之间。您需要以不同于引号内逗号的方式解析引号外的逗号。

我想将csv文件的内容传输到mysql。在我的csv文件中有包含逗号文本的列

我使用下面的代码来传输内容

`

` 当执行它时,我得到的错误是“没有为参数23指定值”。 我的数据库表有22列,csv文件也有22列。所以我猜在第一行本身有一个文本,其中有一个逗号,它无法解析它,因此它假设为23列,而不是22列。
有人能帮我澄清问题并提供解决方案吗

CSV文件中有两种类型的逗号。一种类型的逗号分隔字段,另一种类型的逗号是文本的一部分,总是出现在引号之间。您需要以不同于引号内逗号的方式解析引号外的逗号。您的代码似乎没有这样做。也许是这样的:

repeat
  c <-read next character
  if (c == '"')
    parse quoted field  // May include commas.
  else
    parse non-quoted field // Will not include commas.
  endif
until file all read.
重复

c我认为最直接的问题是,在将列名插入SQL语句时,不能转义列名。您要创建的是此表单的声明:

INSERT INTO sometable(key1,key2,key3) VALUES(?,?,?)
现在,如果在标题行中有一个逗号(假设其中一个键是“ke,y3”),即使CSV库正确读取了它,也会创建如下内容:

INSERT INTO sometable(key1,key2,ke,y3) VALUES(?,?,?)
现在,值的数量和列的数量不匹配。请注意,这也可能发生在其他一些字符中:可能在一个键中有一个问号被解释为参数占位符

解决方法:为了让自己不那么头疼,如果可能的话,尽量避免使用这些字符。我不确定mysql如何以及是否能够正确处理它们,但如果能够,在插入列名之前,您至少需要转义列名。我不确定您将如何正确和安全地执行此操作(以防止SQL注入),但由于这显然是一个一次性工具,因此将列名包装成这样的倒勾应该足够好了:

INSERT INTO sometable(`key1`,`key2`,`ke,y3`) VALUES(?,?,?)

>所以我猜在第一行中有一个文本,里面有一个逗号。。。是有还是没有?我想你可以检查一下。我们当然不能,这是这个谜题的一个重要信息。你可能会发现有用的。是的,第一行本身有逗号。我在帖子中说的意思是,我猜它正在考虑23列,因为这个逗号。你的csv文件中的文本字段是否被引用?还是逗号(不是分隔符)转义了?您是生成csv文件还是从其他来源生成的?csv文件是从网络下载的。当我打开它时,我认为出现问题的列中的文本(文本中包含逗号)被包围

这不是问题所在。他已经在使用一个库来读取CSV了,它已经正确地处理了这个问题。是的,我认为csvreader可以处理它,但是它仍然抛出错误。
INSERT INTO sometable(`key1`,`key2`,`ke,y3`) VALUES(?,?,?)