1

似たような質問がいくつかありますが、満足のいく答えは見つかりませんでした。各行が次のようなカンマ区切りのファイルがあります。

4477,52544,,,P,S,    ,,SUSAN JONES,9534 Black Bear Dr,,"CITY, NV 89506",9534 BLACK BEAR DR,,CITY,NV,89506,2008,,,,  ,     ,    , ,,1

発生する問題は、トークンが "CITY, NV 89506" という引用符でコンマをエスケープする場合です。

エスケープされたトークンが処理され、空のトークンも含めてすべてのトークンが含まれる結果が必要です。

4

2 に答える 2

2

opencsvなどの適切な CSV パーサーを検討してください。それは高度にテストされ(新しい自家製のソリューションとは異なり)、あなたが説明したような(そしてあなたが考えていなかった多くの)エッジ条件を処理します。

ダウンロードには、次の行の「addresses.csv」を含むサンプル フォルダーがあります。

Jim Sample,"3 Sample Street, Sampleville, Australia. 2615",jim@sample.com

同じディレクトリにあるファイル AddressExample.java がこのファイルを解析し、質問に非常に関連しています。

于 2012-10-04T23:37:11.010 に答える
0

提供されたメソッドを使用して質問に答える 1 つの方法を次に示しますjava.lang.String。私はそれがあなたが必要とすることをすると信じています。

private final char QUOTE = '"';
private final char COMMA = ',';
private final char SUB = 0x001A; // or whatever character you know will NEVER
    // appear in the input String

public void readLine(String line) {
    System.out.println("original: " + line);

    // Replace commas inside quoted text with substitute character
    boolean quote = false;
        for (int index = 0; index < line.length(); index++) {
        char ch = line.charAt(index);
        if (ch == QUOTE) {
            quote = !quote;
        } else if (ch == COMMA && quote) {
            line = replaceChar(line, index, SUB);
            System.out.println("replaced: " + line);
        }
    }

    // Strip out all quotation marks
    for (int index = 0; index < line.length(); index++) {
        if (line.charAt(index) == QUOTE) {
            line = removeChar(line, index);
            System.out.println("stripped: " + line);
        }
    }

    // Parse input into tokens
    String[] tokens = line.split(",");
    // restore commas in place of SUB characters
    for (int i = 0; i < tokens.length; i++) {
        tokens[i] = tokens[i].replace(SUB, COMMA);
    }

    // Display final results
    System.out.println("Final Parsed Tokens: ");
    for (String token : tokens) {
        System.out.println("[" + token + "]");
    }
}

private String replaceChar(String input, int position, char replacement) {
    String begin = input.substring(0, position);
    String end = input.substring(position + 1, input.length());
    return begin + replacement + end;
}

private String removeChar(String input, int position) {
    String begin = input.substring(0, position);
    String end = input.substring(position + 1, input.length());
    return begin + end;
}
于 2012-10-09T12:01:33.760 に答える