0

レコード店のショッピング カートをシミュレートする Java プログラムを作成しようとしています。最初のステップは、ファイルを開いてinventory.txt内容を読み取ることです。これは、基本的に「ストアが提供するもの」です。次に、すべての行を個別に読み取り、id レコードと価格を処理する必要があります。

現在のメソッドは、必要なものに非常に近い結果を出力しますが、以下に示すように、次の行のアイテム ID を取得します。

idテキストドキュメントのすべての行を個別に処理し、次のアイテムを取得せずにすべてのデータを独自の変数に保存する方法を誰かが理解するのを手伝ってくれるかどうか疑問に思っていましたか?

public void openFile(){
    try{
        x = new Scanner(new File("inventory.txt"));
        x.useDelimiter(",");
    }
    catch(Exception e){
        System.out.println("Could not find file");
    }
}

public void readFile(){
    while(x.hasNext()){
        String id = x.next();
        String record = x.next();
        String price = x.next();            
        System.out.println(id + " " + record + " " + price);
        break;
    }
}

.txt ドキュメント:

11111, "Hush Hush... - Pussycat Dolls", 12.95
22222, "Animal - Ke$ha", 9.95
33333, "Hanging By A Moment - Lifehouse - Single, 4.95
44444, "Have A Nice Day - Bon Jovi", 9.99
55555, "Day & Age - Killers", 10.99
66666, "She Wolf - Shakira", 15.99
77777, "Dark Horse - Nickelback", 12.99
88888, "The E.N.D. - Black Eyed Peas", 10.95

実際の出力

11111  "Hush Hush... - Pussycat Dolls"  12.95
22222

期待される結果

11111  "Hush Hush... - Pussycat Dolls"  12.95
4

5 に答える 5

4

したがって、ここでの問題は、コンマで改行していることであり、コンマと改行で改行する必要があります。ただし、他にも多くのコーナー ケースがあります (たとえば、列が "abc,,,abc" の場合、それらのコンマで区切る必要はありません)。Apache Commons には、これらのコーナー ケースをすべて処理する CSVParser が付属しています。これを使用する必要があります。

http://commons.apache.org/csv/apidocs/org/apache/commons/csv/CSVParser.html

于 2012-08-28T00:14:51.940 に答える
1

Patternへの引数としてa を使用できますScanner.useDelimiter。これを使用して、区切り記号 (コンマまたは行区切り記号) の代替を提供します。

x.useDelimiter(",|" + System.getProperty("line.separator"));

入力ファイルが行区切りとして使用するものによっては、2 番目のオプションを変更する必要がある場合があります。

既存の CSV ライブラリを使用するという他の回答のアドバイスは適切です。CSV の解析は、入力をコンマで区切るほど単純ではありません。

于 2012-08-28T00:18:40.943 に答える
0

これを実現するには複数の方法がありますが、独自の方法で、最初に Scanner を使用して行を読み取り (Java の「line.separator」を区切り文字として使用)、次に Scanner クラスをカンマを区切り文字として再度使用することができます。

于 2012-08-28T00:15:12.330 に答える
0

あなたが直面する問題は、CSV がStringカンマで分割するだけではないということです。「エスケープされた」コンマ (区切りたくないコンマ) について考慮すべき考慮事項があります。

多くの時間と頭の痛みを節約し、既存の API を使用することをお勧めします。

Apache Commons については既に説明しました。私は最近OpenCSVを使用しましたが、非常に使いやすく強力であることがわかりました。

私見では

于 2012-08-28T00:19:20.620 に答える
0

ファイル全体を文字列 (行) のリストに読み込む簡単な方法...

public class Scanner {
public static List<String> readLines(String filename) throws IOException {
    FileReader fileReader = new FileReader(filename);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    List<String> lines = new ArrayList<String>();
    String line = null;
    while ((line = bufferedReader.readLine()) != null) {
        lines.add(line);
    }
    bufferedReader.close();
    return lines;
  }
}

次に、各行が独自の String オブジェクトであるため、個々の行を以前と同様に処理できます。つまり、CSVParser を使用しない場合です。

于 2012-08-28T01:27:07.837 に答える