4

我目前正在做一个项目,我在表格中收集了大量有关进程和 CPU 使用情况、电池使用情况等的信息。

例如,“日志表”包含列“进程”、“Pid”、“电池”,另一个表“CPU 表”包含例如“进程”、“CPU 时间”、“CPU 使用率”。该程序同时写入所有这些表,因此每个读数在所有表中都有自己的行。

我创建了一个程序,它获取所有这些信息并为所有进程创建一个单独的 CSV 文件。在这些文件中,我希望获得所有四个表中有关该特定进程的所有信息。

我遇到的问题是,由于某种原因,当我尝试将信息带入时,其中一个表复制了另一个表中每条记录的记录。

问题

如您所见,“日志表”中的信息正确写入,但“CPU 表”中的信息(最右边的 7 列)为“日志”的每个条目重复第一条记录,然后对其次,对于每条 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?任何帮助将不胜感激,被困在这个程序上数周无济于事,谷歌没有帮助!

谢谢。

如果您需要任何信息或代码查看,请询问!

4

2 回答 2

2

您正在隐式执行两个表logcpuinfo此处的内部联接,您需要决定如何正确关联来自 的一条记录和来自log的一条记录cpuinfolog您编写的查询有效地为来自 的每条记录与来自 的每条记录连接起来创建一个结果记录cpuinfo,然后您的WHERE子句将该结果集限制为仅处理匹配的那些记录。

这似乎不是您想要的;在我看来,您可能希望将流程匹配且时间戳也匹配的记录关联起来。天真地,这可能如下所示:

SELECT * FROM log, cpuinfo WHERE log.Process = ?  AND cpuinfo.Process = ? 
  AND log.Timestamp = cpuinfo.Timestamp

但是,我相信您的解决方案实际上比天真地比较时间戳要复杂一些。看起来可能有一种方法可以将时间戳从一个表匹配到另一个表,但似乎相关的时间戳可能并不相同。例如,最早的时间戳 inlog看起来像 26:04.2 而不是 26:04.3 in cpuinfo。您需要根据应用程序逻辑决定将两个时间戳相互关联的方式。这将WHERE相应地影响您的条款。

于 2013-01-30T15:09:58.560 回答
0

以下应该可以工作并删除重复的记录。

Select * FROM log, cpuinfo WHERE log.Process = cpuinfo.Process and      log.Process = ?
于 2013-01-30T15:04:05.923 回答