【问题标题】:Sum the values of a csv file based on a match from user input根据用户输入的匹配对 csv 文件的值求和
【发布时间】:2018-05-13 15:21:51
【问题描述】:

问题描述

我有一个 csv 文件,其中包含 3 位信息,如下所示,用逗号分隔。我有我的代码,如果我完全按照写入的方式输入第一个值,则该代码当前会返回我想要的第二个和第三个值。

如果输入为 25.803.1.1,我的用户输入示例确实告诉我 name = BALLOON 并且连接等于 357。我想在用户输入 25.803.1.1 的情况下进行这项工作,它会建议连接等于 357,但如果用户输入 25.803。它会给出所有匹配 25.803 的连接总和。如果用户输入 25. 它将给出以 25 开头的所有内容的连接总和。

所以我假设我需要一个 if 语句来查看是否有 1 个小数位或 2 个小数位或 3 个小数位,然后打印出结果。我不确定是否最好进行某种分组、过滤或匹配,或者我是否需要创建一个新列表,将日期的第一位按十进制拆分为一个看起来像 [[25] 的列表, [803], [1], [1]] 例如,然后尝试根据用户以某种方式输入的内容对其进行索引。非常感谢任何帮助。

如果输入为 25.803.1.1 则有效的当前代码

with open("D:/Python/Data/rttData.csv") as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')

    enbIDs = []
    enbNames = []
    enbRRCs = []

    for row in readCSV:
        enbID = row[0]
        enbName = row[1]
        enbRRC = row[2]

        enbNames.append(enbName)
        enbIDs.append(enbID)
        enbRRCs.append(enbRRC)

siteSelection = input('Enter the eNB number below to search for [ex: 25.803.1.1]')
enbIndex = enbIDs.index(siteSelection)
theName = enbNames[enbIndex]
theRRC = enbRRCs[enbIndex]
print('The name of site', siteSelection, 'is:', theName,'and the RRC Connections are:',theRRC)

CSV 文件

25.803.1.1,BALLOON,357
25.803.2.1,BALLOON,1941
25.803.3.1,BALLOON,3802
25.803.12.2,BALLOON,18783
25.803.22.2,BALLOON,20136
25.803.32.2,BALLOON,17560
25.803.14.4,BALLOON,2661
25.803.24.4,BALLOON,3472
25.803.34.4,BALLOON,4379
25.804.1.1,BANK,8410
25.804.2.1,BANK,7656
25.804.3.1,BANK,9822
25.804.12.2,BANK,9418
25.804.22.2,BANK,20522
25.804.32.2,BANK,14694
25.804.14.4,BANK,17569
25.804.24.4,BANK,16137
25.804.34.4,BANK,13835

【问题讨论】:

  • enbIDs.index(siteSelection) 返回 one 项的索引(如果找到),以及确切的一项。使用列表推导、枚举和测试,您可以生成匹配条件的索引列表。
  • 不要修改您的问题以获得更多信息,请提出一个单独的问题。随意交叉引用这些问题,以便于查找。 示例:在问题 A 中添加对问题 B 的引用,在问题 B 中添加对问题 A 的引用。

标签: python python-3.x csv


【解决方案1】:

您需要检查每条记录的 ID 以查看是否与您的查询部分匹配。以下解决方案通过使用 startswith 字符串方法来实现这一点。可以实现更智能的部分匹配,但这应该会让您走上正轨。

#! /usr/bin/env python3
import collections
import csv
import itertools

Record = collections.namedtuple('Record', 'id, name, rrc')


def main():
    with open('rttData.csv', newline='') as file:
        records = tuple(itertools.starmap(Record, csv.reader(file)))
    query = input('Enter the ID to search for: ')
    for record in filter(lambda item: item.id.startswith(query), records):
        print(f'ID:   {record.id}\nName: {record.name}\nRRC:  {record.rrc}\n')


if __name__ == '__main__':
    main()

【讨论】:

  • 你好,Noctis,这个功能很好用。它当前显示所有结果。我想知道如何将 RRC 连接相加。例如,如果我输入 25.806,它将汇总所有的 record.rrc。我尝试了各种求和方法,但没有任何效果。非常感谢您提供任何最终帮助。
猜你喜欢
  • 2023-02-08
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2020-04-27
  • 1970-01-01
相关资源
最近更新 更多