Python CSV от JIRA с дублирующими заголовками Sprint - PullRequest
0 голосов
/ 07 февраля 2020

Я использую python 3.7.5

У меня есть файл CSV, который я получил из экземпляра Jira, чтобы увидеть, какая проблема была решена в каком спринте. Jira отслеживает каждый спринт, в котором возникла проблема, поэтому, если вы экспортируете CSV, вы получите несколько Sprint заголовков с данными примерно такими:

Issue key,Issue Type,Status,Sprint,Sprint,Sprint,Sprint
OLS-526,Story,Done,Sprint #16,Sprint #17,Sprint #18,Sprint #19
OLS-871,Story,Done,Sprint #18,Sprint #28,,
OLS-165,Story,Done,Sprint 1,Sprint 3,Sprint #18,Sprint #19
OLS-868,Story,Done,Sprint #28,,,

Мне нужно определить Спринт Проблема была доставлена, так что справа большинство столбцов Sprint , поэтому я могу подсчитать, сколько проблем фактически было выполнено в каждом спринте.

I Вы пытались использовать python 'csv' по умолчанию и DictReader следующим образом:

import csv
with open('../OLS-tix2.csv', newline='') as csvfile:
  reader = csv.DictReader(csvfile)
  for row in reader:
    print(row['Sprint'])

, но вы получаете только последний Sprint столбец и пробелы, если в этой колонке ничего нет. так как результат вышеупомянутого выглядит следующим образом:

Sprint #19

Sprint #19


Я мог бы просто использовать обычный csv reader и свернуть свой собственный, но я думаю, что в python должен быть более хороший способ сделать это.

1 Ответ

0 голосов
/ 07 февраля 2020

ОК, поэтому я еще немного огляделся и наткнулся на pandas, который, похоже, мог бы стать хорошим инструментом для этой работы. Есть много примеров, и в качестве бонуса я могу делать мерцание / поворот, используя dataframes и pivot_table и агрегирующих подсчетов идентификаторов

Это то, что я закончил работать на меня:

import pandas as pd


csv_file = "../OLS-tix.csv" # where the file is at
ols_df = pd.read_csv(csv_file)
finish_sprint_col = 'finish_sprint' # the column to put the actual Sprint thie issue was finished in
ols_df[finish_sprint_col] = "" # add the new blank column
sprints = ols_df.columns[ols_df.columns.str.contains('Sprint')] # get all the headers that contain the word sprint as they will be Sprint, Sprint.1 ... Sprint.N
for i,row in ols_df.iterrows():
  if not ols_df.at[i,"Status"] == "Done": # we only want to do this for "Done" Issues
    continue
  finish_sprint = False
  for header in sprints: # go through all the sprint cells for this row and get the last not empty one.
    if not pd.isnull(ols_df.loc[i, header]):
      finish_sprint = ols_df.loc[i, header]
  if finish_sprint:
    ols_df.at[i,finish_sprint_col] = finish_sprint

# get number of issue finished per sprint.
dones = ols_df[(ols_df.Status == "Done") & (ols_df['Issue Type'] == "Story") ].pivot_table(index=["finish_sprint"],values=["Issue key"], aggfunc=[pd.Series.nunique])

Это, вероятно, более простой способ сделать это, но, похоже, сейчас это работает ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...