将几个表/列放入 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】:

您在此处隐式执行logcpuinfo 两个表的内连接,您需要决定如何正确关联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 文件的主要内容,如果未能解决你的问题,请参考以下文章

将 MultiIndex 数据帧与列标题连接起来

拆分日期和时间然后放入其他列[关闭]

从 CSV 导入的数据被放入错误的 mysql 列

MATLAB:从读取并放入单元格的csv文件制作直方图?

读取单列 CSV 文件的更快方法

BASH - 如何从 CSV 文件中的列中提取数据并将其放入数组中?