4

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

在此处输入图像描述

变成这样:

在此处输入图像描述

请记住,由于每次用户登录/注销时都会创建一个新行,因此会有数百甚至数千行,并且不仅仅是两个用户。我的第一个想法是将 .csv 文件加载到 MySQL 中,然后对其运行查询。但是,我真的不想在将用于此的机器上安装 MySQL。

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

4

2 回答 2

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

您可以使用它稍加调整来从额外的列中提取日期。

于 2012-10-28T01:00:09.437 回答
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. 这就是我们使用(?, ?, ?).

于 2012-10-28T00:25:01.783 回答