4

最近、次のような .csv ファイルを取るように依頼されました。

ここに画像の説明を入力

このようなものに:

ここに画像の説明を入力

ユーザーがログイン/ログアウトするたびに新しい行が作成されるため、数千ではないにしても数百の行があり、2 人以上のユーザーが存在することに注意してください。私が最初に考えたのは、.csv ファイルを MySQL にロードしてから、クエリを実行することでした。ただし、これに使用されるマシンにMySQLをインストールしたくありません。

Ecxel/Open Office のエージェントごとに手動で行うこともできますが、エラーが発生する余地がほとんどなく、これを行う行が非常に多いため、プロセスを自動化したいと考えています。それについて行く最善の方法は何ですか?

4

2 に答える 2

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

余分な列から日付を抽出するために、少し調整するだけでこれを使用できます。

于 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 ファイルから行を読み取ったら、データベースに行を挿入します。データベースに 3 つのフィールドしか作成していないことに注意してくださいlist_of_values。を使用しているのはそのため(?, ?, ?)です。

于 2012-10-28T00:25:01.783 に答える