读取带有换行符的java文件

8yparm6h  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(438)

我有一个unicode文件需要导出到数据库(vertica)。列分隔符是ctrl+b,记录分隔符是换行符(\n)。每当列值中有换行符时,ctrl+a将用作转义符。
当我使用bufferedreader.readline()读取这个文件时,id为2和4的记录被读取为两条记录。而我想把它们作为输出中给出的单个完整记录来读取。
下面是输入文件的示例表示ctrl+b,^表示ctrl+a。

  1. Input
  2. ID|Name|Job Desc
  3. ----------------
  4. 1|xxxx|SO Job
  5. 2|YYYY|SO Careers^
  6. Job
  7. 3|RRRRR|SO
  8. 4|ZZZZ^
  9. ZZ|SO Job
  10. 5|AAAA|YU
  11. Output:
  12. ID|Name|Job Desc
  13. ----------------
  14. 1|xxxx|SO Job
  15. 2|YYYY|SO Careers Job
  16. 3|RRRRR|SO
  17. 4|ZZZZ ZZ|SO Job
  18. 5|AAAA|YU

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

ttygqcqt

ttygqcqt1#

你可以使用 Scanner 用一个定制的delimeter。我使用的delimeter设置为匹配 \n 但不是 \u0001\n (其中 \u0001 代表 CTRL+A ):

  1. try {
  2. PrintWriter writer = new PrintWriter("dboutput.txt");
  3. Scanner sc = new Scanner(new File("dbinput.txt"));
  4. sc.useDelimiter(Pattern.compile("^(?!.*(\\u0001\\n)).*\\n$"));
  5. while (sc.hasNext()) {
  6. writer.println(sc.next());
  7. }
  8. scanner.close();
  9. writer.close();
  10. } catch (FileNotFoundException e) {
  11. e.printStackTrace();
  12. }
wkyowqbh

wkyowqbh2#

蒂姆的回答有一部分是对的。但是,它仍然不能解析由ctrl+a转义的新行。
下面是我的解决方案(由tim answer指导)

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

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

相关问题