CSV

2016-12-16 10 views
0

出力目標から出現数を取得する:CSV

Apache 2.0.44 (Linux) - 2 
Cisco IOS - 4 
Linux Kernel 2.4.20 - 1 
Microsoft IIS 5.0 < 5.1 - 2 

電流出力m.group(1):

Apache 2.0.44 (Linux) 
Apache 2.0.44 (Linux) 
Cisco IOS 
Cisco IOS 
Cisco IOS 
Cisco IOS 
Linux Kernel 2.4.20 
Microsoft IIS 5.0 < 5.1 
Microsoft IIS 5.0 < 5.1 

私はCSVファイルを持って、私はよ(タイトルと呼ばれる)第3列の出力をうまく取り込んで不要なコンテンツを削除します(その行のコンテンツのみを必要とし、 " - "の後にすべてを削除したい)

import sys, csv, operator, re 

reader = csv.reader(open("test.csv"), delimiter=",") 
sortedlist = sorted(reader, key=operator.itemgetter(2), reverse=False) 
for id, path, title, date, author, platform, type, port in sortedlist: 
    m = re.search(r'^(.*?)\-.*', title) 
    if m: 
     print m.group(1) 

ここで、リピートを削除するには、m.group(1)の内容が必要ですが、発生する回数が表示されます。 Counterを使用すると、各アイテムの1文字ごとにカウントされます...私は迷っています。

+0

をその1つの列からのコンテンツ**、あなたは? – martineau

+0

いくつかの答えに基づいてあなたのコメントに基づいて、わずかに異なるタイトルの異なるアイテムをどのように数えるかについての重要な詳細を残しているようです。これを明確にしてください。 – martineau

答えて

0

m.group(1)を印刷する代わりに、結果のリストに追加します。次に、そのリストにCounterを使用します。

0
import sys, csv, operator, re, collections 

result = collections.Counter() 
reader = csv.reader(open("test.csv"), delimiter=",") 
sortedlist = sorted(reader, key=operator.itemgetter(2), reverse=False) 
for id, path, title, date, author, platform, type, port in sortedlist: 
    m = re.search(r'^(.*?)\-.*', title) 
    if m: 
     result[m.group(1)] += 1 

for group, count in results.items(): 
    print('{} - {}'.format(group, count)) 
+0

collection.Counter()Counter()の代わりに – DaveQ

+0

これはスーパークローズです。しかし、すべての結果の後に "1"を出力します。そのうちいくつかは複数の結果を持つ必要があります。 – M3G4N

+0

私は、これは、元の入力がすべての回線で異なるためです。そのため、「Cisco IOS - something」という行と、「Cisco IOS-somethingElse」という行があります。正規表現は2つの行を同じように見せますが、元々は少し異なります。助けてくれてありがとうございました。あなたがこれに近づく方法を知っていれば教えてください.... – M3G4N

0

私の答えは@Raymondヘッティンガーの(彼は答えを投稿私を倒す)と非常によく似ていますが、私はまた、正規表現を修正し、いくつかの他の変更作られた:あなたが唯一の希望を意味

from collections import Counter 
import csv 
import operator 
import re 
import sys 

counter = Counter() 
with open("occurrences.csv", 'rb') as csvfile: 
    data = [row for row in csv.reader(csvfile, delimiter=",")] 
    for id, path, title, date, author, platform, type, port in data: 
     m = re.search(r'^(.*?)\s*\-.*', title) 
     title = m.group(1) if m else title 
     counter.update([title]) 

for title, count in sorted(counter.items()): 
    print('{} - {}'.format(title, count)) 
+0

私は必要なものに近づきますが、@Raymond Hettingerの投稿のように、すべての行の後に "1"を出力します。そのうちのいくつかはもっと... ...私は彼のコメントにもっと多くの情報を残しました。これまでのご協力ありがとうございます! – M3G4N

+0

" - "文字の後ろにあるものだけが異なる2つのタイトルがある場合、それらの間のタイトルの違いは表示されないため、出力(カウント)はどうなりますか?それが1のカウントを持つ2つの別々の行である場合、どのように出力でそれらを区別するでしょうか?質問を編集してサンプル入力を追加すると、タイトルの「 - 」文字の後にのみ異なるものも含めてください。 – martineau