Разбор большого файла Excel и запись результатов обратно в текстовый файл с разделителями - PullRequest
0 голосов
/ 14 июня 2019

Примечание : Поскольку спрашивать как мне? вопросы по проверке кода не по теме, я попробую здесь.

Я работаю ИТ-стажером в многонациональной компании, и передо мной стояла утомительная задача - объединить многоколонный файл отчетов Excel длиной более 2500+ в поисках неактивных серверов.

Вот пример строки из этого файла:

enter image description here

Затем я получил другой файл Excel, но на этот раз только с кодами БД (из них более 80).

Моя задача была:

  • Просмотрите большой файл отчета
  • Найти компанию по коду БД
  • Проверьте, является ли сервер активным или не активным, и, если он не активен, отметьте его для вывода из эксплуатации

Конечно, как и следовало ожидать, мне сказали вернуть результаты в электронной таблице в следующем формате:

Full name: Acme Inc. | Code: ACM | Active?: no | Decomm?: yes

Fulln name:, Code:, etc. - заголовки столбцов. Здесь они только для удобства чтения.

Если бы я делал это вручную, я бы, скорее всего, умер от скуки. Но! Есть Python, верно?

Итак, я экспортировал некоторые столбцы из отчета в файл с разделителями табуляции и написал его так:

def read_file_to_list(file_name):
    with open(file_name, 'r') as file_handler:
        stuff = file_handler.readlines()
    return [line[:-1] for line in stuff]


def make_dic(file_name):
    with open(file_name, 'r') as f:
        rows = (line.replace('"', "").strip().split("\t") for line in f)
        return {row[0]:row[1:] for row in rows}


def search(dic, ou_codes):
    c = 1
    for k, v in dic.items():
        for code in ou_codes:
            if v[0] == code:
                print("{}. Full name: {} | Code: {} | Active?: {} | Decomm?: {}".format(c, k, *v, "yes" if v[1] == "no" else "no"))
                c += 1


decomm_codes = read_file_to_list('decomm_codes.txt')
all_of_it = make_dic('big_report.txt')

search(all_of_it, decomm_codes)

Это выплевывает:

1. Full name: Random, Inc | Code: RNDM | Active?: yes | Decomm?: no
2. Full name: Acme Inc.| Code: ACM | Active?: no | Decomm?: yes
3. Full name: Fake Bank, Ltd.  | Code: FKBNK | Active?: yes | Decomm?: no

Вопрос:

В моем окне терминала все выглядит хорошо, но как мне записать результаты обратно в текстовый файл с разделителями табуляции? Так это выглядит так:

Acme Inc. ACM no yes

Кроме того, просто из любопытства, есть ли способ рефакторинга метода search, например в одну строку? Понимание вложенного списка по-прежнему в моем списке TO-LEARN (каламбур).

Наконец, вот содержимое файлов decomm_codes.txt и big_report.txt.

decomm_codes.txt:

RNDM
ACM
FKBNK

big_report.txt:

"Random, Inc"   RNDM    yes
Acme Inc.   ACM no
"Fake Bank, Ltd. "  FKBNK   yes

1 Ответ

1 голос
/ 14 июня 2019

Вы также можете написать в файл:

def search(dic, ou_codes):
    c = 1
    # open a file to write to
    with open ("output.tsv","w") as outfile:
        outfile.write( "#\tFull name\tCode\tActive\tDecomm\n")
        for k, v in dic.items():
            for code in ou_codes:
                if v[0] == code:
                    # create output line
                    outputline = "{}\t{}\t{}\t{}\t{}\n".format(
                                 c, k, *v, "yes" if v[1] == "no" else "no")
                    c += 1
                    outfile.write(outputline)
                    print("{}. Full name: {} | Code: {} | Active?: {} | Decomm?: {}".format(
                          c, k, *v, "yes" if v[1] == "no" else "no")) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...