0

次のデータ形式のcsvファイルがあります

123,"12.5","0.6","15/9/2012 12:11:19"

これらの数値は次のとおりです。

  • 注文番号
  • 価格
  • 割引率
  • 販売日時

これらのデータを行から抽出したいと思います。

私は正規表現を試しました:

String line = "123,\"12.5\",\"0.6\",\"15/9/2012 12:11:19\"";
Pattern pattern = Pattern.compile("(\\W?),\"([\\d\\.\\-]?)\",\"([\\d\\.\\-]?)\",\"([\\W\\-\\:]?)\"");
Scanner scanner = new Scanner(line);
if(scanner.hasNext(pattern)) {
    ...
}else{
    // Alaways goes to here
}

私のパターンは常にelseセクションに行くため、正しくないようです。私は何を間違えましたか?誰かがこれに対する解決策を提案できますか?

どうもありがとう。

4

5 に答える 5

1

具体的に分割するには少し複雑すぎるようです。要素間の最も明白な一般的な区切り文字であるカンマで分割してみてください。おそらく、次のようなことを試してみてください。

    final String info = "123,\"12.5\",\"0.6\",\"15/9/2012 12:11:19\"";
    final String[] split = info.split(",");
    final int orderNumber = Integer.parseInt(split[0]);
    final double price = Double.parseDouble(split[1].replace("\"", ""));
    final double discountRate = Double.parseDouble(split[2].replace("\"", ""));
    final String date = split[3].replace("\"", "");
于 2013-09-08T13:55:18.310 に答える
1

この種の作業では、正規表現は非常に扱いにくいものです。

代わりにOpenCSVなどの CSV ライブラリを使用することをお勧めします。

ライブラリはStringエントリをString配列に解析でき、必要に応じて個々のエントリを解析できます。特定の問題に対する OpenCSV の例を次に示します。

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
   int orderNumber = Integer.parseInt(nextLine[0]);
   double price = Double.parseDouble(nextLine[1]);
   double discountRate = Double.parseDouble(nextLine[2]);
   ...
}

完全なドキュメントと例はここにあります

于 2013-09-08T14:07:21.133 に答える
0

?正規表現では、「ゼロまたは1回の出現」を意味します。+代わりに (1 つ以上)を使用して、すべての数字、ポイント、コロンなどをキャプチャできるようにすることをお勧めします。

于 2013-09-08T14:01:58.657 に答える
0

scanner.hasNext(pattern)

ドキュメントから

次の完全なトークンが指定されたパターンと一致する場合、true を返します。

しかし、次のトークンは123,"12.5","0.6","15/9/2012、スキャナーがスペースを使用して単語をトークン化するためです。

また、正規表現にはほとんど問題がありません

  • あなたが使用したことは、使用すべき場所でゼロまたは 1?を意味します- ゼロ以上、または- 1 つ以上、*+
  • 最初に使用\\Wしましたが、これも数字を除外します。

本当にスキャナーと正規表現を使用したい場合は、試してみてください

Pattern.compile("(\\d+),\"([^\"]+)\",\"([^\"]+)\",\"([^\"]+)\"");

使用されている区切り文字を新しい行マークに変更します

scanner.useDelimiter(System.lineSeparator());
于 2013-09-08T14:08:27.893 に答える