Apache flink ApacheFlink:CsvReader选项卡字段分隔符

Apache flink ApacheFlink:CsvReader选项卡字段分隔符,apache-flink,Apache Flink,我正在使用一个大型CSV文件,它使用TAB将字段分隔为一行。问题是某些字段之间有多个制表符。我不想替换字符,因为文件中大约有一百万行。我尝试了下面的代码,但它不起作用,它显然找不到分隔符,并且没有给我任何输出。 如果使用\t作为分隔符,则会得到一个输出,但多个制表符是一个问题 DataSet<Tuple7<String, String, String, String, String, String, String>> ds = env .readC

我正在使用一个大型CSV文件,它使用TAB将字段分隔为一行。问题是某些字段之间有多个制表符。我不想替换字符,因为文件中大约有一百万行。我尝试了下面的代码,但它不起作用,它显然找不到分隔符,并且没有给我任何输出。 如果使用\t作为分隔符,则会得到一个输出,但多个制表符是一个问题

DataSet<Tuple7<String, String, String, String, String, String, String>> ds = env
            .readCsvFile("../csvResources/1.CSV")
            .fieldDelimiter("\t+")
            .ignoreInvalidLines()
            .types(String.class, String.class, String.class, String.class, String.class, String.class, String.class)
            .project(0, 1, 2, 3, 4, 5, 6);

非常感谢您的帮助。

Flink的内置CSV格式目前不支持此功能。它将把每个选项卡解释为字段分隔符,并假定某些字段为空

解决这个问题有两种方法

实现您自己的输入格式,可能与CsvInputFormat不同。您基本上需要更改负责将记录拆分为各个字段的逻辑。在观察字段分隔符选项卡时,您需要检查下一个字符是否也是字段分隔符,而不是解析下一个字段。 使用TextInputFormat逐行读取文件并解析每一行是后续的映射函数。
我建议采用第二种方法。它更易于实现和维护。

建议您克服不情愿,使用诸如tr、sed或awk之类的工具清理文件。我会尝试使用tr-s\t,它会将所有出现的多个选项卡替换为一个选项卡。@DavidAnderson我认为这是一个非常低效的过程,但我尝试了,实际上完成得相当快。谢谢你提到这件事。谢谢你帮我澄清这件事。我是Flink的初学者,所以你能更详细地了解我自己的CsvInputFormat的实现吗?我已经添加了一些细节。正如回答中提到的,我建议使用第二种方法解析MapFunction中的记录