正在读取 java 文件,其中包含用于换行的转义字符
Reading java file with escape characters for newline
我有一个 Unicode 文件需要导出到数据库 (Vertica)。列分隔符为CTRL+B,记录分隔符为换行符(\n)。每当列值中有换行符时,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
但 而不是 \u0001\n
(其中 \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", " "));
}
如果还有其他有效的方法,我也很想知道。
我有一个 Unicode 文件需要导出到数据库 (Vertica)。列分隔符为CTRL+B,记录分隔符为换行符(\n)。每当列值中有换行符时,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
但 而不是 \u0001\n
(其中 \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();
}
这是我的解决方案(参考
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", " "));
}
如果还有其他有效的方法,我也很想知道。