我最近被要求带一个看起来像这样的.csv文件:
这样的事情:
请记住,每次用户登录/退出时,由于创建了新行,将会有数百行(如果不是数千行),而且不仅仅是两个用户。我的第一个想法是将.csv文件加载到MySQL然后对其运行查询。但是,我真的不想在将用于此的机器上安装MySQL。
我可以为Ecxel / Open Office中的每个代理手动执行此操作,但由于几乎没有错误的余地,并且有很多行要执行此操作,我希望自动化该过程。什么是最好的方法呢?
答案 0 :(得分:2)
此单行仅依赖于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
您可以使用此方法进行少量调整,以便从额外的列中提取日期。
答案 1 :(得分:1)
如果您决定使用SQLite,请举个例子。你没有指定语言,但我会使用Python,因为它可以被读作伪代码。这部分创建了你的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文件中读取行后,在数据库中插入行。请注意,我们只在数据库中创建了三个字段,因此我们只插入list_of_values
中的3个值。这就是我们使用(?, ?, ?)
。