【问题标题】:Mysql dump character escaping and CSV readMysql转储字符转义和CSV读取
【发布时间】:2016-05-31 22:30:44
【问题描述】:

我正在尝试将 mysql 查询的内容转储到 csv 中,并使用一些基于 java 的开源 csv 阅读器读取它。以下是我面临的问题,

  1. 我的数据集有大约 50 个字段。该数据集包含很少有文本具有换行符的字段。因此,为了防止破坏我的 CSV 阅读器,我提供了可选用 "\"" 括起来的字段,以便将换行符包裹在双引号内。在这种情况下,对于其他字段,即使没有换行符,它也会将它们包裹在双引号内.
  2. 默认情况下,执行 mysql 转储时的转义字符是 \(反斜杠)这会导致换行符出现在末尾,这会破坏 csv 解析器。要在最后删除这个 \,如果我给 Fields 转义了 '' (空字符串),它会导致我在文本中的双引号不会被转义,仍然会破坏 csv 读取。

如果我可以跳过换行符转义,那就太好了,但仍然保留转义双引号以导致 csv 阅读器不中断。

我可以在这里遵循什么建议?

谢谢, 斯里拉姆

【问题讨论】:

  • @Michael-sqlbot 感谢您的评论。我已经试过了。它还使用双引号转义文本字段内的换行符,这会破坏 csv 输出中的字段数。
  • 抱歉,我误读了您的问题。我想你可以SELECT CONCAT('"',REPLACE(column1,'"','""'),'"'), ... INTO OUTFILE ...
  • @Michael-sqlbot 建议的是要走的路。如果可以的话,将select into outfileload data infile 结婚。如果有人认为一种编程语言(你的名字)或一种工具会产生更快的结果,我不敢苟同。
  • 我真的无法反驳这一点,尽管当我这样做时,我只使用 Perl,当然是 DBI 和 Text::CSV_XS,这是一个 Perl 模块,其工作内容是用 C 编写的,所以它非常快,并且有很多用于古怪转义和引用的选项,根据需要。

标签: mysql csv mysqldump


【解决方案1】:

尝试使用 uniVocity-parsers 将您的数据转储到 CSV。然后您可以使用相同的库读取结果:

试试这个转储数据:

ResultSet resultSet = executeYourQuery();

// To dump the data of our ResultSet, we configure the output format:
CsvWriterSettings writerSettings = new CsvWriterSettings();
writerSettings.getFormat().setLineSeparator("\n");
writerSettings.setHeaderWritingEnabled(true); // if you want want the column names to be printed out.

// Then create a routines object:
CsvRoutines routines = new CsvRoutines(writerSettings);

// The write() method takes care of everything. Both resultSet and output are closed by the routine.
routines.write(resultSet, new File("/path/to/your.csv"), "UTF-8");

这是读取你的文件:

// creates a CSV parser
CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.getFormat().setLineSeparator("\n");
parserSettings.setHeaderExtractionEnabled(true); //extract headers from file
CsvParser parser = new CsvParser(parserSettings);

// call beginParsing to read records one by one, iterator-style. Note that there are many ways to read your file, check the documentation.
parser.beginParsing(new File("/path/to/your.csv"), "UTF-8);

String[] row;
while ((row = parser.parseNext()) != null) {
    System.out.println(Arrays.toString(row));
}

希望这会有所帮助。

免责声明:我是这个库的作者,它是开源免费的(Apache V2.0 许可)

【讨论】:

  • 感谢您的回答。正如您在此处提到的,我绝对可以使用 Java Api 来读取和处理它,并根据我的要求将其写入 CSV,但我想尝试一下 mysql 内置的 csv 写入功能。我想我可能错过了一些东西,因为文本字段中的换行符转义和双引号转义都采用相同的转义字符。我只是不想转义换行符,而是将它们括在双引号中,但转义出现在文本字段中的双引号。
  • 试试这个解决方案:stackoverflow.com/questions/356578/… 如果它不起作用,那么不要浪费太多时间试图让它起作用,mysql 不符合任何类型的标准,你会浪费需要大量时间来获得可能较慢的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 2020-05-06
  • 2019-02-05
  • 2022-01-22
  • 2018-05-27
相关资源
最近更新 更多