处理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
插入三个值。 这就是为什么我们使用(?, ?, ?)
。