Javaで解析する必要があるこの種のCSVファイルがあります。
2012-11-01 00, 1106, 2194.1971066908
2012-11-01 01, 760, 1271.8460526316
.
.
.
2012-11-30 21, 1353, 1464.0014781966
2012-11-30 22, 1810, 1338.8331491713
2012-11-30 23, 1537, 1222.7826935589
720 rows selected.
Elapsed: 00:37:00.23
これは、各列を分離してリストに格納するために作成した Java コードです。
public void extractFile(String fileName){
try{
BufferedReader bf = new BufferedReader(new FileReader(fileName));
try {
String readBuff = bf.readLine();
while (readBuff!=null){
Pattern checkData = Pattern.compile("[a-zA-Z]");
Matcher match = checkData.matcher(readBuff);
if (match.find()){
readBuff = null;
}
else if (!match.find()){
String[] splitReadBuffByComma = new String[3];
splitReadBuffByComma = readBuff.split(",");
for (int x=0; x<splitReadBuffByComma.length; x++){
if (x==0){
dHourList.add(splitReadBuffByComma[x]);
}
else if (x==1){
throughputList.add(splitReadBuffByComma[x]);
}
else if (x==2){
avgRespTimeList.add(splitReadBuffByComma[x]);
}
}
}
readBuff = bf.readLine();
}
}
finally{
bf.close();
}
}
catch(FileNotFoundException e){
System.out.println("File not found dude: "+ e);
}
catch(IOException e){
System.out.println("Error Exception dude: "+e);
}
}
問題は、私が作成した正規表現に「720 行が選択されました」というテキストがまだ含まれており、dHourList に格納されているため、少し不完全であることです。dHourList
は、この「2012-11-01 00...etc」のように表される日付列のみを格納する必要があります。
これに対する正しい正規表現は何ですか?
アップデート
2012 年 11 月 30 日 21 2012 年 11 月 30 日 22 2012 年 11 月 30 日 23
720 行が選択されました。
経過時間: 00:37:00.23
日時のサイズ: 724 スループットのサイズ: 720 平均応答時間のサイズ: 720
代わりにこれをcheckData正規表現で使用しました.1つのスラッシュを使用すると \d コンパイルすると無効なエスケープシーケンスが表示されるためです
Pattern checkData = Pattern.compile("^(19|20)\\d\\d([-/.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])\b.+$");
しかし、まだ720行が選択されており、そこにあるはずのない別の行が表示されています。
更新 2
作業コード:
while (readBuff!=null){
Pattern checkData = Pattern.compile("^(19|20)\\d\\d([-/.])(0[1-9]|1[012])\\2(0[1-9]|[12][0-9]|3[01])\\b.+$");
Matcher match = checkData.matcher(readBuff);
if (!match.find()){
readBuff = null;
}
else{
String[] splitReadBuffByComma = new String[3];
splitReadBuffByComma = readBuff.split(",");
for (int x=0; x<splitReadBuffByComma.length; x++){
if (x==0){
dHourList.add(splitReadBuffByComma[x]);
}
else if (x==1){
throughputList.add(splitReadBuffByComma[x]);
}
else if (x==2){
avgRespTimeList.add(splitReadBuffByComma[x]);
}
}
}
readBuff = bf.readLine();
}
else if条件を削除してelseに変更し、Cylianが提案した正規表現を使用した結果、出力が得られました
2012-11-30 21
2012-11-30 22
2012-11-30 23
Size of date-hour: 720 size of throughput: 720 size of avg resp time: 720
どうもありがとう!