我最近被要求获取一个如下所示的 .csv 文件:
变成这样:
请记住,由于每次用户登录/注销时都会创建一个新行,因此会有数百甚至数千行,并且不仅仅是两个用户。我的第一个想法是将 .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
您可以使用它稍加调整来从额外的列中提取日期。
让我给你一个例子,以防你决定使用 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
. 这就是我们使用(?, ?, ?)
.