【问题标题】:Getting the number of occurrences from a CSV从 CSV 获取出现次数
【发布时间】:2017-05-01 18:49:38
【问题描述】:

输出目标

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 计算每个项目的每个字母...我不知所措。

【问题讨论】:

  • 你的意思是你只想要那个的内容,不是吗?
  • 根据您在几个答案下的 cmets,您似乎留下了一些重要的细节,说明您希望如何计算标题略有不同的不同项目。请澄清这一点。

标签: python sorting csv count counter


【解决方案1】:

不打印 m.group(1),而是将其附加到结果列表中。然后在该列表中使用Counter

【讨论】:

    【解决方案2】:

    我的答案与@Raymond Hettinger 的非常相似(他在发布答案时击败了我),但我还修改了正则表达式并进行了一些其他修改:

    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))
    

    【讨论】:

    • 超级接近我的需要,但就像@Raymond Hettinger 的帖子一样,它在每一行之后输出“1”,其中一些应该更多......我在他的评论中留下了更多信息。感谢您迄今为止的帮助!
    • 因此,如果您有两个标题仅因“-”字符后面的内容而异,那么它们的输出(计数)究竟是什么,因为它们之间的标题差异不会显示?如果它是计数为 1 的两条单独的行,如何在输出中区分它们?如果您编辑您的问题并向其中添加一些示例输入,这也将非常有用 - 请确保包含一些仅在标题中“-”字符后面的内容不同的内容。
    【解决方案3】:
    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))
    

    【讨论】:

    • collection.Counter() 而不是 Counter()
    • 好的,这非常接近。但是,它在每个结果之后输出“1”,而其中一些结果应该不止一个。
    • 我认为这是因为每行的原始输入都不同......所以我可能有一行写着“Cisco IOS - something”,另一行写着“Cisco IOS - somethingElse”。正则表达式使两条线看起来相同,但最初它们略有不同。感谢您到目前为止的帮助,如果您有任何想法如何解决这个问题,请告诉我......
    • @M3G4N:所以你会希望这两条 Cisco 线路分别计算,但是当它们与它们的计数一起显示时,它们看起来就像是被计算为两个独立的一样(这不是true 因为它们在输入中确实有不同的标题,但没有显示)。
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2021-04-06
    • 2016-06-09
    • 2018-02-17
    • 2020-12-25
    • 1970-01-01
    • 2013-04-20
    • 2013-12-29
    相关资源
    最近更新 更多