处理CSV数据

时间:2012-10-27 23:28:36

标签: excel csv

我最近被要求带一个看起来像这样的.csv文件:

enter image description here

这样的事情:

enter image description here

请记住,每次用户登录/退出时,由于创建了新行,将会有数百行(如果不是数千行),而且不仅仅是两个用户。我的第一个想法是将.csv文件加载到MySQL然后对其运行查询。但是,我真的不想在将用于此的机器上安装MySQL。

我可以为Ecxel / Open Office中的每个代理手动执行此操作,但由于几乎没有错误的余地,并且有很多行要执行此操作,我希望自动化该过程。什么是最好的方法呢?

2 个答案:

答案 0 :(得分:2)

此单行仅依赖于awkdate来回转换为时间戳:

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个值。这就是我们使用(?, ?, ?)

的原因