2012-10-27 302 views
4

我最近一直在要求採取.csv文件看起來像這樣:處理CSV數據

enter image description here

弄成這個樣子:

enter image description here

銘記,有由於每次用戶登錄/註銷時都會創建一個新行,因此數以百計(如果不是成千上萬行),並且將不僅僅是兩個用戶。我的第一個想法是將.csv文件加載到MySQL中,然後對其運行查詢。但是,我真的不想在將用於此的機器上安裝MySQL。

我可以做手工在Ecxel /開放式辦公每個代理,但被錯誤的小房間因,有這麼多的線路要做到這一點,我想這個過程自動化。什麼是最好的方式去做呢?

+0

約sqlite的是什麼? –

+0

SQLite會很好,我只是想避免使用數據庫。 我真的希望有Excel中的一個功能,或者能夠處理的.csv,能夠快速,輕鬆地做到這一點的任何程序。 –

+0

那麼,請記住,excel有一個相當小的限制,所以有成千上萬的行可以達到此限制。建立一個數據庫來管理這些數據量,並且創建一個腳本來添加一個新行將會很簡單。 –

回答

1

讓我給你如果你決定使用SQLite的例子。你沒有指定一種語言,但我會使用Python,因爲它可以被讀爲僞代碼。這部分是創建你的源碼文件:

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個值。這就是我們使用(?, ?, ?)的原因。

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 

可以與轉小調整使用從額外的列中提取日期。

+0

+1我將不得不看'awk'。這非常了不起。 – brettdj