读取带有换行符转义字符的 java 文件



我有一个Unicode文件需要导出到数据库(Vertica)。列分隔符为 CTRL+B,记录分隔符为换行符 ()。只要列值中有换行符,就会使用 CTRL+A 作为转义字符。

当我使用 BufferedReader.readLine() 读取此文件时,ID 为 2 和 4 的记录被读取为两条记录。而我想将它们作为输出中给出的单个完整记录来读取。

下面是示例输入文件。 | 代表 CTRL+B,^ 代表 CTRL+A。

Input
ID|Name|Job Desc
----------------
1|xxxx|SO Job
2|YYYY|SO Careers^
Job
3|RRRRR|SO
4|ZZZZ^
 ZZ|SO Job
5|AAAA|YU
Output:
ID|Name|Job Desc
----------------
1|xxxx|SO Job
2|YYYY|SO Careers Job
3|RRRRR|SO
4|ZZZZ ZZ|SO Job
5|AAAA|YU

文件很大,所以我不能使用StringEscapeUtils。对此有什么建议吗?

您可以使用带有自定义分量计的Scanner。 我使用的分量计设置为匹配n但不u0001n(其中u0001表示CTRL+A):

try {
    PrintWriter writer = new PrintWriter("dboutput.txt");
    Scanner sc = new Scanner(new File("dbinput.txt"));
    sc.useDelimiter(Pattern.compile("^(?!.*(\u0001\n)).*\n$"));
    while (sc.hasNext()) {
        writer.println(sc.next());
    }
    scanner.close();
    writer.close();
} catch (FileNotFoundException e) {
   e.printStackTrace();
} 

蒂姆的回答部分正确。但是,它仍然无法解析 CTRL+A 转义的换行符。

这是我的解决方案(由蒂姆回答指导)

File f = new File("C:\Users\SV7104\Desktop\sampletest.txt");
Scanner sc = new Scanner(f).useDelimiter(Pattern.compile("\s*\u0002\n\s*"));
            while (sc.hasNext()) {
                System.out.print(1);
                System.out.println(sc.next().toString().replaceAll("\u0001\n", " "));
            }

如果有其他有效的方法,我也很想知道。

最新更新