3

データベース (Vertica) にエクスポートする必要がある Unicode ファイルがあります。列の区切り文字は CTRL+B、レコードの区切り文字は改行 (\n) です。列値内に改行がある場合は常に、CTRL+A がエスケープ文字として使用されます。

BufferedReader.readLine() を使用してこのファイルを読み取ると、ID が 2 と 4 のレコードが 2 つのレコードとして読み取られます。出力に示されているように、それらを単一のレコード全体として読み取りたいのですが。

入力ファイルの例を次に示します。| | は 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 が使えません。これに関する提案はありますか?

4

2 に答える 2

2

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();
} 
于 2015-04-28T02:15:10.733 に答える
0

ティムの答えは部分的に正しい。ただし、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", " "));

            }

他に効率的な方法があれば、それについても知りたいです。

于 2015-04-28T19:50:17.903 に答える