我目前正在做一个项目,我收集了大量有关流程和CPU使用情况,电池使用情况等信息的表格。
例如,“Log table”包含列'Process','Pid','Battery'和另一个表“CPU Table”,包含例如'Process','CPU Time','CPU Usage'。程序同时写入所有这些表,因此每个读数在所有表中都有自己的行。
我创建了一个程序,它可以获取所有这些信息,并为所有进程创建单独的CSV文件。在这些文件中,我希望获得所有四个表中有关该特定过程的所有信息。
我遇到的问题是,出于某种原因,当我尝试将信息输入时,其中一个表会复制另一个表中每条记录的记录。
正如您所看到的,“日志表”中的信息正确写出,但来自“CPU表”(最右边的7列)的信息重复“Log”的每个条目的第一条记录,然后执行对于第二个以及Log的每个记录都是相同的。
Procs [i]包含所有唯一的进程名称。
目前,我使用的sql语句是基本代码:
String query = "SELECT * FROM log, cpuinfo WHERE log.Process = " + "'" + procs[i] + "'" + " AND cpuinfo.Process = " + "'" + procs[i] + "'";
System.out.println(query);
rs = sment.executeQuery(query);
writer = new CSVWriter(new FileWriter(procs[i] + ".csv"), ',');
//writer = new CSVWriter(procs[i] + ".csv");
//System.out.println("Writing.....");
//rs.beforeFirst();
writer.writeAll(rs, true);
//writer.
writer.flush();
有谁可以看到程序为什么这样做并以这种方式编写CSV?任何帮助都会非常感激,被困在这个程序上几个星期现在无济于事,谷歌没有帮助!
感谢。
如果您需要任何信息或代码,请询问!
答案 0 :(得分:2)
您在这里隐式执行两个表log
和cpuinfo
的内部联接,您需要决定如何正确关联log
中的一条记录与{{{1}中的一条记录。 1}}。您的查询有效地为cpuinfo
的每个记录创建了一个结果记录,该记录与来自log
的每个记录相结合,然后您的cpuinfo
子句将该结果集限制为仅包含流程匹配。
这似乎不是你想要的;在我看来,您可能希望关联进程匹配的记录以及时间戳匹配。天真地看起来如下:
WHERE
但是,我相信你的解决方案实际上比天真地比较时间戳要复杂一些。看起来可能有一种方法可以将时间戳从一个表与另一个表进行匹配,但似乎相关的时间戳可能不相同。例如,SELECT * FROM log, cpuinfo WHERE log.Process = ? AND cpuinfo.Process = ?
AND log.Timestamp = cpuinfo.Timestamp
中最早的时间戳看起来像26:04.2而不是log
中的26:04.3。您需要根据应用程序逻辑决定将两个时间戳相互关联的方式。这会相应地影响您的cpuinfo
条款。
答案 1 :(得分:0)
以下内容应该有效并删除重复的记录。
Select * FROM log, cpuinfo WHERE log.Process = cpuinfo.Process and log.Process = ?