【问题标题】:Reading java file with escape characters for newline读取带有换行符的转义符的java文件
【发布时间】:2015-07-06 15:26:51
【问题描述】:

我有一个需要导出到数据库 (Vertica) 的 Unicode 文件。列分隔符是 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。对此有何建议?

【问题讨论】:

  • 你想在这里做什么?读取输入文件并以不同格式输出?你的问题不清楚。
  • 我正在尝试读取文件并获取准备好的语句。我希望以输出格式读取文件。
  • 根据BufferedReader.readLine() 的文档,只有\n\r\n 被视为新行。您的记录 2 和 4 应该被读取为 2 个单独的行。
  • 2&4上的job desc值用换行符分隔,Ctrl+a用作转义字符。所以它把它们读成两行
  • 您可以使用 Scanner 与自定义分隔符设置为不匹配 CTRL+A 后跟 \n

标签: java escaping bufferedreader unicode-escapes


【解决方案1】:

您可以使用带有自定义分隔符的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();
} 

【讨论】:

  • Tim,你的不能解析 CTRL+A 转义的换行符。但是,我选择了这个,因为它很接近并导致了我正确的答案。你能解释一下你的正则表达式吗?谢谢
  • 正则表达式匹配\n,但不匹配\u0001\n。因此,记录中间的换行符将被视为文本。
【解决方案2】:

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

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

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", " "));

            }

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

【讨论】:

  • 在您的回答中,您使用的是\u0002\n 的分隔符,但随后您将\u0001\n 替换为空格。我认为您可以直接在整个输入上调用replaceAll
猜你喜欢
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 2015-07-07
相关资源
最近更新 更多