Дженкинс: Отчет об экспорте сборки [дубликат]

UPDATE2: более общая векторная функция, которая будет работать для нескольких normal и нескольких столбцов list

def explode(df, lst_cols, fill_value=''):
    # make sure `lst_cols` is a list
    if lst_cols and not isinstance(lst_cols, list):
        lst_cols = [lst_cols]
    # all columns except `lst_cols`
    idx_cols = df.columns.difference(lst_cols)

    # calculate lengths of lists
    lens = df[lst_cols[0]].str.len()

    if (lens > 0).all():
        # ALL lists in cells aren't empty
        return pd.DataFrame({
            col:np.repeat(df[col].values, lens)
            for col in idx_cols
        }).assign(**{col:np.concatenate(df[col].values) for col in lst_cols}) \
          .loc[:, df.columns]
    else:
        # at least one list in cells is empty
        return pd.DataFrame({
            col:np.repeat(df[col].values, lens)
            for col in idx_cols
        }).assign(**{col:np.concatenate(df[col].values) for col in lst_cols}) \
          .append(df.loc[lens==0, idx_cols]).fillna(fill_value) \
          .loc[:, df.columns]

Демо:

Несколько list столбцов - все list столбцы должны иметь одинаковые элементы из каждой строки:

In [36]: df
Out[36]:
   aaa  myid        num          text
0   10     1  [1, 2, 3]  [aa, bb, cc]
1   11     2     [1, 2]      [cc, dd]
2   12     3         []            []
3   13     4         []            []

In [37]: explode(df, ['num','text'], fill_value='')
Out[37]:
   aaa  myid num text
0   10     1   1   aa
1   10     1   2   bb
2   10     1   3   cc
3   11     2   1   cc
4   11     2   2   dd
2   12     3
3   13     4

Настройка:

df = pd.DataFrame({
 'aaa': {0: 10, 1: 11, 2: 12, 3: 13},
 'myid': {0: 1, 1: 2, 2: 3, 3: 4},
 'num': {0: [1, 2, 3], 1: [1, 2], 2: [], 3: []},
 'text': {0: ['aa', 'bb', 'cc'], 1: ['cc', 'dd'], 2: [], 3: []}
})

Столбец CSV:

In [46]: df
Out[46]:
        var1  var2 var3
0      a,b,c     1   XX
1  d,e,f,x,y     2   ZZ

In [47]: explode(df.assign(var1=df.var1.str.split(',')), 'var1')
Out[47]:
  var1  var2 var3
0    a     1   XX
1    b     1   XX
2    c     1   XX
3    d     2   ZZ
4    e     2   ZZ
5    f     2   ZZ
6    x     2   ZZ
7    y     2   ZZ

используя этот небольшой трюк, мы можем преобразовать CSV-подобный столбец в столбец list:

In [48]: df.assign(var1=df.var1.str.split(','))
Out[48]:
              var1  var2 var3
0        [a, b, c]     1   XX
1  [d, e, f, x, y]     2   ZZ

UPDATE: общий векторный подход (будет работать и для нескольких столбцов):

Original DF:

In [177]: df
Out[177]:
        var1  var2 var3
0      a,b,c     1   XX
1  d,e,f,x,y     2   ZZ

Решение:

сначала давайте преобразуем строки CSV в списки:

In [178]: lst_col = 'var1' 

In [179]: x = df.assign(**{lst_col:df[lst_col].str.split(',')})

In [180]: x
Out[180]:
              var1  var2 var3
0        [a, b, c]     1   XX
1  [d, e, f, x, y]     2   ZZ

Теперь мы можем это сделать:

In [181]: pd.DataFrame({
     ...:     col:np.repeat(x[col].values, x[lst_col].str.len())
     ...:     for col in x.columns.difference([lst_col])
     ...: }).assign(**{lst_col:np.concatenate(x[lst_col].values)})[x.columns.tolist()]
     ...:
Out[181]:
  var1  var2 var3
0    a     1   XX
1    b     1   XX
2    c     1   XX
3    d     2   ZZ
4    e     2   ZZ
5    f     2   ZZ
6    x     2   ZZ
7    y     2   ZZ

OLD answer:

Вдохновленный решением @AFinkelstein , я хотел сделать его более обобщенным, что может быть применено к DF с более чем два столбца и так же быстро, но почти так же быстро, как и решение Апинкельштейна):

In [2]: df = pd.DataFrame(
   ...:    [{'var1': 'a,b,c', 'var2': 1, 'var3': 'XX'},
   ...:     {'var1': 'd,e,f,x,y', 'var2': 2, 'var3': 'ZZ'}]
   ...: )

In [3]: df
Out[3]:
        var1  var2 var3
0      a,b,c     1   XX
1  d,e,f,x,y     2   ZZ

In [4]: (df.set_index(df.columns.drop('var1',1).tolist())
   ...:    .var1.str.split(',', expand=True)
   ...:    .stack()
   ...:    .reset_index()
   ...:    .rename(columns={0:'var1'})
   ...:    .loc[:, df.columns]
   ...: )
Out[4]:
  var1  var2 var3
0    a     1   XX
1    b     1   XX
2    c     1   XX
3    d     2   ZZ
4    e     2   ZZ
5    f     2   ZZ
6    x     2   ZZ
7    y     2   ZZ

6
задан dublintech 18 January 2012 в 17:54
поделиться

3 ответа

Следующий код позволяет вам создать файл CSV (с разделителем ';') из удаленного домашнего экземпляра Jenkins. https://github.com/gboissinot/jenkins-csvexporter Он использует пакетную структуру для масштабирования с большим объемом заданий.

Не стесняйтесь планировать эту программу повторно.

0
ответ дан Gregory Boissinot 28 August 2018 в 18:49
поделиться

Теперь, когда Jenkins интегрирует Groovy для сборки Pipeline или просто простые скрипты Groovy, просто написать код Groovy, который использует библиотеки POI Apache, чтобы создать подлинную электронную таблицу Excel с цветами, шрифтами, бликами или тем, что вам нужно.

1
ответ дан Michael Dillon 28 August 2018 в 18:49
поделиться

Существует очень хороший, многофункциональный плагин, который вы можете найти полезным: Глобальный плагин статистики сборки . У него есть функция Сборка поисковой системы , которая даст всю информацию о сборке в таблице.

Второй вариант заключается в создании сценария и использовании его в качестве шагов построить фазу с опцией Выполнить независимо от результата сборки . Скрипт, который может быть любым, может передавать данные после каждой сборки в CSV-файл, а также если вы используете PowerShell - в файл Excel. Черт, если вы используете SDK Google Docs, вы можете легко добавить данные в электронную таблицу GDoc или сделать что-то еще. Здесь нет ограничений.

1
ответ дан Łukasz Rżanek 28 August 2018 в 18:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: