处理CSV数据

我最近被要求采取如下所示的.csv文件:

在这里输入图像说明

像这样的东西:

在这里输入图像说明

请记住,由于每次用户login/注销时都会创build一个新行,因此将会有数百行(如果不是数千行),并且不止两个用户。 我的第一个想法是将.csv文件加载到MySQL然后运行一个查询。 但是,我真的不想在将用于此的机器上安装MySQL。

我可以为Ecxel / Open Office中的每个代理手动执行此操作,但是由于没有出现错误的空间,并且有很多行要做,所以我想自动执行此过程。 什么是最好的方式去呢?

这一行只依赖于awk ,并且可以将date转换为时间戳:

 awk 'BEGIN{FS=OFS=","}NR>1{au=$1 "," $2;t=$4; \ "date -u -d \""t"\" +%s"|getline ts; sum[au]+=ts;}END \ {for (a in sum){"date -u -d \"@"sum[a]"\" +%T"|getline h; print a,h}}' test.csv 

有这样的test.csv:

 Agent,Username,Project,Duration AAA,aaa,NBM,02:09:06 AAA,aaa,NBM,00:15:01 BBB,bbb,NBM,04:14:24 AAA,aaa,NBM,00:00:16 BBB,bbb,NBM,00:45:19 CCC,ccc,NDB,00:00:01 

结果是:

 CCC,ccc,00:00:01 BBB,bbb,04:59:43 AAA,aaa,02:24:23 

你可以使用这个很小的调整从额外的列中提取date。

让我给你一个例子,如果你决定使用SQLite。 你没有指定一种语言,但我会使用Python,因为它可以被读为伪代码。 这部分创build你的sqlite文件:

 import csv import sqlite3 con = sqlite3.Connection('my_sqlite_file.sqlite') con.text_factory = str cur = con.cursor() cur.execute('CREATE TABLE "mytable" ("field1" varchar, \ "field2" varchar, "field3" varchar);') 

并使用以下命令:

 cur.executemany('INSERT INTO stackoverflow VALUES (?, ?, ?)', list_of_values) 

一旦从csv文件读取数据库,就可以在数据库中插入行。 请注意,我们只在数据库中创build了三个字段,所以我们只能从list_of_values插入三个值。 这就是为什么我们使用(?, ?, ?)