将几个表/列放入 CSV 文件
Posted
技术标签:
【中文标题】将几个表/列放入 CSV 文件【英文标题】:Putting several tables/columns in to CSV file 【发布时间】:2013-01-14 10:04:03 【问题描述】:我目前正在做一个项目,我在表格中收集有关进程和 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?任何帮助都将不胜感激,在这个程序上停留了数周无济于事,谷歌也没有提供帮助!
谢谢。
如果您需要任何信息或代码查看,请务必询问!
【问题讨论】:
这被标记为 php 有什么特别的原因吗? 您是否检查了数据库并查看记录是否在那里重复? 您应该改掉将 SQL 语句串在一起的习惯,改用准备好的语句。但这并不能解决您的问题... 检查您的查询是否返回您认为的内容。这可能是重复的来源,而不是 CSV。另外,我会像这样编写您的 where 子句:log.Process = cpuinfo.Process AND log.Process = " + "'" + procs[i] + "'"
这将确保您正在寻找的连接发生(更明显的是,这就是您想要做的)。然后您可以按您的输入进行过滤。
@JesanFafon 使用 sqlite 数据库浏览器,查询仍然混乱并重复记录,所以我认为这与 sql 语句的性质有关。重写没有帮助,但它更整洁,所以谢谢。此外,记录不会重复。
【参考方案1】:
以下应该可以工作并删除重复的记录。
Select * FROM log, cpuinfo WHERE log.Process = cpuinfo.Process and log.Process = ?
【讨论】:
不怕,还是因为某种原因产生了重复记录。【参考方案2】:您在此处隐式执行log
和cpuinfo
两个表的内连接,您需要决定如何正确关联log
中的一条记录与cpuinfo
中的一条记录。您编写的查询有效地为来自log
的每条记录与来自cpuinfo
的每条记录创建了一个结果记录,然后您的WHERE
子句将该结果集限制为仅处理匹配的那些记录。
这似乎不是你想要的;在我看来,您可能希望将流程匹配且时间戳也匹配的记录关联起来。天真地,这可能如下所示:
SELECT * FROM log, cpuinfo WHERE log.Process = ? AND cpuinfo.Process = ?
AND log.Timestamp = cpuinfo.Timestamp
但是,我相信您的解决方案实际上比简单地比较时间戳要复杂一些。看起来可能有一种方法可以将时间戳从一个表匹配到另一个表,但似乎相关的时间戳可能并不相同。例如,log
中最早的时间戳看起来像 26:04.2,而不是 cpuinfo
中的 26:04.3。您需要根据应用程序逻辑决定将两个时间戳相互关联的方式。这会相应地影响您的 WHERE
子句。
【讨论】:
非常感谢。我已经更改了初始程序,以便时间戳使用相同的变量并因此匹配,然后使用您用来排除重复项的 sql 语句!以上是关于将几个表/列放入 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章