だから私は.csvファイルの解析に取り組んでいます。StackOverflow のどこかにある別のスレッドのアドバイスを受けて、SuperCSV をダウンロードしました。最終的にほとんどすべてが機能するようになりましたが、修正が難しいと思われるバグに遭遇しました。
この問題は、データの最後の 2 つの列が入力される場合と入力されない場合があるために発生します。以下は、最初の行に最後の列がなく、2 番目の行が完全な .csv ファイルの例です。
2012:07:25,11:48:20,922,"uLog.exe","",キーが押されました,1246,341,-1.00,-1.00,1.00,Shift 2012:07:25,11:48:21,094," uLog.exe","",キーが押されました,1246,341,-1.00,-1.00,1.00,b,Shift
Super CSV Javadocに関する私の理解では、可変数の列がある場合、Java Bean にCsvBeanReaderを設定する方法はありません。Bean の初期化時に、これらの欠落している列を null またはその他のデフォルト値にすることを許可する必要があると思うので、これは本当にばかげているようです。
参考までに、パーサーの完全なコードを次に示します。
public class ULogParser {
String uLogFileLocation;
String screenRecorderFileLocation;
private static final CellProcessor[] cellProcessor = new CellProcessor[] {
new ParseDate("yyyy:MM:dd"),
new ParseDate("HH:mm:ss"),
new ParseDate("SSS"),
new StrMinMax(0, 100),
new StrMinMax(0, 100),
new StrMinMax(0, 100),
new ParseInt(),
new ParseInt(),
new ParseDouble(),
new ParseDouble(),
new ParseDouble(),
new StrMinMax(0, 100),
new StrMinMax(0, 100),
};
public String[] header = {"Date", "Time", "Msec", "Application", "Window", "Message", "X", "Y", "RelDist", "TotalDist", "Rate", "Extra1", "Extra2"};
public ULogParser(String uLogFileLocation, String screenRecorderFileLocation)
{
this.uLogFileLocation = uLogFileLocation;
this.screenRecorderFileLocation = screenRecorderFileLocation;
}
public void parse()
{
try {
ICsvBeanReader reader = new CsvBeanReader(new BufferedReader(new FileReader(uLogFileLocation)), CsvPreference.STANDARD_PREFERENCE);
reader.getCSVHeader(false); //parse past the header
Entry entry;
entry = reader.read(Entry.class, header, cellProcessor);
System.out.println(entry.Application);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void sendToDB()
{
Query query = new Query();
}
}
Entry クラスのコードは次のとおりです。
public class Entry
{
private Date Date;
private Date Time;
private Date Msec;
private String Application;
private String Window;
private String Message;
private int X;
private int Y;
private double RelDist;
private double TotalDist;
private double Rate;
private String Extra1;
private String Extra2;
public Date getDate() { return Date; }
public Date getTime() { return Time; }
public Date getMsec() { return Msec; }
public String getApplication() { return Application; }
public String getWindow() { return Window; }
public String getMessage() { return Message; }
public int getX() { return X; }
public int getY() { return Y; }
public double getRelDist() { return RelDist; }
public double getTotalDist() { return TotalDist; }
public double getRate() { return Rate; }
public String getExtra1() { return Extra1; }
public String getExtra2() { return Extra2; }
public void setDate(Date Date) { this.Date = Date; }
public void setTime(Date Time) { this.Time = Time; }
public void setMsec(Date Msec) { this.Msec = Msec; }
public void setApplication(String Application) { this.Application = Application; }
public void setWindow(String Window) { this.Window = Window; }
public void setMessage(String Message) { this.Message = Message; }
public void setX(int X) { this.X = X; }
public void setY(int Y) { this.Y = Y; }
public void setRelDist(double RelDist) { this.RelDist = RelDist; }
public void setTotalDist(double TotalDist) { this.TotalDist = TotalDist; }
public void setRate(double Rate) { this.Rate = Rate; }
public void setExtra1(String Extra1) { this.Extra1 = Extra1; }
public void setExtra2(String Extra2) { this.Extra2 = Extra2; }
public Entry(){}
}
そして、私が受け取っている例外 (これは上記の例とは異なる行であり、最後の 2 つの列の両方が欠落していることに注意してください):
スレッド「メイン」の例外 値配列 (サイズ 12) はプロセッサ配列 (サイズ 13) と一致する必要があります: おそらく、指定された cellprocessors の数とは異なる列数の CSV 行を読み取っています コンテキスト: 行: 2 列: 0生の行: [2012:07:25, 11:48:05, 740, uLog.exe, , ログ開始, -1, -1, -1.00, -1.00, -1.00, ] 問題のあるプロセッサ: null org.supercsv.util.Util.processStringList (不明なソース) で org.supercsv.io.CsvBeanReader.read (不明なソース) で 処理中.ULogParser.parse(ULogParser.java:59) ui.ParseImplicitData.main(ParseImplicitData.java:15) で
はい、ゲッターとセッターをすべて書くのは大変でした。また、申し訳ありませんが、SuperCSV の使用には完全な慣習はありません (変更されていない文字列が必要な場合に使用する CellProcessor など) が、アイデアはわかります。また、このコードは明らかに完全ではありません。今のところ、1 行のデータを正常に取得しようとしています。
この時点で、私の目的のために CsvBeanReader を使用できるかどうか疑問に思っています。そうでない場合は、CsvListReader (ハイパーリンクを投稿しますが、StackOverflow も私を許可していません) は、API をまったく使用せず、Scanner.next を使用するのと同じくらい簡単であるため、少しがっかりしています。 ().
どんな助けでも大歓迎です。前もって感謝します!